From 905ebac268e72795dd86fea7b41eccf8ffc7ba8b Mon Sep 17 00:00:00 2001 From: andrew morton Date: Mon, 31 Mar 2014 20:16:44 -0700 Subject: [PATCH 001/180] Bump the buffer size and change number of channels I ran into: ``` Uncaught IndexSizeError: Failed to execute 'createJavaScriptNode' on 'AudioContext': buffer size (128) must be a power of two between 256 and 16384. ``` When I bumped that up I ran into: ``` Uncaught IndexSizeError: Failed to execute 'getChannelData' on 'AudioBuffer': channel index (1) exceeds number of channels (1) ``` It seems like we need two output channels and no inputs. --- www/tone/js/sinewave.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/tone/js/sinewave.js b/www/tone/js/sinewave.js index b234416..9705ec6 100644 --- a/www/tone/js/sinewave.js +++ b/www/tone/js/sinewave.js @@ -17,7 +17,7 @@ SineWave = function(context) { this.nr = true; // noise reduction // Create an audio node for the tone generator - this.node = context.createJavaScriptNode(128, 1, 1); + this.node = context.createJavaScriptNode(256, 0, 2); // Setup audio data callback for this node. The callback is called // when the node is connected and expects a buffer full of audio data From ce34e7dd81a4a162d1979783ebde3b1080f5fd6c Mon Sep 17 00:00:00 2001 From: Gabor Heja Date: Mon, 4 Aug 2014 02:41:30 +0200 Subject: [PATCH 002/180] Bumped buffer size again - with 256 the sound was extremely choppy, with 2048 the delay is still unnoticable but the sine is continuous --- www/tone/js/sinewave.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/tone/js/sinewave.js b/www/tone/js/sinewave.js index 9705ec6..0f06af2 100644 --- a/www/tone/js/sinewave.js +++ b/www/tone/js/sinewave.js @@ -17,7 +17,7 @@ SineWave = function(context) { this.nr = true; // noise reduction // Create an audio node for the tone generator - this.node = context.createJavaScriptNode(256, 0, 2); + this.node = context.createJavaScriptNode(2048, 0, 2); // Setup audio data callback for this node. The callback is called // when the node is connected and expects a buffer full of audio data From b2ed51f3f4a95527a2b10d7fbcadb36f959ed8ed Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sat, 13 Sep 2014 13:02:42 -0400 Subject: [PATCH 003/180] Toy Arduino project. --- arduino/Siren/Siren.ino | 62 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 arduino/Siren/Siren.ino diff --git a/arduino/Siren/Siren.ino b/arduino/Siren/Siren.ino new file mode 100644 index 0000000..c7bfc2a --- /dev/null +++ b/arduino/Siren/Siren.ino @@ -0,0 +1,62 @@ +/* + Sirens for Arkin. +*/ + +int current = 3; +int dir = 0; + + +const float baseTemp = 20.0; + +void setup() { + for (int pin=2; pin <= 5; ++pin) { + pinMode(pin, OUTPUT); + } + + // For the serial console. Used to send debug + // messages. + Serial.begin(9600); +} + +void switchOffLEDs() { + digitalWrite(3, LOW); + digitalWrite(4, LOW); + digitalWrite(5, LOW); +} + +void blinkNextLED() { + digitalWrite(current, HIGH); + if (dir == 0) { + if (++current == 5) dir = 1; + } else { + if (--current == 3) dir = 0; + } + delay(150); + switchOffLEDs(); +} + +float getTemperature() { + const int sensorPin = A0; + + float voltage = (analogRead(sensorPin) / 1024.0) * 5.0; + float temp = (voltage- .5) * 100; + + Serial.print("Voltage: "); + Serial.print(voltage); + Serial.print(", Temperature: "); + Serial.println(temp); + + return temp; +} + +void loop() { + // Click "Serial Monitor" on top right of IDE to + // see logs. + float temp = getTemperature(); + + if (temp >= 24) { + blinkNextLED(); + } else { + switchOffLEDs(); + } +} From c203206a4e31f9dc6a25ae33e9e1f948b4f9e00e Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Mon, 6 Oct 2014 20:24:29 -0400 Subject: [PATCH 004/180] Added mjk. --- arduino/Siren/Siren.ino | 29 +- www/mjk/animations.css | 1126 +++++++++++++++++++++++++++++++++++++++ www/mjk/index.html | 14 + www/mjk/mjk.jpg | Bin 0 -> 53522 bytes 4 files changed, 1162 insertions(+), 7 deletions(-) create mode 100644 www/mjk/animations.css create mode 100644 www/mjk/index.html create mode 100644 www/mjk/mjk.jpg diff --git a/arduino/Siren/Siren.ino b/arduino/Siren/Siren.ino index c7bfc2a..27be398 100644 --- a/arduino/Siren/Siren.ino +++ b/arduino/Siren/Siren.ino @@ -24,14 +24,22 @@ void switchOffLEDs() { digitalWrite(5, LOW); } -void blinkNextLED() { +void fadeLED(int val) { + analogWrite(9, val); + analogWrite(10, 100 - val); + analogWrite(11, (50 + val) % 100); + Serial.print("Fade: "); + Serial.println(val); +} + +void blinkNextLED(int delayLength = 150) { digitalWrite(current, HIGH); if (dir == 0) { if (++current == 5) dir = 1; } else { if (--current == 3) dir = 0; } - delay(150); + delay(delayLength); switchOffLEDs(); } @@ -53,10 +61,17 @@ void loop() { // Click "Serial Monitor" on top right of IDE to // see logs. float temp = getTemperature(); + float range = (25 - temp) / 4; - if (temp >= 24) { - blinkNextLED(); - } else { - switchOffLEDs(); - } + if (range < 0 || range > 1) { + Serial.print("Exception temperature: "); + Serial.println(temp); + return; + } + + float delayLength = 100 + (range * 150); + blinkNextLED(delayLength); + + float voltage = (analogRead(sensorPin) / 1024.0) * 5.0; + fadeLED(range * 100); } diff --git a/www/mjk/animations.css b/www/mjk/animations.css new file mode 100644 index 0000000..c704ce9 --- /dev/null +++ b/www/mjk/animations.css @@ -0,0 +1,1126 @@ +/* +============================================== +CSS3 ANIMATION CHEAT SHEET +============================================== + +Made by Justin Aguilar + +www.justinaguilar.com/animations/ + +Questions, comments, concerns, love letters: +justin@justinaguilar.com +============================================== +*/ + +/* +============================================== +slideDown +============================================== +*/ + + +.slideDown{ + animation-name: slideDown; + -webkit-animation-name: slideDown; + + animation-duration: 1s; + -webkit-animation-duration: 1s; + + animation-timing-function: ease; + -webkit-animation-timing-function: ease; + + visibility: visible !important; +} + +@keyframes slideDown { + 0% { + transform: translateY(-100%); + } + 50%{ + transform: translateY(8%); + } + 65%{ + transform: translateY(-4%); + } + 80%{ + transform: translateY(4%); + } + 95%{ + transform: translateY(-2%); + } + 100% { + transform: translateY(0%); + } +} + +@-webkit-keyframes slideDown { + 0% { + -webkit-transform: translateY(-100%); + } + 50%{ + -webkit-transform: translateY(8%); + } + 65%{ + -webkit-transform: translateY(-4%); + } + 80%{ + -webkit-transform: translateY(4%); + } + 95%{ + -webkit-transform: translateY(-2%); + } + 100% { + -webkit-transform: translateY(0%); + } +} + +/* +============================================== +slideUp +============================================== +*/ + + +.slideUp{ + animation-name: slideUp; + -webkit-animation-name: slideUp; + + animation-duration: 1s; + -webkit-animation-duration: 1s; + + animation-timing-function: ease; + -webkit-animation-timing-function: ease; + + visibility: visible !important; +} + +@keyframes slideUp { + 0% { + transform: translateY(100%); + } + 50%{ + transform: translateY(-8%); + } + 65%{ + transform: translateY(4%); + } + 80%{ + transform: translateY(-4%); + } + 95%{ + transform: translateY(2%); + } + 100% { + transform: translateY(0%); + } +} + +@-webkit-keyframes slideUp { + 0% { + -webkit-transform: translateY(100%); + } + 50%{ + -webkit-transform: translateY(-8%); + } + 65%{ + -webkit-transform: translateY(4%); + } + 80%{ + -webkit-transform: translateY(-4%); + } + 95%{ + -webkit-transform: translateY(2%); + } + 100% { + -webkit-transform: translateY(0%); + } +} + +/* +============================================== +slideLeft +============================================== +*/ + + +.slideLeft{ + animation-name: slideLeft; + -webkit-animation-name: slideLeft; + + animation-duration: 1s; + -webkit-animation-duration: 1s; + + animation-timing-function: ease-in-out; + -webkit-animation-timing-function: ease-in-out; + + visibility: visible !important; +} + +@keyframes slideLeft { + 0% { + transform: translateX(150%); + } + 50%{ + transform: translateX(-8%); + } + 65%{ + transform: translateX(4%); + } + 80%{ + transform: translateX(-4%); + } + 95%{ + transform: translateX(2%); + } + 100% { + transform: translateX(0%); + } +} + +@-webkit-keyframes slideLeft { + 0% { + -webkit-transform: translateX(150%); + } + 50%{ + -webkit-transform: translateX(-8%); + } + 65%{ + -webkit-transform: translateX(4%); + } + 80%{ + -webkit-transform: translateX(-4%); + } + 95%{ + -webkit-transform: translateX(2%); + } + 100% { + -webkit-transform: translateX(0%); + } +} + +/* +============================================== +slideRight +============================================== +*/ + + +.slideRight{ + animation-name: slideRight; + -webkit-animation-name: slideRight; + + animation-duration: 1s; + -webkit-animation-duration: 1s; + + animation-timing-function: ease-in-out; + -webkit-animation-timing-function: ease-in-out; + + visibility: visible !important; +} + +@keyframes slideRight { + 0% { + transform: translateX(-150%); + } + 50%{ + transform: translateX(8%); + } + 65%{ + transform: translateX(-4%); + } + 80%{ + transform: translateX(4%); + } + 95%{ + transform: translateX(-2%); + } + 100% { + transform: translateX(0%); + } +} + +@-webkit-keyframes slideRight { + 0% { + -webkit-transform: translateX(-150%); + } + 50%{ + -webkit-transform: translateX(8%); + } + 65%{ + -webkit-transform: translateX(-4%); + } + 80%{ + -webkit-transform: translateX(4%); + } + 95%{ + -webkit-transform: translateX(-2%); + } + 100% { + -webkit-transform: translateX(0%); + } +} + +/* +============================================== +slideExpandUp +============================================== +*/ + + +.slideExpandUp{ + animation-name: slideExpandUp; + -webkit-animation-name: slideExpandUp; + + animation-duration: 1.6s; + -webkit-animation-duration: 1.6s; + + animation-timing-function: ease-out; + -webkit-animation-timing-function: ease -out; + + visibility: visible !important; +} + +@keyframes slideExpandUp { + 0% { + transform: translateY(100%) scaleX(0.5); + } + 30%{ + transform: translateY(-8%) scaleX(0.5); + } + 40%{ + transform: translateY(2%) scaleX(0.5); + } + 50%{ + transform: translateY(0%) scaleX(1.1); + } + 60%{ + transform: translateY(0%) scaleX(0.9); + } + 70% { + transform: translateY(0%) scaleX(1.05); + } + 80%{ + transform: translateY(0%) scaleX(0.95); + } + 90% { + transform: translateY(0%) scaleX(1.02); + } + 100%{ + transform: translateY(0%) scaleX(1); + } +} + +@-webkit-keyframes slideExpandUp { + 0% { + -webkit-transform: translateY(100%) scaleX(0.5); + } + 30%{ + -webkit-transform: translateY(-8%) scaleX(0.5); + } + 40%{ + -webkit-transform: translateY(2%) scaleX(0.5); + } + 50%{ + -webkit-transform: translateY(0%) scaleX(1.1); + } + 60%{ + -webkit-transform: translateY(0%) scaleX(0.9); + } + 70% { + -webkit-transform: translateY(0%) scaleX(1.05); + } + 80%{ + -webkit-transform: translateY(0%) scaleX(0.95); + } + 90% { + -webkit-transform: translateY(0%) scaleX(1.02); + } + 100%{ + -webkit-transform: translateY(0%) scaleX(1); + } +} + +/* +============================================== +expandUp +============================================== +*/ + + +.expandUp{ + animation-name: expandUp; + -webkit-animation-name: expandUp; + + animation-duration: 0.7s; + -webkit-animation-duration: 0.7s; + + animation-timing-function: ease; + -webkit-animation-timing-function: ease; + + visibility: visible !important; +} + +@keyframes expandUp { + 0% { + transform: translateY(100%) scale(0.6) scaleY(0.5); + } + 60%{ + transform: translateY(-7%) scaleY(1.12); + } + 75%{ + transform: translateY(3%); + } + 100% { + transform: translateY(0%) scale(1) scaleY(1); + } +} + +@-webkit-keyframes expandUp { + 0% { + -webkit-transform: translateY(100%) scale(0.6) scaleY(0.5); + } + 60%{ + -webkit-transform: translateY(-7%) scaleY(1.12); + } + 75%{ + -webkit-transform: translateY(3%); + } + 100% { + -webkit-transform: translateY(0%) scale(1) scaleY(1); + } +} + +/* +============================================== +fadeIn +============================================== +*/ + +.fadeIn{ + animation-name: fadeIn; + -webkit-animation-name: fadeIn; + + animation-duration: 1.5s; + -webkit-animation-duration: 1.5s; + + animation-timing-function: ease-in-out; + -webkit-animation-timing-function: ease-in-out; + + visibility: visible !important; +} + +@keyframes fadeIn { + 0% { + transform: scale(0); + opacity: 0.0; + } + 60% { + transform: scale(1.1); + } + 80% { + transform: scale(0.9); + opacity: 1; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +@-webkit-keyframes fadeIn { + 0% { + -webkit-transform: scale(0); + opacity: 0.0; + } + 60% { + -webkit-transform: scale(1.1); + } + 80% { + -webkit-transform: scale(0.9); + opacity: 1; + } + 100% { + -webkit-transform: scale(1); + opacity: 1; + } +} + +/* +============================================== +expandOpen +============================================== +*/ + + +.expandOpen{ + animation-name: expandOpen; + -webkit-animation-name: expandOpen; + + animation-duration: 1.2s; + -webkit-animation-duration: 1.2s; + + animation-timing-function: ease-out; + -webkit-animation-timing-function: ease-out; + + visibility: visible !important; +} + +@keyframes expandOpen { + 0% { + transform: scale(1.8); + } + 50% { + transform: scale(0.95); + } + 80% { + transform: scale(1.05); + } + 90% { + transform: scale(0.98); + } + 100% { + transform: scale(1); + } +} + +@-webkit-keyframes expandOpen { + 0% { + -webkit-transform: scale(1.8); + } + 50% { + -webkit-transform: scale(0.95); + } + 80% { + -webkit-transform: scale(1.05); + } + 90% { + -webkit-transform: scale(0.98); + } + 100% { + -webkit-transform: scale(1); + } +} + +/* +============================================== +bigEntrance +============================================== +*/ + + +.bigEntrance{ + animation-name: bigEntrance; + -webkit-animation-name: bigEntrance; + + animation-duration: 1.6s; + -webkit-animation-duration: 1.6s; + + animation-timing-function: ease-out; + -webkit-animation-timing-function: ease-out; + + visibility: visible !important; +} + +@keyframes bigEntrance { + 0% { + transform: scale(0.3) rotate(6deg) translateX(-30%) translateY(30%); + opacity: 0.2; + } + 30% { + transform: scale(1.03) rotate(-2deg) translateX(2%) translateY(-2%); + opacity: 1; + } + 45% { + transform: scale(0.98) rotate(1deg) translateX(0%) translateY(0%); + opacity: 1; + } + 60% { + transform: scale(1.01) rotate(-1deg) translateX(0%) translateY(0%); + opacity: 1; + } + 75% { + transform: scale(0.99) rotate(1deg) translateX(0%) translateY(0%); + opacity: 1; + } + 90% { + transform: scale(1.01) rotate(0deg) translateX(0%) translateY(0%); + opacity: 1; + } + 100% { + transform: scale(1) rotate(0deg) translateX(0%) translateY(0%); + opacity: 1; + } +} + +@-webkit-keyframes bigEntrance { + 0% { + -webkit-transform: scale(0.3) rotate(6deg) translateX(-30%) translateY(30%); + opacity: 0.2; + } + 30% { + -webkit-transform: scale(1.03) rotate(-2deg) translateX(2%) translateY(-2%); + opacity: 1; + } + 45% { + -webkit-transform: scale(0.98) rotate(1deg) translateX(0%) translateY(0%); + opacity: 1; + } + 60% { + -webkit-transform: scale(1.01) rotate(-1deg) translateX(0%) translateY(0%); + opacity: 1; + } + 75% { + -webkit-transform: scale(0.99) rotate(1deg) translateX(0%) translateY(0%); + opacity: 1; + } + 90% { + -webkit-transform: scale(1.01) rotate(0deg) translateX(0%) translateY(0%); + opacity: 1; + } + 100% { + -webkit-transform: scale(1) rotate(0deg) translateX(0%) translateY(0%); + opacity: 1; + } +} + +/* +============================================== +hatch +============================================== +*/ + +.hatch{ + animation-name: hatch; + -webkit-animation-name: hatch; + + animation-duration: 2s; + -webkit-animation-duration: 2s; + + animation-timing-function: ease-in-out; + -webkit-animation-timing-function: ease-in-out; + + transform-origin: 50% 100%; + -ms-transform-origin: 50% 100%; + -webkit-transform-origin: 50% 100%; + + visibility: visible !important; +} + +@keyframes hatch { + 0% { + transform: rotate(0deg) scaleY(0.6); + } + 20% { + transform: rotate(-2deg) scaleY(1.05); + } + 35% { + transform: rotate(2deg) scaleY(1); + } + 50% { + transform: rotate(-2deg); + } + 65% { + transform: rotate(1deg); + } + 80% { + transform: rotate(-1deg); + } + 100% { + transform: rotate(0deg); + } +} + +@-webkit-keyframes hatch { + 0% { + -webkit-transform: rotate(0deg) scaleY(0.6); + } + 20% { + -webkit-transform: rotate(-2deg) scaleY(1.05); + } + 35% { + -webkit-transform: rotate(2deg) scaleY(1); + } + 50% { + -webkit-transform: rotate(-2deg); + } + 65% { + -webkit-transform: rotate(1deg); + } + 80% { + -webkit-transform: rotate(-1deg); + } + 100% { + -webkit-transform: rotate(0deg); + } +} + + +/* +============================================== +bounce +============================================== +*/ + + +.bounce{ + animation-name: bounce; + -webkit-animation-name: bounce; + + animation-duration: 1.6s; + -webkit-animation-duration: 1.6s; + + animation-timing-function: ease; + -webkit-animation-timing-function: ease; + + transform-origin: 50% 100%; + -ms-transform-origin: 50% 100%; + -webkit-transform-origin: 50% 100%; +} + +@keyframes bounce { + 0% { + transform: translateY(0%) scaleY(0.6); + } + 60%{ + transform: translateY(-100%) scaleY(1.1); + } + 70%{ + transform: translateY(0%) scaleY(0.95) scaleX(1.05); + } + 80%{ + transform: translateY(0%) scaleY(1.05) scaleX(1); + } + 90%{ + transform: translateY(0%) scaleY(0.95) scaleX(1); + } + 100%{ + transform: translateY(0%) scaleY(1) scaleX(1); + } +} + +@-webkit-keyframes bounce { + 0% { + -webkit-transform: translateY(0%) scaleY(0.6); + } + 60%{ + -webkit-transform: translateY(-100%) scaleY(1.1); + } + 70%{ + -webkit-transform: translateY(0%) scaleY(0.95) scaleX(1.05); + } + 80%{ + -webkit-transform: translateY(0%) scaleY(1.05) scaleX(1); + } + 90%{ + -webkit-transform: translateY(0%) scaleY(0.95) scaleX(1); + } + 100%{ + -webkit-transform: translateY(0%) scaleY(1) scaleX(1); + } +} + + +/* +============================================== +pulse +============================================== +*/ + +.pulse{ + animation-name: pulse; + -webkit-animation-name: pulse; + + animation-duration: 1.5s; + -webkit-animation-duration: 1.5s; + + animation-iteration-count: infinite; + -webkit-animation-iteration-count: infinite; +} + +@keyframes pulse { + 0% { + transform: scale(0.9); + opacity: 0.7; + } + 50% { + transform: scale(1); + opacity: 1; + } + 100% { + transform: scale(0.9); + opacity: 0.7; + } +} + +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(0.95); + opacity: 0.7; + } + 50% { + -webkit-transform: scale(1); + opacity: 1; + } + 100% { + -webkit-transform: scale(0.95); + opacity: 0.7; + } +} + +/* +============================================== +floating +============================================== +*/ + +.floating{ + animation-name: floating; + -webkit-animation-name: floating; + + animation-duration: 1.5s; + -webkit-animation-duration: 1.5s; + + animation-iteration-count: infinite; + -webkit-animation-iteration-count: infinite; +} + +@keyframes floating { + 0% { + transform: translateY(0%); + } + 50% { + transform: translateY(8%); + } + 100% { + transform: translateY(0%); + } +} + +@-webkit-keyframes floating { + 0% { + -webkit-transform: translateY(0%); + } + 50% { + -webkit-transform: translateY(8%); + } + 100% { + -webkit-transform: translateY(0%); + } +} + +/* +============================================== +tossing +============================================== +*/ + +.tossing{ + animation-name: tossing; + -webkit-animation-name: tossing; + + animation-duration: 2.5s; + -webkit-animation-duration: 2.5s; + + animation-iteration-count: infinite; + -webkit-animation-iteration-count: infinite; +} + +@keyframes tossing { + 0% { + transform: rotate(-4deg); + } + 50% { + transform: rotate(4deg); + } + 100% { + transform: rotate(-4deg); + } +} + +@-webkit-keyframes tossing { + 0% { + -webkit-transform: rotate(-4deg); + } + 50% { + -webkit-transform: rotate(4deg); + } + 100% { + -webkit-transform: rotate(-4deg); + } +} + +/* +============================================== +pullUp +============================================== +*/ + +.pullUp{ + animation-name: pullUp; + -webkit-animation-name: pullUp; + + animation-duration: 1.1s; + -webkit-animation-duration: 1.1s; + + animation-timing-function: ease-out; + -webkit-animation-timing-function: ease-out; + + transform-origin: 50% 100%; + -ms-transform-origin: 50% 100%; + -webkit-transform-origin: 50% 100%; +} + +@keyframes pullUp { + 0% { + transform: scaleY(0.1); + } + 40% { + transform: scaleY(1.02); + } + 60% { + transform: scaleY(0.98); + } + 80% { + transform: scaleY(1.01); + } + 100% { + transform: scaleY(0.98); + } + 80% { + transform: scaleY(1.01); + } + 100% { + transform: scaleY(1); + } +} + +@-webkit-keyframes pullUp { + 0% { + -webkit-transform: scaleY(0.1); + } + 40% { + -webkit-transform: scaleY(1.02); + } + 60% { + -webkit-transform: scaleY(0.98); + } + 80% { + -webkit-transform: scaleY(1.01); + } + 100% { + -webkit-transform: scaleY(0.98); + } + 80% { + -webkit-transform: scaleY(1.01); + } + 100% { + -webkit-transform: scaleY(1); + } +} + +/* +============================================== +pullDown +============================================== +*/ + +.pullDown{ + animation-name: pullDown; + -webkit-animation-name: pullDown; + + animation-duration: 1.1s; + -webkit-animation-duration: 1.1s; + + animation-timing-function: ease-out; + -webkit-animation-timing-function: ease-out; + + transform-origin: 50% 0%; + -ms-transform-origin: 50% 0%; + -webkit-transform-origin: 50% 0%; +} + +@keyframes pullDown { + 0% { + transform: scaleY(0.1); + } + 40% { + transform: scaleY(1.02); + } + 60% { + transform: scaleY(0.98); + } + 80% { + transform: scaleY(1.01); + } + 100% { + transform: scaleY(0.98); + } + 80% { + transform: scaleY(1.01); + } + 100% { + transform: scaleY(1); + } +} + +@-webkit-keyframes pullDown { + 0% { + -webkit-transform: scaleY(0.1); + } + 40% { + -webkit-transform: scaleY(1.02); + } + 60% { + -webkit-transform: scaleY(0.98); + } + 80% { + -webkit-transform: scaleY(1.01); + } + 100% { + -webkit-transform: scaleY(0.98); + } + 80% { + -webkit-transform: scaleY(1.01); + } + 100% { + -webkit-transform: scaleY(1); + } +} + +/* +============================================== +stretchLeft +============================================== +*/ + +.stretchLeft{ + animation-name: stretchLeft; + -webkit-animation-name: stretchLeft; + + animation-duration: 1.5s; + -webkit-animation-duration: 1.5s; + + animation-timing-function: ease-out; + -webkit-animation-timing-function: ease-out; + + transform-origin: 100% 0%; + -ms-transform-origin: 100% 0%; + -webkit-transform-origin: 100% 0%; +} + +@keyframes stretchLeft { + 0% { + transform: scaleX(0.3); + } + 40% { + transform: scaleX(1.02); + } + 60% { + transform: scaleX(0.98); + } + 80% { + transform: scaleX(1.01); + } + 100% { + transform: scaleX(0.98); + } + 80% { + transform: scaleX(1.01); + } + 100% { + transform: scaleX(1); + } +} + +@-webkit-keyframes stretchLeft { + 0% { + -webkit-transform: scaleX(0.3); + } + 40% { + -webkit-transform: scaleX(1.02); + } + 60% { + -webkit-transform: scaleX(0.98); + } + 80% { + -webkit-transform: scaleX(1.01); + } + 100% { + -webkit-transform: scaleX(0.98); + } + 80% { + -webkit-transform: scaleX(1.01); + } + 100% { + -webkit-transform: scaleX(1); + } +} + +/* +============================================== +stretchRight +============================================== +*/ + +.stretchRight{ + animation-name: stretchRight; + -webkit-animation-name: stretchRight; + + animation-duration: 1.5s; + -webkit-animation-duration: 1.5s; + + animation-timing-function: ease-out; + -webkit-animation-timing-function: ease-out; + + transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + -webkit-transform-origin: 0% 0%; +} + +@keyframes stretchRight { + 0% { + transform: scaleX(0.3); + } + 40% { + transform: scaleX(1.02); + } + 60% { + transform: scaleX(0.98); + } + 80% { + transform: scaleX(1.01); + } + 100% { + transform: scaleX(0.98); + } + 80% { + transform: scaleX(1.01); + } + 100% { + transform: scaleX(1); + } +} + +@-webkit-keyframes stretchRight { + 0% { + -webkit-transform: scaleX(0.3); + } + 40% { + -webkit-transform: scaleX(1.02); + } + 60% { + -webkit-transform: scaleX(0.98); + } + 80% { + -webkit-transform: scaleX(1.01); + } + 100% { + -webkit-transform: scaleX(0.98); + } + 80% { + -webkit-transform: scaleX(1.01); + } + 100% { + -webkit-transform: scaleX(1); + } +} diff --git a/www/mjk/index.html b/www/mjk/index.html new file mode 100644 index 0000000..b35d10d --- /dev/null +++ b/www/mjk/index.html @@ -0,0 +1,14 @@ + + + + + + +
+
+ +
+
+ + + diff --git a/www/mjk/mjk.jpg b/www/mjk/mjk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31101f9591733a339b3435186c308e8eb65bdf54 GIT binary patch literal 53522 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

$RGb3bZnIBX|%bkWMZj+26dL!hK@8MH{x2 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

I680?C7Mw7^K@h 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 Date: Mon, 6 Oct 2014 20:27:17 -0400 Subject: [PATCH 005/180] Updated refresher. --- www/rubyrefresher/index.html | 487 ++++++++++++++++++++++---------- www/rubyrefresher/refresher.css | 35 ++- 2 files changed, 363 insertions(+), 159 deletions(-) diff --git a/www/rubyrefresher/index.html b/www/rubyrefresher/index.html index 5726645..f455568 100644 --- a/www/rubyrefresher/index.html +++ b/www/rubyrefresher/index.html @@ -1,15 +1,27 @@ -

- -

The Ruby Refresher

+ + + + The Ruby Refresher + + + + + + +
+
+

The Ruby Refresher

Preface

-

This document aims to refresh one's memory of Ruby syntax, semantics, common +

This document aims to refresh one's memory of Ruby syntax, semantics, common operations, and standard libraries as quickly and efficiently as possible. The reader is expected to have some past experience with the Ruby language.

Newcomers to Ruby should read some of the -beginner's documentation before +beginner's documentation before working through this refresher.

Instructions

@@ -19,9 +31,8 @@

Instructions

  1. Read each line and try to evaluate it in your head.
  2. -
  3. If you can't figure it out, execute it in irb.
  4. -
  5. Think (for just a few seconds) about what makes it different from the -previous lines.
  6. +
  7. If you can't figure it out, execute it in irb.
  8. +
  9. Think (for just a few seconds) about how it differs from the previous lines.
  10. If you get confused at any point, look up the relevant documentation at Ruby-Doc.org.
@@ -29,7 +40,7 @@

Instructions

Basics

a = 1
-b = "boo"
+b = "boo"
 d = 8
 Constant_begins_with_caps = 20
 ANOTHER_CONSTANT = 20
@@ -37,67 +48,84 @@ 

Basics

# This is a comment -madman = "I have #{a + d} baboons" -madman2 = "I also have %s baboons" % [a + d] +madman = "I have #{a + d} baboons" +madman2 = "I also have %s baboons" % [a + d] + +puts "This string is printed with a newline" +print "This string is printed without a newline" + +triple_x = "X" * 3 + +print 'This string begins with a single quote.' +puts 'In Ruby, the string "b = #{b}" evaluates to "b = boo"' -puts "This string is printed with a newline" -print "This string is printed without a newline" +valueless = nil +valueless.nil? -triple_x = "X" * 3 +truthiness = true +falsiness = false -print 'This string beings with a single quote.' -puts 'In Ruby, the string "b = #{b}" evaluates to "b = boo"' +puts(truthiness == falsiness)

Arrays

primes = [2, 3, 5, 7]
-people = ["Bob", "Alice", "Eve"]
+people = ["Bob", "Alice", "Eve"]
 
-puts "The first prime is " << primes[0]
-puts "The last person is " << people[-1]
+puts "The first prime is " << primes[0].to_s
+puts "The last person is " << people[-1]
 
-puts "The first person is " << people.first
-puts "The last prime is " << primes.last
+puts "The first person is " << people.first
+puts "The last prime is " << primes.last
 primes.pop
-puts "The last prime is now " << primes.last
+puts "The last prime is now " << primes.last
 primes.push 7
-puts "The last prime is #{primes.last} again"
+puts "The last prime is #{primes.last} again"
 primes << 11
-puts "The last prime is now #{primes.last}"
+puts "The last prime is now #{primes.last}"
 
-puts "There are #{ people.size } people"
+puts "There are #{ people.size } people"
 people.shift
-puts "There are now #{ people.length } people"
-people.unshift "Bob"
-puts "#{people.first}'s back!"
+puts "There are now #{ people.length } people"
+people.unshift "Bob"
+puts "#{people.first}'s back!"
 
 sorted_people = people.sort
-puts "#{people.first} is still Bob"
-puts "#{sorted_people.first} is not Bob"
+puts "#{people.first} is still Bob"
+puts "#{sorted_people.first} is not Bob"
 people.sort!
-puts "#{people.first} is not Bob"
+puts "#{people.first} is not Bob"
 
-puts primes[0..3]     # => [2, 3, 5]
+puts primes[0...3]    # => [2, 3, 5]
 puts primes[0,3]      # => [2, 3, 5]
+puts primes.first(3)  # => [2, 3, 5]
 
 people.each { |person| puts person }
 people.each do |person|
   puts person
 end
+puts people
+
+people.select { |person| person =~ /^B/ }     # => ["Bob"]
+people.grep(/^B/)                             # => ["Bob"]
+
+special_folks = ["Alice", "Bob"]
+not_so_special_folks = people - special_folks
 
-b_people.select { |person| person =~ /^B/ }     # => ["Bob"]
 sum_of_primes = primes.inject { |sum, x| sum + x }
+sum_of_primes = primes.inject(:+)
 
-sentence = "I am your father"
-words = sentence.split(" ")       # => ["I", "am", "your", "father"]
-tweet = "I can't find my father"
+sentence = "I am your father"
+words = sentence.split(" ")       # => ["I", "am", "your", "father"]
+tweet = "I can't find my father"
 relevant = words.any? { |word| tweet.include?(word) }
 
-reconstructed_sentence = words.join(" ")
+reconstructed_sentence = words.join(" ")
 
-[1, 4, 8, 3, 54, 34].select { |n| n > 30 }      # returns one array
-[1, 4, 8, 3, 54, 34].partition { |n| n > 30 }   # returns array of arrays
+[1, 4, 8, 3, 54, 34].select { |n| n > 30 }      # => [54, 34]
+[1, 4, 8, 3, 54, 34].reject { |n| n > 30 }      # => [1, 4, 8, 3]
+[1, 4, 8, 3, 54, 34].partition { |n| n > 30 }   # => [[54, 34], [1, 4, 8, 3]]
 [1, 3, 5].map { |n| n ** 2 }                    # => [1, 9, 25]
 [[1, 4], [4, 5], [6, 6]].flatten!               # => [1, 4, 4, 5, 6, 6]
 
@@ -105,55 +133,56 @@

Arrays

Hashes

capitals = {
-  "India" => "New Delhi",
-  "Canada" => "Ottawa",
-  "U.S.A" => "Washington D.C"
+  "India" => "New Delhi",
+  "Canada" => "Ottawa",
+  "U.S.A" => "Washington D.C"
 }
 
 person = {
-  :first_name, "Albert",
-  :last_name, "Einstein",
-  :email, "al@wormhole.com"
+  first_name: "Albert",
+  last_name: "Einstein",
+  email: "al@wormhole.com"
 }
 
-puts "The capital of India is #{capitals[India]}"
-puts "Contact me at #{person[:email]}"
+puts "The capital of India is #{capitals['India']}"
+puts "Contact me at #{person[:email]}"
 
 capitals.each do |k, v|
-  puts "The capital of #{k} is #{v}
+  puts "The capital of #{k} is #{v}"
 end
 
-capitals.has_key?("Canada")
+capitals.has_key?("Canada")
+capitals.key? "Canada"
 
 capitals.keys.sort.each do |k|
-  puts "The capital of #{k} is #{capitals[k]}
+  puts "The capital of #{k} is #{capitals[k]}"
 end
 
 more_capitals = {
-  "China" => "Beijing",
-  "Russia" => "Moscow",
-  "Germany" => "Berlin"
+  "China" => "Beijing",
+  "Russia" => "Moscow",
+  "Germany" => "Berlin"
 }
 
 capitals.merge!(more_capitals)
-puts capitals.fetch('China')
+puts capitals.fetch('China')
 
-capitals.delete("China")
+capitals.delete("China")
 
-try
-  puts "The capital of China is #{capitals.fetch('China')}"
+begin
+  puts "The capital of China is #{capitals.fetch('China')}"
 rescue KeyError
-  puts "OMG! China has no capital"
+  puts "OMG! China has no capital"
 end
 
-capitals['China']                    # => nil
-capitals.fetch('China', 'Unknown')   # => "Unknown"
+capitals['China']                    # => nil
+capitals.fetch('China', 'Unknown')   # => "Unknown"
 

Control Flow and Ranges

while true
-  puts "Forever"
+  puts "Forever"
 end
 
 x = 0
@@ -164,36 +193,38 @@ 

Control Flow and Ranges

break if x >= 100 end -100.times { puts "Hello!!!!!!!!!" } +100.times { puts "Hello!!!!!!!!!" } 1.upto(10) { |x| puts x } 10.downto(1) { |x| puts x } (1..100).each { |x| puts x } (1..100).to_a +puts (1..100).to_a +puts *1..100 -if person == "Bob" - puts "Hi Bob!" -elsif person == "Charlie" - puts "Hi Charlie!" +if person == "Bob" + puts "Hi Bob!" +elsif person == "Charlie" + puts "Hi Charlie!" else - puts "Goodbye, fool!" + puts "Goodbye, fool!" end case person when/^[Bb]ob/ - puts "Hi Bob!" + puts "Hi Bob!" when /^[Cc]harlie/ - puts "Hi Charlie!" + puts "Hi Charlie!" else - puts "Goodbye, fool!" + puts "Goodbye, fool!" end -case (rand(6) + 1) +case rand(6) + 1 when 1..5 - puts "You lose!" + puts "You lose!" when 6 - puts "You win!" + puts "You win!" else - raise "What just happened? + raise "What just happened?" end
@@ -204,39 +235,62 @@

Getting Stuff Done

first_argument = ARGV.first +puts "#{ENV['HOME']} is where the heart is." +ENV.each {|k, v| puts "#{k} = #{v}" if k =~ /^JAVA/ } + while true - puts "What is your name?" + puts "What is your name?" name = gets.chomp break unless name.empty? end +begin + puts "What is your name?" + name = gets.chomp +end while name.empty? + ARGF.each_line { |line| puts line.capitalize } -f = File.open("filename", "r") +f = File.open("filename", "r") f.each_line { |line| puts line.chomp.reverse } f.close -f = File.open("destroy_this_file", "w") -f.truncate -f.write("Destroyed\n") +File.open("filename") do |f| + f.each_line { |line| puts line.chomp.reverse } +end + +f = File.open("destroy_this_file", "w") +f.truncate(0) +f.write("Destroyed\n") f.seek(0, IO::SEEK_SET) -f.write("Destroyed Again\n") +f.write("Destroyed Again\n") f.close -puts File.stat("myfile").size -puts File.stat("myfile").mtime -puts File.stat("myfile").gid -puts File.stat("myfile").writable? +puts File.stat("myfile").size +puts File.stat("myfile").mtime +puts File.stat("myfile").gid +puts File.stat("myfile").writable? -puts File.dirname("/boo/blah/haha") +puts File.dirname("/boo/blah/haha") puts File.dirname(__FILE__) -puts File.read("myfile") if File.exists?("myfile") -File.open("/etc/passwd").chown(0) -File.open("/etc/passwd").chmod(0644) +puts File.read("myfile") if File.exists?("myfile") +File.open("/etc/passwd").chown(0, 0) +File.open("/etc/passwd").chmod(0644) + +require 'fileutils' +FileUtils.chown('root', 'wheel', '/etc/passwd') +FileUtils.chown 'root', nil, Dir.glob('/usr/bin/*'), :verbose => true +FileUtils.chown_R 'boo', 'boo', '/home/boo' +FileUtils.cp %w(boo.html boo.js boo.css), '/home/boo/www' +FileUtils.rm Dir.glob('*.trash') -passwd_data = File.read("/etc/passwd") # Returns one string -passwd_lines = File.readlines("/etc/passwd") # Returns array of strings +FileUtils.cd('/etc') do + puts File.open("passwd").read +end + +passwd_data = File.read("/etc/passwd") # Returns one string +passwd_lines = File.readlines("/etc/passwd") # Returns array of strings puts Time.now seconds_since_epoch = Time.now.to_i @@ -244,7 +298,7 @@

Getting Stuff Done

puts Time.at(seconds_since_epoch).min puts Time.at(seconds_since_epoch).sec -hex_unixtime_ns = 0x44bf1c1f0258e" +hex_unixtime_ns = "0x44bf1c1f0258e" puts Time.at(hex_unixtime_ns.to_i(16) / 1000000.0) start_time = Time.now @@ -258,49 +312,174 @@

Getting Stuff Done

dice_roll = rand(6) + 1 100.times { puts rand(6) + 1 } +boo = "boo" boo.each_byte { |x| puts x } boo.each_byte { |x| puts x.chr } -"BORED".each_byte {|b| print b.to_s(base=16)} +"BORED".each_byte {|b| print b.to_s(base=16)} -a = [ "a", "b", "c" ] +a = [ "a", "b", "c" ] n = [ 65, 66, 67 ] -a.pack("A3A3A3") #=> "a b c " -a.pack("a3a3a3") #=> "a\000\000b\000\000c\000\000" -n.pack("ccc") #=> "ABC" -[4, 5, 6].pack("c*") -"abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "] -"abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"] -"abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "] -"aa".unpack('b8B8') #=> ["10000110", "01100001"] -"aaa".unpack('h2H2c') #=> ["16", "61", 97] - -if "storm:4300" =~ /^(\s+):(\d+)$/ +a.pack("A3A3A3") #=> "a b c " +a.pack("a3a3a3") #=> "a\000\000b\000\000c\000\000" +n.pack("ccc") #=> "ABC" +[4, 5, 6].pack("c*") +"abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "] +"abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"] +"abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "] +"aa".unpack('b8B8') #=> ["10000110", "01100001"] +"aaa".unpack('h2H2c') #=> ["16", "61", 97] + +if "storm:4300" =~ /^(\S+):(\d+)$/ host = $1 port = $2 end -

Classes

+

Methods, Blocks, and Procs

+ +
def say_hello
+  puts "Hello"
+end
+
+def say_something(thing)
+  puts thing
+end
+
+def say_these_things(thing1="boo", thing2="blah")
+  puts thing1
+  puts thing2
+end
+say_these_things(thing2="ha")
+
+def show_people(*people)
+  people.each { |p| puts p }
+end
+
+callback1 = proc { |name| puts "Hello #{name}." }
+callback2 = lambda { |name| puts "Hello #{name}." }
+callback1.call "world"
+callback2.call "world"     # proc behaves like lambda in this case
+callback1.call
+callback2.call             # lambda raises ArgumentError, unlike proc
+
+on_log = proc { |l| puts "#{ Time.now } -- #{l}" }
+def do_stuff(args, logger)
+  # blah
+  logger.call("Starting deextrapulator...")
+  # blah
+end
+args = [ 1, 2, 3 ]
+do_stuff(args, on_log)
+
+def do_thing(*args, &job)
+  job.call(args)
+end
+do_thing :blah { |x| puts x.to_s }
+
+def repeat(num)
+  while num > 0
+    yield num
+    num -= 1
+  end
+end
+repeat(3) { |x| puts x }
+
+def repeat num, &job
+  num.downto 1, &job
+end
+repeat(3) { |x| puts x }
 
-
class Person
+trap "SIGINT", proc { puts "^C pressed." }
+
+ +

Exceptions

+ +
begin
+  file = open("some_file")
+rescue
+  file = STDIN
+end
+
+raise "String exception"
+raise
+
+fail "String exception"
+fail
+
+begin
+  file = open("some_file", "w")
+  file.write("blah")
+rescue Exception => e
+  puts "Error: %s" %[e.message]
+  e.backtrace.inspect
+ensure
+  file.close
+end
+
+raise ArgumentError, 'Invalid argument'
+raise IndexError, 'Out of range'
+
+class RetryException < RuntimeError
+  attr :can_retry
+  def initialize(can_retry)
+    @can_retry = can_retry
+  end
+end
+
+def send_message(endpoint, message)
+  bytes_written = endpoint.write(message)
+  raise RetryException.new(true) if bytes_written.nil?
+end
+
+require 'socket'
+begin
+  endpoint = TCPSocket.open("localhost", 2000)
+  send_message(endpoint, "Hello endpoint!")
+rescue RetryException => e
+  retry if e.can_retry
+  raise
+ensure
+  endpoint.close
+end
+
+ +

Modules and Classes

+ +
module Music
+  A = 440
+  def tune_up(note)
+    # do blah
+  end
+  module_function :tune_up
+end
+
+puts Music::A
+Music.tune_up(:c_sharp)
+
+include Music
+puts A
+tune_up(:b_flat)
+
+class Person
   attr_reader :first_name, :last_name
   attr_accessor :age
 
   def initialize
-    @first_name = "Blah"
-    @last_name = "Boo"
+    @first_name = "Blah"
+    @last_name = "Boo"
   end
 
   def name
-    @first_name + " " + @last_name
+    @first_name + " " + @last_name
   end
 
   alias :fullname :name
+  alias surname last_name
 end
 
 al = Person.new
 al.age = 10
-puts "#{al.name} is #{al.age} years old"
+puts "#{al.name} is #{al.age} years old"
 
 class Employee < Person
   attr_reader :id
@@ -311,15 +490,18 @@ 

Classes

end end -scumbag = Employee.new(2300, "Scumbag", "Steve") +scumbag = Employee.new(2300, "Scumbag", "Steve")

Systems and Networking

-
puts "My Process ID is #{ $$ }"
+
puts "My Process ID is #{ $$ }"
 
-system 'ls'
+system 'ls'
 `ls`.split(/\n/).length
+`ls`.lines.to_a.length
+
+include Process
 puts uid
 puts euid
 puts gid
@@ -333,38 +515,38 @@ 

Systems and Networking

Process.detach(p1) Process.waitpid(p2) sleep 2 -system("ps -ho pid,state -p #{p1}") +system("ps -ho pid,state -p #{p1}") pid = fork do - Signal.trap("USR1") do + trap :USR1 do $debug = !$debug - puts "Debug now: #$debug" + puts "Debug now: #$debug" end - Signal.trap("TERM") do - puts "Terminating..." + trap :TERM do + puts "Terminating..." shutdown() end end Process.detach(pid) -Process.kill("USR1", pid) -Process.kill("USR1", pid) -Process.kill("TERM", pid) +Process.kill(:USR1, pid) +Process.kill(:USR1, pid) +Process.kill(:TERM, pid) Process.daemon Process.times -require 'socket' +require 'socket' host, path = ARGV port = 80 s = TCPSocket.open(host, port) -s.puts "GET #{path}" -while !s.eof? +s.puts "GET #{path}" +until s.eof? puts s.readline end s.close -require 'socket' -dts = TCPServer.new('localhost', 20000) +require 'socket' +dts = TCPServer.new('localhost', 20000) loop do Thread.start(dts.accept) do |s| s.write(Time.now) @@ -372,40 +554,47 @@

Systems and Networking

end end -require 'net/http' -h = Net::HTTP.new('www.reddit.com', 80) -resp, data = h.get('/index.html', nil) -if resp.message == "OK" - data.scan(/<img src="(.*?)"/) { |x| puts x } +require 'net/http' +h = Net::HTTP.new('www.amazon.com', 80) +resp, data = h.get('/index.html') +if resp.message == "OK" + data.scan(/<img src="(.*?)"/) { |x| puts x } end -
- -

Blocks

-

Commandline

+require 'open-uri' +open("http://www.ruby-lang.org/") {|f| + f.each_line {|line| p line} +} -
$ ls | ruby -ne 'puts $_ if $_ =~ /\.html$/'
-$ ls | ruby -pe '$_.capitalize!'
-$ ls | ruby -ne 'if /(.+)\.html$/ then puts `echo #{$1}` end'
+def is_mac?
+  require 'rbconfig'
+  return Config::CONFIG['host_os'] =~ /^darwin/
+end
 
-

Semantics

+

Ruby on the Command-line

-
    -
  • Scoping rules
  • -
  • Equality
  • -
  • Introspection

    - -

    [1, 2, 3].methods

  • -
  • ruby -w

  • -
+
$ ls | ruby -ne 'puts $_ if $_ =~ /\.html$/'
+$ ls | ruby -pe '$_.capitalize!'
+$ ls | ruby -ne 'if /(.+)\.html$/ then puts `echo #{$1}` end'
+$ expn list | ruby -e "puts ARGF.readlines.map{|s|s.chomp}.join(',')"
+$ cat file.txt | ruby -ne 'BEGIN{$/="\n\n"}; puts $_.chomp'
+$ ruby -pe 'next unless $_ =~ /regexp/' < myfile.txt
+

This Document

The source to this document is hosted on GitHub and located -at The Ruby Refresher Source.

+at The Ruby Refresher Source.

Feel free to send comments, changes, patches, criticism to me at http://0xfe.blogspot.com.

-

Creative Commons License
The Ruby Refresher by Mohit Muthanna Cheppudira is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

+
+ + +
+ + diff --git a/www/rubyrefresher/refresher.css b/www/rubyrefresher/refresher.css index 79d83ae..4374bcb 100644 --- a/www/rubyrefresher/refresher.css +++ b/www/rubyrefresher/refresher.css @@ -1,26 +1,41 @@ body { background: white; - font-family: 'Lobster Two', cursivs; + font-family: 'Inika', Arial; font-size: 12pt; color: #222222; - margin: auto 20px; + margin: auto 0px; + width: 90%; } -a { text-decoration: none; color: black; - padding-bottom: 3px; border-bottom: dotted black 1px } -a:link {text-decoration: none; color: black} -a:visited {text-decoration: none; color: black} -a:active {text-decoration: none; color: #003300} -a:hover {text-decoration: none; color: blue} +a { text-decoration: none; color: black; padding-bottom: 3px;} +a:link {text-decoration: none; color: black; + border-bottom: dotted black 2px } +a:visited {text-decoration: none; color: black; + border-bottom: dotted black 2px } +a:active {text-decoration: none; color: black; + border-bottom: dotted red 2px } +a:hover {text-decoration: none; color: black; + border-bottom: dotted red 2px } h1 { color: black; - font-family: "Bowlby One SC", sans-serif; font-size: 36px; margin-bottom: 2px; margin-top: 2px; } +div#wrapper { + padding: 10px; +} + +pre { + padding: 10px; + padding-left: 20px; + border-left: solid 4px #ccc; + background: #eee; +} + code { - font-size: 10pt; + font-size: 12pt; + font-family: 'Inconsolata', Courier; } From 732ae62b86349eb331e67687033ca42d5f171834 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Tue, 2 Dec 2014 14:16:09 -0500 Subject: [PATCH 006/180] Added image cleanup script. --- images/cleanup.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 images/cleanup.sh diff --git a/images/cleanup.sh b/images/cleanup.sh new file mode 100755 index 0000000..9a22711 --- /dev/null +++ b/images/cleanup.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +INPUT=$1 +OUTPUT=$2 +TMP=/tmp/snfsoudnf + +if [ "$2" == "" ]; then + echo "Usage: $0 input output" + exit +fi + +echo Blurring... +convert $INPUT -white-threshold '80%' -gaussian-blur 20 -quality 20 ${TMP}1.jpg + +echo Tracing... +autotrace -despeckle-level 9 -despeckle-tightness 0.6 \ + -error-threshold 1 -output-format pdf -filter-iterations 8 \ + -report-progress ${TMP}1.jpg >${TMP}2.pdf + +echo Downsampling... +convert ${TMP}2.pdf -quality 20 $OUTPUT From 1936d3670383df2807e48c675dd5be7f94f37c4c Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Wed, 10 Dec 2014 12:09:09 -0500 Subject: [PATCH 007/180] Added MIDI file generator prototype. --- images/cleanup.sh | 2 +- ruby/midigen.rb | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100755 ruby/midigen.rb diff --git a/images/cleanup.sh b/images/cleanup.sh index 9a22711..0d33b44 100755 --- a/images/cleanup.sh +++ b/images/cleanup.sh @@ -10,7 +10,7 @@ if [ "$2" == "" ]; then fi echo Blurring... -convert $INPUT -white-threshold '80%' -gaussian-blur 20 -quality 20 ${TMP}1.jpg +convert $INPUT -threshold '85%' -gaussian-blur 20 -quality 20 ${TMP}1.jpg echo Tracing... autotrace -despeckle-level 9 -despeckle-tightness 0.6 \ diff --git a/ruby/midigen.rb b/ruby/midigen.rb new file mode 100755 index 0000000..63c1934 --- /dev/null +++ b/ruby/midigen.rb @@ -0,0 +1,61 @@ +#! /usr/bin/env ruby +# +# usage: from_scratch.rb +# +# This script shows you how to create a new sequence from scratch and save it +# to a MIDI file. It creates a file called 'from_scratch.mid'. + +# Start looking for MIDI module classes in the directory above this one. +# This forces us to use the local copy, even if there is a previously +# installed version out there somewhere. +$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib') + +require 'midilib/sequence' +require 'midilib/consts' +include MIDI + +seq = Sequence.new() + +# Create a first track for the sequence. This holds tempo events and stuff +# like that. +track = Track.new(seq) +seq.tracks << track +track.events << Tempo.new(Tempo.bpm_to_mpq(120)) +track.events << MetaEvent.new(META_SEQ_NAME, 'Sequence Name') + +# Create a track to hold the notes. Add it to the sequence. +track = Track.new(seq) +seq.tracks << track + +# Give the track a name and an instrument name (optional). +track.name = 'My New Track' +track.instrument = GM_PATCH_NAMES[0] + +# Add a volume controller event (optional). +track.events << Controller.new(0, CC_VOLUME, 127) + +# Add events to the track: a major scale. Arguments for note on and note off +# constructors are channel, note, velocity, and delta_time. Channel numbers +# start at zero. We use the new Sequence#note_to_delta method to get the +# delta time length of a single quarter note. +track.events << ProgramChange.new(0, 1, 0) +quarter_note_length = seq.note_to_delta('quarter') + +major = [0, 4, 7] + +[0, 2, 4, 5, 7, 9, 11, 12].each do |offset| + major.each do |i| + track.events << NoteOn.new(0, 64 + offset + i, 127, 0) + end + major.each do |i| + track.events << NoteOff.new(0, 64 + offset + i, 127, quarter_note_length) + end +end + +# Calling recalc_times is not necessary, because that only sets the events' +# start times, which are not written out to the MIDI file. The delta times are +# what get written out. + +# track.recalc_times +puts "Generating MIDI for #{track.instrument}" +File.open('from_scratch.mid', 'wb') { |file| seq.write(file) } \ No newline at end of file From 5273cc25b781877ff3bd4cf4faf8c5e58080e1f4 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Wed, 10 Dec 2014 12:31:37 -0500 Subject: [PATCH 008/180] Added some helper code to generate chords. --- ruby/midigen.rb | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/ruby/midigen.rb b/ruby/midigen.rb index 63c1934..59ecc64 100755 --- a/ruby/midigen.rb +++ b/ruby/midigen.rb @@ -41,17 +41,54 @@ track.events << ProgramChange.new(0, 1, 0) quarter_note_length = seq.note_to_delta('quarter') -major = [0, 4, 7] +# Intervals +module I + IU = 0 + Im2 = 1 + IM2 = 2 + Im3 = 3 + IM3 = 4 + Ip4 = 5 + Id5 = 6 + Ip5 = 7 + Ia5 = 8 + Im6 = 8 + IM6 = 9 + Im7 = 10 + IM7 = 11 + IO = 12 +end -[0, 2, 4, 5, 7, 9, 11, 12].each do |offset| - major.each do |i| - track.events << NoteOn.new(0, 64 + offset + i, 127, 0) +# Chords +module C + include I + + Major_i0 = [IM3, Ip5] + Major_i1 = [Im3, Ip4] + Major_i2 = [Ip4, Im3] + + def gen(intervals, bottom) + return [bottom] + intervals.map {|i| bottom + i} + end + + module_function :gen +end + +include C + +def add_chord(events, notes, duration, velocity=127) + notes.each do |i| + events << NoteOn.new(0, i, velocity, 0) end - major.each do |i| - track.events << NoteOff.new(0, 64 + offset + i, 127, quarter_note_length) + notes.each do |i| + events << NoteOff.new(0, i, velocity, duration) end end +[0, 2, 4, 5, 7, 9, 11, 12].each do |offset| + add_chord(track.events, C.gen(Major_i0, 64 + offset), quarter_note_length) +end + # Calling recalc_times is not necessary, because that only sets the events' # start times, which are not written out to the MIDI file. The delta times are # what get written out. From 3c5e542c22c5226246afc97d591bd07f89dadb93 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Wed, 10 Dec 2014 15:30:38 -0500 Subject: [PATCH 009/180] Update MIDI generator, add README. --- ruby/midi/README.md | 13 ++++++ ruby/midigen.rb | 98 --------------------------------------------- 2 files changed, 13 insertions(+), 98 deletions(-) create mode 100644 ruby/midi/README.md delete mode 100755 ruby/midigen.rb diff --git a/ruby/midi/README.md b/ruby/midi/README.md new file mode 100644 index 0000000..dd45e21 --- /dev/null +++ b/ruby/midi/README.md @@ -0,0 +1,13 @@ +Build MIDI file: + +$ gem install midilib +$ ./midigen + +Convert to WAV: +$ brew install fluidsynth +$ fluidsynth -a coreaudio ~/w/audio/octave/FluidR3_GM.sf2 from_scratch.mid -F test.ra + +$ brew install sox +$ sox -t raw -r 44100 -e signed -b 16 -c 2 test.raw ~/Downloads/test1.wav + + diff --git a/ruby/midigen.rb b/ruby/midigen.rb deleted file mode 100755 index 59ecc64..0000000 --- a/ruby/midigen.rb +++ /dev/null @@ -1,98 +0,0 @@ -#! /usr/bin/env ruby -# -# usage: from_scratch.rb -# -# This script shows you how to create a new sequence from scratch and save it -# to a MIDI file. It creates a file called 'from_scratch.mid'. - -# Start looking for MIDI module classes in the directory above this one. -# This forces us to use the local copy, even if there is a previously -# installed version out there somewhere. -$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib') - -require 'midilib/sequence' -require 'midilib/consts' -include MIDI - -seq = Sequence.new() - -# Create a first track for the sequence. This holds tempo events and stuff -# like that. -track = Track.new(seq) -seq.tracks << track -track.events << Tempo.new(Tempo.bpm_to_mpq(120)) -track.events << MetaEvent.new(META_SEQ_NAME, 'Sequence Name') - -# Create a track to hold the notes. Add it to the sequence. -track = Track.new(seq) -seq.tracks << track - -# Give the track a name and an instrument name (optional). -track.name = 'My New Track' -track.instrument = GM_PATCH_NAMES[0] - -# Add a volume controller event (optional). -track.events << Controller.new(0, CC_VOLUME, 127) - -# Add events to the track: a major scale. Arguments for note on and note off -# constructors are channel, note, velocity, and delta_time. Channel numbers -# start at zero. We use the new Sequence#note_to_delta method to get the -# delta time length of a single quarter note. -track.events << ProgramChange.new(0, 1, 0) -quarter_note_length = seq.note_to_delta('quarter') - -# Intervals -module I - IU = 0 - Im2 = 1 - IM2 = 2 - Im3 = 3 - IM3 = 4 - Ip4 = 5 - Id5 = 6 - Ip5 = 7 - Ia5 = 8 - Im6 = 8 - IM6 = 9 - Im7 = 10 - IM7 = 11 - IO = 12 -end - -# Chords -module C - include I - - Major_i0 = [IM3, Ip5] - Major_i1 = [Im3, Ip4] - Major_i2 = [Ip4, Im3] - - def gen(intervals, bottom) - return [bottom] + intervals.map {|i| bottom + i} - end - - module_function :gen -end - -include C - -def add_chord(events, notes, duration, velocity=127) - notes.each do |i| - events << NoteOn.new(0, i, velocity, 0) - end - notes.each do |i| - events << NoteOff.new(0, i, velocity, duration) - end -end - -[0, 2, 4, 5, 7, 9, 11, 12].each do |offset| - add_chord(track.events, C.gen(Major_i0, 64 + offset), quarter_note_length) -end - -# Calling recalc_times is not necessary, because that only sets the events' -# start times, which are not written out to the MIDI file. The delta times are -# what get written out. - -# track.recalc_times -puts "Generating MIDI for #{track.instrument}" -File.open('from_scratch.mid', 'wb') { |file| seq.write(file) } \ No newline at end of file From e87678c70c3debcd615c6d62deb63800d60aa602 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Thu, 25 Dec 2014 21:43:49 -0500 Subject: [PATCH 010/180] Add missing files from www/. --- www/filter.html | 38 ++++++++++++++++++++++++++++++++++++++ www/style.css | 27 +++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 www/filter.html create mode 100644 www/style.css diff --git a/www/filter.html b/www/filter.html new file mode 100644 index 0000000..b242061 --- /dev/null +++ b/www/filter.html @@ -0,0 +1,38 @@ + + + + + + + + + +

Boo

+ + Play Sine Wave + + diff --git a/www/style.css b/www/style.css new file mode 100644 index 0000000..c07d6ec --- /dev/null +++ b/www/style.css @@ -0,0 +1,27 @@ +body { + background: black; + font-family: 'Marvel', sans-serif; + font-size: 18px; + color: #00cc00; + margin: auto 0px; +} + +a { padding: 3px; + text-decoration: none; color: green; border-bottom: solid #005500 2px } +a:link {text-decoration: none; color: green} +a:visited {text-decoration: none; color: green} +a:active {text-decoration: none; color: #00ff00} +a:hover {text-decoration: none; color: #00ff00} + +#wrapper { + font-size: 18px; + margin-left: auto; + margin-right: auto; + margin-top: 130px; + display: block; + padding: 20px; + width: 90%; +} + +h1 { font-family: "Geostar Fill", cursive; font-size: 36px;} +p { padding: 10px; } From 3cab713f0081e3a4909983cc26162481c22fea00 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sat, 31 Jan 2015 20:06:12 -0500 Subject: [PATCH 011/180] Add generic shuffle in GoLang. --- go/shuffle.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 go/shuffle.go diff --git a/go/shuffle.go b/go/shuffle.go new file mode 100644 index 0000000..1c227b9 --- /dev/null +++ b/go/shuffle.go @@ -0,0 +1,30 @@ +package main + +// An implementation of a generic shuffle. Writing +// generic code in Go is sucky. + +import ( + "fmt" + "math/rand" + "time" +) + +func shuffle(a []interface{}) { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } +} + +func main() { + rand.Seed(time.Now().UTC().UnixNano()) + a := []int64{1, 2, 3, 4, 5} + + b := make([]interface{}, len(a)) + for i, x := range a { + b[i] = interface{}(x) + } + + shuffle(b) + fmt.Println(b) +} From 0e77941388cc5fd98d1270a3fb9b9f1299adb807 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 09:55:47 -0500 Subject: [PATCH 012/180] Added other shuffle alternatives. --- go/shuffle.go | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/go/shuffle.go b/go/shuffle.go index 1c227b9..052e1d8 100644 --- a/go/shuffle.go +++ b/go/shuffle.go @@ -6,18 +6,43 @@ package main import ( "fmt" "math/rand" + "reflect" "time" ) -func shuffle(a []interface{}) { +func shuffle1(a []interface{}) { for i := range a { j := rand.Intn(i + 1) a[i], a[j] = a[j], a[i] } } +func shuffle2(a interface{}) interface{} { + val := reflect.ValueOf(a) + out := make([]interface{}, val.Len()) + for i := 0; i < val.Len(); i++ { + out[i] = val.Index(i).Interface() + } + + shuffle1(out) + return out +} + +func shuffle3(a interface{}) { + val := reflect.ValueOf(a) + + for i := 0; i < val.Len(); i++ { + j := rand.Intn(i + 1) + tmp := reflect.ValueOf(val.Index(j).Interface()) + val.Index(j).Set(val.Index(i)) + val.Index(i).Set(tmp) + } +} + func main() { rand.Seed(time.Now().UTC().UnixNano()) + + // Technique 1 a := []int64{1, 2, 3, 4, 5} b := make([]interface{}, len(a)) @@ -25,6 +50,14 @@ func main() { b[i] = interface{}(x) } - shuffle(b) + shuffle1(b) fmt.Println(b) + + // Technique 2 + c := shuffle2(a) + fmt.Println(c) + + // Technique 3 + shuffle3(a) + fmt.Println(a) } From c1a0c0e65f7af3e23f1a7f9cf43ff2f79d94ac9c Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 11:05:00 -0500 Subject: [PATCH 013/180] Added shuffle benchmarks. --- go/shuffle_test.go | 142 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 go/shuffle_test.go diff --git a/go/shuffle_test.go b/go/shuffle_test.go new file mode 100644 index 0000000..794e91e --- /dev/null +++ b/go/shuffle_test.go @@ -0,0 +1,142 @@ +package shuffle + +// This file benchmarks three different approaches to writing a +// generic algorithm in Go. +// +// 0xFE - Mohit Cheppudira +// +// To run: +// $ go test -benchmem -bench=. shuffle_test.go + +import ( + "math/rand" + "reflect" + "testing" + "time" +) + +var ( + DATA100 = buildArray(100) + DATA1000 = buildArray(1000) + DATA10000 = buildArray(10000) + DATA100000 = buildArray(100000) + DATA1000000 = buildArray(1000000) +) + +func init() { + rand.Seed(time.Now().UTC().UnixNano()) +} + +// Technique 1: requires user to convert specificially typed slice to +// a slice of interface{}. Shuffles the copy in-place. +func shuffle1(a []interface{}) { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } +} + +// Technique 2: uses reflection to do the conversion then calls shuffle1. Returns +// a shuffled copy of the input. +func shuffle2(a interface{}) interface{} { + val := reflect.ValueOf(a) + out := make([]interface{}, val.Len()) + for i := 0; i < val.Len(); i++ { + out[i] = val.Index(i).Interface() + } + + shuffle1(out) + return out +} + +// Technique 3: Uses reflection entirely and does an in-place shuffle. Almost illegible. +func shuffle3(a interface{}) { + val := reflect.ValueOf(a) + + for i := 0; i < val.Len(); i++ { + j := rand.Intn(i + 1) + tmp := reflect.ValueOf(val.Index(j).Interface()) + val.Index(j).Set(val.Index(i)) + val.Index(i).Set(tmp) + } +} + +func buildArray(size int) []int { + a := make([]int, size) + for i := 0; i < size; i++ { + a[i] = rand.Int() + } + + return a +} + +func bmShuffle1(data []int, b *testing.B) { + for n := 0; n < b.N; n++ { + d := make([]interface{}, len(data)) + for i, x := range data { + d[i] = interface{}(x) + } + + shuffle1(d) + } +} + +func bmShuffle2(data []int, b *testing.B) { + for n := 0; n < b.N; n++ { + shuffle2(data) + } +} + +func bmShuffle3(data []int, b *testing.B) { + for n := 0; n < b.N; n++ { + shuffle3(data) + } +} + +func BenchmarkShuffle1_100(b *testing.B) { + bmShuffle1(DATA100, b) +} +func BenchmarkShuffle1_1000(b *testing.B) { + bmShuffle1(DATA1000, b) +} +func BenchmarkShuffle1_10000(b *testing.B) { + bmShuffle1(DATA10000, b) +} +func BenchmarkShuffle1_100000(b *testing.B) { + bmShuffle1(DATA100000, b) +} +func BenchmarkShuffle1_1000000(b *testing.B) { + bmShuffle1(DATA1000000, b) +} + +func BenchmarkShuffle2_100(b *testing.B) { + bmShuffle2(DATA100, b) +} +func BenchmarkShuffle2_1000(b *testing.B) { + bmShuffle2(DATA1000, b) +} +func BenchmarkShuffle2_10000(b *testing.B) { + bmShuffle2(DATA10000, b) +} +func BenchmarkShuffle2_100000(b *testing.B) { + bmShuffle2(DATA100000, b) +} +func BenchmarkShuffle2_1000000(b *testing.B) { + bmShuffle2(DATA1000000, b) +} + +func BenchmarkShuffle3_100(b *testing.B) { + bmShuffle3(DATA100, b) +} +func BenchmarkShuffle3_1000(b *testing.B) { + bmShuffle3(DATA1000, b) +} +func BenchmarkShuffle3_10000(b *testing.B) { + bmShuffle3(DATA10000, b) +} +func BenchmarkShuffle3_100000(b *testing.B) { + bmShuffle3(DATA100000, b) +} +func BenchmarkShuffle3_1000000(b *testing.B) { + bmShuffle3(DATA1000000, b) +} From 31d5a91c9494c1b8d32f774678a444b9f54ac9f2 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 11:05:53 -0500 Subject: [PATCH 014/180] Removed old code. --- go/README | 21 ----------------- go/shuffle.go | 63 -------------------------------------------------- go/slices.go | 18 --------------- go/waf | Bin 83005 -> 0 bytes 4 files changed, 102 deletions(-) delete mode 100644 go/README delete mode 100644 go/shuffle.go delete mode 100644 go/slices.go delete mode 100755 go/waf diff --git a/go/README b/go/README deleted file mode 100644 index 9e4174e..0000000 --- a/go/README +++ /dev/null @@ -1,21 +0,0 @@ -Installing Go - -http://golang.org - -$ sudo port install go - -Installing waf - -$ curl -O http://waf.googlecode.com/files/waf-1.6.3 -$ mv waf-1.6.3 waf -$ ./waf --version - ----------------------------- - -This directory: - -$ ./waf configure - -$ ./waf build (or just ./waf) - -$ ./waf distclean diff --git a/go/shuffle.go b/go/shuffle.go deleted file mode 100644 index 052e1d8..0000000 --- a/go/shuffle.go +++ /dev/null @@ -1,63 +0,0 @@ -package main - -// An implementation of a generic shuffle. Writing -// generic code in Go is sucky. - -import ( - "fmt" - "math/rand" - "reflect" - "time" -) - -func shuffle1(a []interface{}) { - for i := range a { - j := rand.Intn(i + 1) - a[i], a[j] = a[j], a[i] - } -} - -func shuffle2(a interface{}) interface{} { - val := reflect.ValueOf(a) - out := make([]interface{}, val.Len()) - for i := 0; i < val.Len(); i++ { - out[i] = val.Index(i).Interface() - } - - shuffle1(out) - return out -} - -func shuffle3(a interface{}) { - val := reflect.ValueOf(a) - - for i := 0; i < val.Len(); i++ { - j := rand.Intn(i + 1) - tmp := reflect.ValueOf(val.Index(j).Interface()) - val.Index(j).Set(val.Index(i)) - val.Index(i).Set(tmp) - } -} - -func main() { - rand.Seed(time.Now().UTC().UnixNano()) - - // Technique 1 - a := []int64{1, 2, 3, 4, 5} - - b := make([]interface{}, len(a)) - for i, x := range a { - b[i] = interface{}(x) - } - - shuffle1(b) - fmt.Println(b) - - // Technique 2 - c := shuffle2(a) - fmt.Println(c) - - // Technique 3 - shuffle3(a) - fmt.Println(a) -} diff --git a/go/slices.go b/go/slices.go deleted file mode 100644 index d6051e7..0000000 --- a/go/slices.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ("fmt") - -func sum(arr []int) int { - total := 0 - - for i := 0; i < len(arr); i++ { - total += arr[i] - } - - return total -} - -func main() { - total := sum([]int{105, 4, 3, 2, 1}) - fmt.Printf("Total = %d\n", total); -} diff --git a/go/waf b/go/waf deleted file mode 100755 index 0dcf397493dfe783c3e724ce6b71b5883cea533c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83005 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

tEzv3S6&;4pXz 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 Dk9tEm From b22a3b4777645737709f2ae1870bbea6768a6ad7 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 11:07:20 -0500 Subject: [PATCH 015/180] Added README. --- go/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 go/README.md diff --git a/go/README.md b/go/README.md new file mode 100644 index 0000000..29b4242 --- /dev/null +++ b/go/README.md @@ -0,0 +1,7 @@ += Random Go Code + +== Shuffle Test + +`shuffle_test.go` tests various implementations of a generic Fischer-Yates +algorithm. + From c0012759af4a70ead5b15ff0b9ac7901fe5dac4a Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 11:07:54 -0500 Subject: [PATCH 016/180] Updated README. --- go/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go/README.md b/go/README.md index 29b4242..a99661b 100644 --- a/go/README.md +++ b/go/README.md @@ -5,3 +5,5 @@ `shuffle_test.go` tests various implementations of a generic Fischer-Yates algorithm. +To run: + $ go test -benchmem -bench=. shuffle_test.go \ No newline at end of file From e84c9f279b5113b37f6b903f0f34945c24037569 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 11:26:31 -0500 Subject: [PATCH 017/180] Added results. --- go/README.md | 96 ++++++++++++++++++++++++++++++++++++++++++++-- go/shuffle_test.go | 30 +++++++++++++++ 2 files changed, 123 insertions(+), 3 deletions(-) diff --git a/go/README.md b/go/README.md index a99661b..30ab694 100644 --- a/go/README.md +++ b/go/README.md @@ -1,9 +1,99 @@ -= Random Go Code +# Random Go Code -== Shuffle Test +## Shuffle Test `shuffle_test.go` tests various implementations of a generic Fischer-Yates algorithm. To run: - $ go test -benchmem -bench=. shuffle_test.go \ No newline at end of file + $ go test -benchmem -bench=. shuffle_test.go + +There are 4 types of `shuffle`: + +### 1. `shuffle0` + +Non generic version. Shuffles `[]int` in-place. + +```go +func shuffle0(a []int) { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } +} +``` + +### 2. `shuffle1` + +Shuffles `[]interface{}`. Requires user to convert `[]type` to `[]interface{}`. + +```go +func shuffle1(a []interface{}) { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } +} +``` + +### 3. `shuffle2` + +Shuffles `interface{}`. User does not need to convert slice, but data isn't shuffled in-place. + +```go +func shuffle2(a interface{}) interface{} { + val := reflect.ValueOf(a) + out := make([]interface{}, val.Len()) + for i := 0; i < val.Len(); i++ { + out[i] = val.Index(i).Interface() + } + + shuffle1(out) + return out +} +``` + +### 4. `shuffle3` + +Shuffles `interface{}`. User does not need to convert slice, and the shuffle is performed in place. But since this uses reflection entirely, the implementation is grotesque. + +```go +func shuffle3(a interface{}) { + val := reflect.ValueOf(a) + + for i := 0; i < val.Len(); i++ { + j := rand.Intn(i + 1) + tmp := reflect.ValueOf(val.Index(j).Interface()) + val.Index(j).Set(val.Index(i)) + val.Index(i).Set(tmp) + } +} +``` + +## The Results + +As of 2015/02/01 on my 1.7Ghz Core i7 MacBook Air with 8G 1600 MHz DDR3 RAM running OS X 10.9.5: + +``` +BenchmarkShuffle0_100 300000 4585 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_1000 30000 45295 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_10000 3000 442840 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_100000 300 5854736 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_1000000 10 108399241 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle1_100 200000 9964 ns/op 2464 B/op 101 allocs/op +BenchmarkShuffle1_1000 20000 98529 ns/op 24384 B/op 1001 allocs/op +BenchmarkShuffle1_10000 2000 993735 ns/op 243840 B/op 10001 allocs/op +BenchmarkShuffle1_100000 100 11417906 ns/op 2405632 B/op 100001 allocs/op +BenchmarkShuffle1_1000000 10 166154906 ns/op 24007174 B/op 1000001 allocs/op +BenchmarkShuffle2_100 100000 12762 ns/op 2528 B/op 103 allocs/op +BenchmarkShuffle2_1000 10000 123570 ns/op 24448 B/op 1003 allocs/op +BenchmarkShuffle2_10000 1000 1119474 ns/op 243904 B/op 10003 allocs/op +BenchmarkShuffle2_100000 100 12819098 ns/op 2405696 B/op 100003 allocs/op +BenchmarkShuffle2_1000000 10 188149365 ns/op 24007238 B/op 1000003 allocs/op +BenchmarkShuffle3_100 100000 18815 ns/op 832 B/op 101 allocs/op +BenchmarkShuffle3_1000 10000 200390 ns/op 8032 B/op 1001 allocs/op +BenchmarkShuffle3_10000 1000 1914459 ns/op 80032 B/op 10001 allocs/op +BenchmarkShuffle3_100000 100 24367265 ns/op 800032 B/op 100001 allocs/op +BenchmarkShuffle3_1000000 2 569379397 ns/op 8000040 B/op 1000001 allocs/op +ok command-line-arguments 35.939s +``` \ No newline at end of file diff --git a/go/shuffle_test.go b/go/shuffle_test.go index 794e91e..3693b7d 100644 --- a/go/shuffle_test.go +++ b/go/shuffle_test.go @@ -27,6 +27,14 @@ func init() { rand.Seed(time.Now().UTC().UnixNano()) } +// Native shuffle. No generics. Shuffle a slice of ints. +func shuffle0(a []int) { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } +} + // Technique 1: requires user to convert specificially typed slice to // a slice of interface{}. Shuffles the copy in-place. func shuffle1(a []interface{}) { @@ -70,6 +78,12 @@ func buildArray(size int) []int { return a } +func bmShuffle0(data []int, b *testing.B) { + for n := 0; n < b.N; n++ { + shuffle0(data) + } +} + func bmShuffle1(data []int, b *testing.B) { for n := 0; n < b.N; n++ { d := make([]interface{}, len(data)) @@ -93,6 +107,22 @@ func bmShuffle3(data []int, b *testing.B) { } } +func BenchmarkShuffle0_100(b *testing.B) { + bmShuffle0(DATA100, b) +} +func BenchmarkShuffle0_1000(b *testing.B) { + bmShuffle0(DATA1000, b) +} +func BenchmarkShuffle0_10000(b *testing.B) { + bmShuffle0(DATA10000, b) +} +func BenchmarkShuffle0_100000(b *testing.B) { + bmShuffle0(DATA100000, b) +} +func BenchmarkShuffle0_1000000(b *testing.B) { + bmShuffle0(DATA1000000, b) +} + func BenchmarkShuffle1_100(b *testing.B) { bmShuffle1(DATA100, b) } From dc930328dc06001cb353867cdde8a9213dcc20c6 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 11:48:10 -0500 Subject: [PATCH 018/180] Updated results and added conclusion. --- go/README.md | 62 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/go/README.md b/go/README.md index 30ab694..1899abd 100644 --- a/go/README.md +++ b/go/README.md @@ -6,7 +6,8 @@ algorithm. To run: - $ go test -benchmem -bench=. shuffle_test.go + + $ go test -benchmem -bench=. shuffle_test.go -benchtime=10s There are 4 types of `shuffle`: @@ -25,7 +26,7 @@ func shuffle0(a []int) { ### 2. `shuffle1` -Shuffles `[]interface{}`. Requires user to convert `[]type` to `[]interface{}`. +Shuffles `[]interface{}`. Requires user to convert `[]type` to `[]interface{}` before calling. Data is shuffled in-place. ```go func shuffle1(a []interface{}) { @@ -38,7 +39,7 @@ func shuffle1(a []interface{}) { ### 3. `shuffle2` -Shuffles `interface{}`. User does not need to convert slice, but data isn't shuffled in-place. +Shuffles `interface{}`. Uses reflection to determine the type and convert the slice, so the user does not need to preprocess before calling. Data is not shuffled in-place. ```go func shuffle2(a interface{}) interface{} { @@ -55,7 +56,7 @@ func shuffle2(a interface{}) interface{} { ### 4. `shuffle3` -Shuffles `interface{}`. User does not need to convert slice, and the shuffle is performed in place. But since this uses reflection entirely, the implementation is grotesque. +Shuffles `interface{}`. User does not need to convert slice, and the shuffle is performed in-place. But since this uses reflection entirely, the implementation is grotesque. ```go func shuffle3(a interface{}) { @@ -75,25 +76,34 @@ func shuffle3(a interface{}) { As of 2015/02/01 on my 1.7Ghz Core i7 MacBook Air with 8G 1600 MHz DDR3 RAM running OS X 10.9.5: ``` -BenchmarkShuffle0_100 300000 4585 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_1000 30000 45295 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_10000 3000 442840 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_100000 300 5854736 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_1000000 10 108399241 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle1_100 200000 9964 ns/op 2464 B/op 101 allocs/op -BenchmarkShuffle1_1000 20000 98529 ns/op 24384 B/op 1001 allocs/op -BenchmarkShuffle1_10000 2000 993735 ns/op 243840 B/op 10001 allocs/op -BenchmarkShuffle1_100000 100 11417906 ns/op 2405632 B/op 100001 allocs/op -BenchmarkShuffle1_1000000 10 166154906 ns/op 24007174 B/op 1000001 allocs/op -BenchmarkShuffle2_100 100000 12762 ns/op 2528 B/op 103 allocs/op -BenchmarkShuffle2_1000 10000 123570 ns/op 24448 B/op 1003 allocs/op -BenchmarkShuffle2_10000 1000 1119474 ns/op 243904 B/op 10003 allocs/op -BenchmarkShuffle2_100000 100 12819098 ns/op 2405696 B/op 100003 allocs/op -BenchmarkShuffle2_1000000 10 188149365 ns/op 24007238 B/op 1000003 allocs/op -BenchmarkShuffle3_100 100000 18815 ns/op 832 B/op 101 allocs/op -BenchmarkShuffle3_1000 10000 200390 ns/op 8032 B/op 1001 allocs/op -BenchmarkShuffle3_10000 1000 1914459 ns/op 80032 B/op 10001 allocs/op -BenchmarkShuffle3_100000 100 24367265 ns/op 800032 B/op 100001 allocs/op -BenchmarkShuffle3_1000000 2 569379397 ns/op 8000040 B/op 1000001 allocs/op -ok command-line-arguments 35.939s -``` \ No newline at end of file +$ go test -benchmem -bench=. shuffle_test.go -benchtime=10s +testing: warning: no tests to run +PASS +BenchmarkShuffle0_100 3000000 4361 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_1000 300000 43106 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_10000 30000 426872 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_100000 3000 4525749 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_1000000 200 81244085 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle1_100 2000000 8747 ns/op 2464 B/op 101 allocs/op +BenchmarkShuffle1_1000 200000 86204 ns/op 24384 B/op 1001 allocs/op +BenchmarkShuffle1_10000 20000 882846 ns/op 243840 B/op 10001 allocs/op +BenchmarkShuffle1_100000 2000 9291741 ns/op 2405632 B/op 100001 allocs/op +BenchmarkShuffle1_1000000 100 153209564 ns/op 24007173 B/op 1000001 allocs/op +BenchmarkShuffle2_100 1000000 10913 ns/op 2528 B/op 103 allocs/op +BenchmarkShuffle2_1000 200000 113354 ns/op 24448 B/op 1003 allocs/op +BenchmarkShuffle2_10000 10000 1220831 ns/op 243904 B/op 10003 allocs/op +BenchmarkShuffle2_100000 2000 12294690 ns/op 2405696 B/op 100003 allocs/op +BenchmarkShuffle2_1000000 100 195267815 ns/op 24007237 B/op 1000003 allocs/op +BenchmarkShuffle3_100 1000000 18362 ns/op 832 B/op 101 allocs/op +BenchmarkShuffle3_1000 100000 181565 ns/op 8032 B/op 1001 allocs/op +BenchmarkShuffle3_10000 10000 1796956 ns/op 80032 B/op 10001 allocs/op +BenchmarkShuffle3_100000 1000 19094388 ns/op 800032 B/op 100001 allocs/op +BenchmarkShuffle3_1000000 50 242966292 ns/op 8000039 B/op 1000001 allocs/op +ok command-line-arguments 374.509s +``` + +## Conclusions + +* `shuffle1` costs about 2x `shuffle0` +* `shuffle2` costs about 2.2x `shuffle0` +* `shuffle3` costs about 3x `shuffle0` \ No newline at end of file From bb9d4ef583eaa442be1b78a10cd9c23ce6e94bc7 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 16:41:07 -0500 Subject: [PATCH 019/180] Improved `shuffle3` to reduce allocations. --- go/README.md | 82 +++++++++++++++++++++++++++------------------- go/shuffle_test.go | 10 ++++-- 2 files changed, 56 insertions(+), 36 deletions(-) diff --git a/go/README.md b/go/README.md index 1899abd..1fcfd63 100644 --- a/go/README.md +++ b/go/README.md @@ -1,9 +1,14 @@ -# Random Go Code +## A Generic Shuffle in Go -## Shuffle Test +Go does not have generics, but it does have reflection. It also has a kind of catch-all dynamic type: `interface{}`. You can put these together to write generic algorithms and containers. -`shuffle_test.go` tests various implementations of a generic Fischer-Yates -algorithm. +This is a short analysis fo the performance implications of writing a generic alogrithm in Go. + +Note that although you can use these techniques to reduce duplication in your code, you compromise on compile-time type saftey, which increases the liklihood of run-time bugs. + +## The Code + +The file `shuffle_test.go` in this directory benchmarks various implementations of a generic Fischer-Yates algorithm. To run: @@ -39,7 +44,7 @@ func shuffle1(a []interface{}) { ### 3. `shuffle2` -Shuffles `interface{}`. Uses reflection to determine the type and convert the slice, so the user does not need to preprocess before calling. Data is not shuffled in-place. +Shuffles `interface{}`. Uses reflection to determine the type and convert the slice, so the user does not need to preprocess before calling. Data is not shuffled in-place. The actual shuffling is performed by `shuffle1`. ```go func shuffle2(a interface{}) interface{} { @@ -61,12 +66,13 @@ Shuffles `interface{}`. User does not need to convert slice, and the shuffle is ```go func shuffle3(a interface{}) { val := reflect.ValueOf(a) + tmp := reflect.New(val.Index(0).Type()) for i := 0; i < val.Len(); i++ { j := rand.Intn(i + 1) - tmp := reflect.ValueOf(val.Index(j).Interface()) + tmp.Elem().Set(val.Index(j)) val.Index(j).Set(val.Index(i)) - val.Index(i).Set(tmp) + val.Index(i).Set(tmp.Elem()) } } ``` @@ -75,35 +81,43 @@ func shuffle3(a interface{}) { As of 2015/02/01 on my 1.7Ghz Core i7 MacBook Air with 8G 1600 MHz DDR3 RAM running OS X 10.9.5: +The tests were performed with 5 datasets, each with 100, 1000, 10^4, 10^5, and 10^6 elements. Test name `BenchmarkShuffle1_10000` refers to a benchmark of `shuffle1` on a 10000 element slice. + +Fields: test name, iterations, time per iteration, bytes allocated per iteration, number of allocations per iteration + ``` $ go test -benchmem -bench=. shuffle_test.go -benchtime=10s -testing: warning: no tests to run -PASS -BenchmarkShuffle0_100 3000000 4361 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_1000 300000 43106 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_10000 30000 426872 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_100000 3000 4525749 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle0_1000000 200 81244085 ns/op 0 B/op 0 allocs/op -BenchmarkShuffle1_100 2000000 8747 ns/op 2464 B/op 101 allocs/op -BenchmarkShuffle1_1000 200000 86204 ns/op 24384 B/op 1001 allocs/op -BenchmarkShuffle1_10000 20000 882846 ns/op 243840 B/op 10001 allocs/op -BenchmarkShuffle1_100000 2000 9291741 ns/op 2405632 B/op 100001 allocs/op -BenchmarkShuffle1_1000000 100 153209564 ns/op 24007173 B/op 1000001 allocs/op -BenchmarkShuffle2_100 1000000 10913 ns/op 2528 B/op 103 allocs/op -BenchmarkShuffle2_1000 200000 113354 ns/op 24448 B/op 1003 allocs/op -BenchmarkShuffle2_10000 10000 1220831 ns/op 243904 B/op 10003 allocs/op -BenchmarkShuffle2_100000 2000 12294690 ns/op 2405696 B/op 100003 allocs/op -BenchmarkShuffle2_1000000 100 195267815 ns/op 24007237 B/op 1000003 allocs/op -BenchmarkShuffle3_100 1000000 18362 ns/op 832 B/op 101 allocs/op -BenchmarkShuffle3_1000 100000 181565 ns/op 8032 B/op 1001 allocs/op -BenchmarkShuffle3_10000 10000 1796956 ns/op 80032 B/op 10001 allocs/op -BenchmarkShuffle3_100000 1000 19094388 ns/op 800032 B/op 100001 allocs/op -BenchmarkShuffle3_1000000 50 242966292 ns/op 8000039 B/op 1000001 allocs/op -ok command-line-arguments 374.509s +BenchmarkShuffle0_100 3000000 4231 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_1000 300000 41704 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_10000 30000 416090 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_100000 3000 4554965 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle0_1000000 200 83843609 ns/op 0 B/op 0 allocs/op +BenchmarkShuffle1_100 2000000 8795 ns/op 2464 B/op 101 allocs/op +BenchmarkShuffle1_1000 200000 85891 ns/op 24384 B/op 1001 allocs/op +BenchmarkShuffle1_10000 20000 868768 ns/op 243840 B/op 10001 allocs/op +BenchmarkShuffle1_100000 2000 9321111 ns/op 2405632 B/op 100001 allocs/op +BenchmarkShuffle1_1000000 100 150531242 ns/op 24007173 B/op 1000001 allocs/op +BenchmarkShuffle2_100 1000000 11198 ns/op 2528 B/op 103 allocs/op +BenchmarkShuffle2_1000 200000 106654 ns/op 24448 B/op 1003 allocs/op +BenchmarkShuffle2_10000 10000 1090785 ns/op 243904 B/op 10003 allocs/op +BenchmarkShuffle2_100000 2000 11422546 ns/op 2405696 B/op 100003 allocs/op +BenchmarkShuffle2_1000000 100 173314206 ns/op 24007237 B/op 1000003 allocs/op +BenchmarkShuffle3_100 1000000 13421 ns/op 40 B/op 2 allocs/op +BenchmarkShuffle3_1000 100000 139189 ns/op 40 B/op 2 allocs/op +BenchmarkShuffle3_10000 10000 1460109 ns/op 40 B/op 2 allocs/op +BenchmarkShuffle3_100000 1000 13464979 ns/op 40 B/op 2 allocs/op +BenchmarkShuffle3_1000000 100 183529639 ns/op 40 B/op 2 allocs/op +ok command-line-arguments 355.166s ``` -## Conclusions +## Conclusion + +* `shuffle0` is the baseline. It represents the cost of a native (non-generic) implementation, or ad-hoc generics using some kind of source rewriting, e.g., with `go generate`. It is type safe. + +* `shuffle1` costs about 1.8x `shuffle0` for large datasets, and about 2x for small sets. It uses O(N) additional space (allocated prior to calling). It is an unfriendly implementation, since the user is required to convert a static type (`[]int`) into a dynamic (for lack of a better word) one (`[]interface{}`) before passing it in. + +* `shuffle2` costs about 2x `shuffle0` for large sets, and about 2.5x for small sets. It also uses O(N) additional space. The implementation is effectively the same `shuffle1`, except that it relieves the user from having to preprocess the slice. For a single call, `shuffle2` costs the same as `shuffle1`. + +* `shuffle3` costs about 2.2x `shuffle0` for large sets, and about 3x for small sets. It uses no additional space (except for a single extra temporary variable). This is the slowest technique, and also the ugliest. But the tradeoff here is the lack of memory overhead. -* `shuffle1` costs about 2x `shuffle0` -* `shuffle2` costs about 2.2x `shuffle0` -* `shuffle3` costs about 3x `shuffle0` \ No newline at end of file +-- Mohit Cheppudira - 0xFE \ No newline at end of file diff --git a/go/shuffle_test.go b/go/shuffle_test.go index 3693b7d..46ed5aa 100644 --- a/go/shuffle_test.go +++ b/go/shuffle_test.go @@ -9,6 +9,7 @@ package shuffle // $ go test -benchmem -bench=. shuffle_test.go import ( + "fmt" "math/rand" "reflect" "testing" @@ -60,12 +61,13 @@ func shuffle2(a interface{}) interface{} { // Technique 3: Uses reflection entirely and does an in-place shuffle. Almost illegible. func shuffle3(a interface{}) { val := reflect.ValueOf(a) + tmp := reflect.New(val.Index(0).Type()) for i := 0; i < val.Len(); i++ { j := rand.Intn(i + 1) - tmp := reflect.ValueOf(val.Index(j).Interface()) + tmp.Elem().Set(val.Index(j)) val.Index(j).Set(val.Index(i)) - val.Index(i).Set(tmp) + val.Index(i).Set(tmp.Elem()) } } @@ -107,6 +109,7 @@ func bmShuffle3(data []int, b *testing.B) { } } +// Shuffle 0 func BenchmarkShuffle0_100(b *testing.B) { bmShuffle0(DATA100, b) } @@ -123,6 +126,7 @@ func BenchmarkShuffle0_1000000(b *testing.B) { bmShuffle0(DATA1000000, b) } +// Shuffle 1 func BenchmarkShuffle1_100(b *testing.B) { bmShuffle1(DATA100, b) } @@ -139,6 +143,7 @@ func BenchmarkShuffle1_1000000(b *testing.B) { bmShuffle1(DATA1000000, b) } +// Shuffle 2 func BenchmarkShuffle2_100(b *testing.B) { bmShuffle2(DATA100, b) } @@ -155,6 +160,7 @@ func BenchmarkShuffle2_1000000(b *testing.B) { bmShuffle2(DATA1000000, b) } +// Shuffle 3 func BenchmarkShuffle3_100(b *testing.B) { bmShuffle3(DATA100, b) } From 39881adeb739e4761500cc3a40ccc6455a68cc2a Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 16:41:35 -0500 Subject: [PATCH 020/180] Moved shuffle benchmarks to own directory. --- go/{ => shuffle}/README.md | 0 go/{ => shuffle}/shuffle_test.go | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename go/{ => shuffle}/README.md (100%) rename go/{ => shuffle}/shuffle_test.go (100%) diff --git a/go/README.md b/go/shuffle/README.md similarity index 100% rename from go/README.md rename to go/shuffle/README.md diff --git a/go/shuffle_test.go b/go/shuffle/shuffle_test.go similarity index 100% rename from go/shuffle_test.go rename to go/shuffle/shuffle_test.go From f7d5b854e697d364f54b9baeb03a07e118bb96eb Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 16:52:04 -0500 Subject: [PATCH 021/180] Fix typos and clean up README.md. --- go/shuffle/README.md | 12 +++++------- go/shuffle/shuffle_test.go | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/go/shuffle/README.md b/go/shuffle/README.md index 1fcfd63..e214f06 100644 --- a/go/shuffle/README.md +++ b/go/shuffle/README.md @@ -1,20 +1,18 @@ -## A Generic Shuffle in Go +## Benchmarking a Generic Algorithm in Go Go does not have generics, but it does have reflection. It also has a kind of catch-all dynamic type: `interface{}`. You can put these together to write generic algorithms and containers. -This is a short analysis fo the performance implications of writing a generic alogrithm in Go. +The file `shuffle_test.go` in this directory benchmarks various generic implementations of the Fischer-Yates shuffle algorithm. Note that although you can use these techniques to reduce duplication in your code, you compromise on compile-time type saftey, which increases the liklihood of run-time bugs. ## The Code -The file `shuffle_test.go` in this directory benchmarks various implementations of a generic Fischer-Yates algorithm. - To run: $ go test -benchmem -bench=. shuffle_test.go -benchtime=10s -There are 4 types of `shuffle`: +We have four implementations of `shuffle` here: ### 1. `shuffle0` @@ -81,7 +79,7 @@ func shuffle3(a interface{}) { As of 2015/02/01 on my 1.7Ghz Core i7 MacBook Air with 8G 1600 MHz DDR3 RAM running OS X 10.9.5: -The tests were performed with 5 datasets, each with 100, 1000, 10^4, 10^5, and 10^6 elements. Test name `BenchmarkShuffle1_10000` refers to a benchmark of `shuffle1` on a 10000 element slice. +The tests were performed with 5 datasets, each with 10^2, 10^3, 10^4, 10^5, and 10^6 elements respectively. Test name `BenchmarkShuffle1_10000` refers to a benchmark of `shuffle1` on a 10000 element slice. Fields: test name, iterations, time per iteration, bytes allocated per iteration, number of allocations per iteration @@ -112,7 +110,7 @@ ok command-line-arguments 355.166s ## Conclusion -* `shuffle0` is the baseline. It represents the cost of a native (non-generic) implementation, or ad-hoc generics using some kind of source rewriting, e.g., with `go generate`. It is type safe. +* `shuffle0` represents the cost of a native (non-generic) implementation, or ad-hoc generics using some kind of source rewriting, e.g., with `go generate`. It is also how we would expect Go to perform if it had native generics. This is used as a baseline for the rest of the benchmarks. * `shuffle1` costs about 1.8x `shuffle0` for large datasets, and about 2x for small sets. It uses O(N) additional space (allocated prior to calling). It is an unfriendly implementation, since the user is required to convert a static type (`[]int`) into a dynamic (for lack of a better word) one (`[]interface{}`) before passing it in. diff --git a/go/shuffle/shuffle_test.go b/go/shuffle/shuffle_test.go index 46ed5aa..28a5846 100644 --- a/go/shuffle/shuffle_test.go +++ b/go/shuffle/shuffle_test.go @@ -6,7 +6,7 @@ package shuffle // 0xFE - Mohit Cheppudira // // To run: -// $ go test -benchmem -bench=. shuffle_test.go +// $ go test -benchmem -bench=. shuffle_test.go -benchtime=10s import ( "fmt" From 395d4c1716ca6bd4703479c8084750eaa6cc3c35 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sun, 1 Feb 2015 16:55:29 -0500 Subject: [PATCH 022/180] Added note about clarity. --- go/shuffle/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/shuffle/README.md b/go/shuffle/README.md index e214f06..50e94a5 100644 --- a/go/shuffle/README.md +++ b/go/shuffle/README.md @@ -4,7 +4,7 @@ Go does not have generics, but it does have reflection. It also has a kind of ca The file `shuffle_test.go` in this directory benchmarks various generic implementations of the Fischer-Yates shuffle algorithm. -Note that although you can use these techniques to reduce duplication in your code, you compromise on compile-time type saftey, which increases the liklihood of run-time bugs. +Note that although you can use these techniques to reduce duplication in your code, you compromise on compile-time type saftey (and code clarity), which increases the liklihood of run-time bugs. ## The Code From 83d671ffef065b3e841f44f3d693d5ab0cbe2e19 Mon Sep 17 00:00:00 2001 From: Mohit Cheppudira Date: Sat, 7 Feb 2015 15:42:25 -0500 Subject: [PATCH 023/180] Fixed shuffle algorithm. --- go/shuffle/shuffle_test.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/go/shuffle/shuffle_test.go b/go/shuffle/shuffle_test.go index 28a5846..13b58f5 100644 --- a/go/shuffle/shuffle_test.go +++ b/go/shuffle/shuffle_test.go @@ -9,7 +9,6 @@ package shuffle // $ go test -benchmem -bench=. shuffle_test.go -benchtime=10s import ( - "fmt" "math/rand" "reflect" "testing" @@ -30,8 +29,9 @@ func init() { // Native shuffle. No generics. Shuffle a slice of ints. func shuffle0(a []int) { + l := len(a) for i := range a { - j := rand.Intn(i + 1) + j := i + rand.Intn(l-i) a[i], a[j] = a[j], a[i] } } @@ -39,8 +39,9 @@ func shuffle0(a []int) { // Technique 1: requires user to convert specificially typed slice to // a slice of interface{}. Shuffles the copy in-place. func shuffle1(a []interface{}) { + l := len(a) for i := range a { - j := rand.Intn(i + 1) + j := i + rand.Intn(l-i) a[i], a[j] = a[j], a[i] } } @@ -62,9 +63,10 @@ func shuffle2(a interface{}) interface{} { func shuffle3(a interface{}) { val := reflect.ValueOf(a) tmp := reflect.New(val.Index(0).Type()) + l := val.Len() - for i := 0; i < val.Len(); i++ { - j := rand.Intn(i + 1) + for i := 0; i < l; i++ { + j := i + rand.Intn(l-i) tmp.Elem().Set(val.Index(j)) val.Index(j).Set(val.Index(i)) val.Index(i).Set(tmp.Elem()) From bc2b3fecb0db52e08913f7cc581449235743f2ef Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 19 Nov 2016 09:21:07 -0500 Subject: [PATCH 024/180] Move housing and tesla stats from private repo. --- stats/housing.py | 36 +++++++++++ stats/tesla.py | 164 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100755 stats/housing.py create mode 100755 stats/tesla.py diff --git a/stats/housing.py b/stats/housing.py new file mode 100755 index 0000000..5e3cc9e --- /dev/null +++ b/stats/housing.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Canada housing price index data from: +# +# http://www5.statcan.gc.ca/cansim/pick-choisir?lang=eng&id=03270046&p2=33 + +import matplotlib +import matplotlib.pyplot as plt +import pandas as pd +import numpy as np +from datetime import datetime, timedelta +import time + +matplotlib.style.use('ggplot') + +FILE="housing-price-index.csv" + +print "Loading housing data from: " + FILE +hpi = pd.read_csv(FILE, header=0, index_col=0, + names=["geo", "class", "part", "vector", "coordinate", "value"]) + +print "Munging data..." +hpi = hpi.apply(pd.to_numeric, args=('ignore',)) +hpi.value = pd.to_numeric(hpi.value, errors="coerce") +hpi.index = pd.to_datetime(hpi.index) + +print hpi.geo.value_counts() +print +print "Plotting Kitchener-Cambridge-Waterloo..." +hpi[(hpi.geo=="Kitchener-Cambridge-Waterloo, Ontario") & (hpi.part=="Total (house and land)")].value.plot(label="total") +hpi[(hpi.geo=="Kitchener-Cambridge-Waterloo, Ontario") & (hpi.part=="Land only")].value.plot(label="land") +hpi[(hpi.geo=="Kitchener-Cambridge-Waterloo, Ontario") & (hpi.part=="House only")].value.plot(label="house") + +plt.legend(loc="best") +plt.axes().set_title("Kitchener-Cambridge-Waterloo") +plt.show() \ No newline at end of file diff --git a/stats/tesla.py b/stats/tesla.py new file mode 100755 index 0000000..9affc79 --- /dev/null +++ b/stats/tesla.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python +# +# Tesla Model S energy cost calculator. Also provides a +# cost comparison vs. gas prices (in local area). +# +# Author: mohit@muthanna.com (0xfe@github) + +# Usage: +# +# $ mongod --config /usr/local/etc/mongod.conf & +# $ ~/w/stats/tesla-restore.py (optional, to restore mongodb backup from S3) +# $ ./tesla.py +# +# Exploring the data: +# +# $ ipython --pylab +# +# In [1]: %run ./tesla.py +# +# In [2]: frames['climateState'].outside_temp.dropna().resample('D',how='max').plot(kind='bar') +# +# Make sure MongoDB is running, and that you've restored +# a recent TeslaMS backup. See: tesla-restore.py. + +import matplotlib +import matplotlib.pyplot as plt +import pandas as pd +import numpy as np +from datetime import datetime, timedelta +import time +import pymongo as pm + +matplotlib.style.use('ggplot') + +# Load gas prices: http://www.energy.gov.on.ca/en/fuel-prices/ +# gas = pd.read_csv("ONTPRM2015.csv", header=1, index_col=0) + +# Connect to local database +client = pm.MongoClient() + +# Database: tesla, Collection: tesla_stream +db = client.tesla +coll = db.tesla_stream +aux = db.tesla_aux + +forever = (datetime.now() - timedelta(hours=(24 * 31000))) +all_month = (datetime.now() - timedelta(hours=(24 * 31))) +all_week = (datetime.now() - timedelta(hours=(24 * 7))) + +filter_ms = time.mktime(forever.timetuple()) * 1000 + +# Get all rows +# c = coll.find() +# Get last week's rows +c = coll.find({"ts": {"$gt": filter_ms}}) +ca = aux.find({"ts": {"$gt": filter_ms}}) + +print "Loading data..." +df = pd.DataFrame([r['record'] for r in list(c)], + columns=['ts', 'speed', 'odometer', 'soc', 'elevation', + 'est_heading', 'est_lat', 'est_lng', 'power', + 'shift_state', 'range', 'est_range', 'heading']) +print "Loaded." + +print "Loading aux..." + +arrays = { + 'vehicles': [], + 'chargeState': [], + 'vehicleState': [], + 'climateState': [] +} + +for r in ca: + for t in arrays.keys(): + if r.has_key(t): + # Append record to the relevant array. We + # don't create a dataframe and append incrementally + # because it's super slow: DataFrame appends copies + # and recreates new frames. + r[t]['ts'] = r['ts'] + arrays[t].append(r[t]) + break + +frames = { + 'stream': df +} + +# Lump create DataFrame from each array. +for k, array in arrays.iteritems(): + frames[k] = pd.DataFrame(array) + +print "Loaded." + +for k in frames.keys(): + # Convert all strings to numeric + print "Processing: " + k + " size " + str(frames[k].size) + "..." + if frames[k].size < 1: + print "Skipping empty frame." + continue + + frames[k] = frames[k].apply(pd.to_numeric, args=('coerce',)) + + # Convert 'ts' to datetime + frames[k].ts = pd.to_datetime(frames[k].ts / 1000, unit='s') + + # Index by timestamp, and set timezone to local + frames[k] = frames[k].set_index('ts').tz_localize('UTC').tz_convert('US/Eastern') + + print frames[k].info() + +# Cost of residential power: +# From: https://www.kwhydro.on.ca/en/residential/residential-electricity-rates.asp +KW_PEAK = 17.5 # weekdays 7am to 11am and 5pm to 7pm +KW_OFF_PEAK = 12.8 # weekends and holidays full day, and weekdays 7pm to 7am +KW_MID_PEAK = 8.3 # weekdays 11am to 5pm +# electricity + delivery network + delivery connection + distribution + regulatory + debt +KW_EXTRAS = 0.72 + 0.7 + 0.15 + 0.15 + 0.5 + 0.7 +KW_MONTHLY = 11.64 + +charged_kw = (frames['chargeState'].charger_actual_current * frames['chargeState'].charger_voltage) / 1000 +charged_kwh = charged_kw.resample('min').fillna(0).resample('H') # Resample to hourly, defaults to mean. + +# Merge weekend and offpeak hours +weekend_watts = charged_kwh[(charged_kwh.index.dayofweek == 5) | (charged_kwh.index.dayofweek == 6)] +weekday_watts = charged_kwh[(charged_kwh.index.dayofweek >= 0) & (charged_kwh.index.dayofweek < 5)] + +offpeak_watts = pd.concat([weekend_watts, charged_kwh.between_time('19:00', '6:59')]).drop_duplicates() +peak_watts = pd.concat([weekday_watts.between_time('7:00', '10:59'), weekday_watts.between_time('17:00', '18:59')]).drop_duplicates() +midpeak_watts = weekday_watts.between_time('11:00',' 16:59') + +offpeak_cost = offpeak_watts * ((KW_OFF_PEAK + KW_EXTRAS) / 100) +peak_cost = peak_watts * ((KW_PEAK + KW_EXTRAS) / 100) +midpeak_cost = midpeak_watts * ((KW_MID_PEAK + KW_EXTRAS) / 100) + +daily_cost = pd.DataFrame({ + "kwh": charged_kwh.resample("D", how="sum"), + # alternate miles: frames['stream'].odometer.diff().resample("D", how="sum") + "miles": frames['stream']['odometer'].resample('D', how=lambda a: max(a) - min(a)), + "offpeak": offpeak_cost.resample('D', how="sum"), + "peak": peak_cost.resample('D', how="sum"), + "midpeak": midpeak_cost.resample('D', how="sum"), + }).fillna(0) + +daily_cost['km'] = daily_cost.miles * 1.609344 +daily_cost['total'] = daily_cost.offpeak + daily_cost.peak + daily_cost.midpeak +daily_cost = daily_cost.reindex(columns=["km", "miles", "kwh", "offpeak", "midpeak", "peak", "total"]) + +# Weekly summarized on Sunday (Mon - Sun). To summarize on, say, Wednesday, use "W-WED" +weekly_cost = daily_cost.resample('W', how="sum", kind="period") + +# No need for fixed costs, because you'd be paying it anyway: +# weekly_cost['fixed'] = KW_MONTHLY / 4.5 # prorated fixed monthly cost +# weekly_cost['final'] = weekly_cost.total + weekly_cost.fixed + +# nissan fuel economy: 8km/L, avg. premium gas cost: $1.24/L +nissan_cost = (weekly_cost.km.sum() / 8.0) * 1.24 + +print weekly_cost +print +print "Tesla: $" + str(weekly_cost.total.sum()) + ", Nissan: $" + str(nissan_cost) +print "Ratio: " + str((weekly_cost.total.sum() / nissan_cost) * 100) + "%" + +df = frames['stream'] \ No newline at end of file From 3467de225c999e226dd5bd5040c669a4b3b1f8cf Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 3 Jan 2017 21:09:06 -0500 Subject: [PATCH 025/180] Jupyter helloworld. --- stats/helloworld.ipynb | 126 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 stats/helloworld.ipynb diff --git a/stats/helloworld.ipynb b/stats/helloworld.ipynb new file mode 100644 index 0000000..3decd50 --- /dev/null +++ b/stats/helloworld.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Jupyter Helloworld\n", + "\n", + "This is inside a docker container.\n", + "\n", + "### Quick run on Mac\n", + "\n", + " $ brew cask install docker\n", + " # Run Applications -> Docker\n", + " $ docker run -it --rm -p 8888:8888 -v `pwd`:/home/jovyan/work jupyter/tensorflow-notebook\n", + " \n", + "More: https://github.com/jupyter/docker-stacks/tree/master/tensorflow-notebook" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is inside a docker container.\n", + "\n", + "* *Cmd-Enter* - Run cell\n", + "* *Esc* - Command mode\n", + "* *Enter* - Edit mode\n", + "* *Shift-Enter* - New cell below\n", + "* *Esc - M* - Make cell Markdown" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([10, 20, 30])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = np.array([10,20,30])\n", + "b = np.random.randn(10)\n", + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.plot(b)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 6fde6a6b3ccfdec4365173372fbefc6c24418cc7 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Wed, 4 Jan 2017 10:13:21 -0500 Subject: [PATCH 026/180] Added README --- stats/README.md | 8 ++++ stats/helloworld.ipynb | 95 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 stats/README.md diff --git a/stats/README.md b/stats/README.md new file mode 100644 index 0000000..5f3f30c --- /dev/null +++ b/stats/README.md @@ -0,0 +1,8 @@ +# Start Jupyter in Docker on Mac + +```bash +$ brew cask install docker +# Run Applications -> Docker +$ docker run -it --rm -p 8888:8888 -v `pwd`:/home/jovyan/work jupyter/tensorflow-notebook +``` + diff --git a/stats/helloworld.ipynb b/stats/helloworld.ipynb index 3decd50..0bd8c4e 100644 --- a/stats/helloworld.ipynb +++ b/stats/helloworld.ipynb @@ -10,9 +10,11 @@ "\n", "### Quick run on Mac\n", "\n", - " $ brew cask install docker\n", - " # Run Applications -> Docker\n", - " $ docker run -it --rm -p 8888:8888 -v `pwd`:/home/jovyan/work jupyter/tensorflow-notebook\n", + "```bash\n", + "$ brew cask install docker\n", + "# Run Applications -> Docker\n", + "$ docker run -it --rm -p 8888:8888 -v `pwd`:/home/jovyan/work jupyter/tensorflow-notebook\n", + "```\n", " \n", "More: https://github.com/jupyter/docker-stacks/tree/master/tensorflow-notebook" ] @@ -33,9 +35,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This is inside a docker container.\n", - "\n", - "* *Cmd-Enter* - Run cell\n", + "* *Ctrl-Enter* - Run cell\n", "* *Esc* - Command mode\n", "* *Enter* - Edit mode\n", "* *Shift-Enter* - New cell below\n", @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -55,20 +55,45 @@ "array([10, 20, 30])" ] }, - "execution_count": 15, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.array([10,20,30])\n", - "b = np.random.randn(10)\n", + "b = np.random.randn(1000)\n", + "c = np.random.rand(1000)\n", "a" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "a.shape[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 41, "metadata": { "collapsed": false }, @@ -76,18 +101,18 @@ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 18, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAFkCAYAAABxWwLDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl4VOX5xvHvg6xuoCigFuuCKFpFE1FBEGa0tVpFxTVu\nuNUqbk3dftaqrUttFcQVtbYVtBpri1ZRqxYrIggKiWBVEIu4K5sYFEWBvL8/nkkJkZCcZE7OzOT+\nXNdcMZM5k2cAk3ve5XkthICIiIhIFK2SLkBERETyjwKEiIiIRKYAISIiIpEpQIiIiEhkChAiIiIS\nmQKEiIiIRKYAISIiIpEpQIiIiEhkChAiIiISmQKEiIiIRBZrgDCzy8zsFTNbambzzexRM+tZzzUD\nzayq1m2VmXWJs1YRERFpuLhHIAYAtwF7AwcAbYBnzaxDPdcFYAegW+a2RQhhQZyFioiISMNZcx6m\nZWabAQuA/UIIk+p4zEDg38AmIYSlzVaciIiINFhzr4HohI8ufFbP4wyYYWYfm9mzZtYv/tJERESk\noZptBMLMDBgHbBRCGLiOx/UEBgLTgXbAT4GTgL1CCDPW8vjOwIHAu8Dy7FcuIiJSsNoD2wDPhBAW\nR7mwOQPEnfgv+n1DCJ9EvHYC8F4IYehavnY88EBWihQREWmZTgghPBjlgtZxVVKTmd0OHAwMiBoe\nMl4B9q3ja+8C/OUvf6FXr16NKzDHlJaWMnLkyKTLyJpCej2F9FpAryeXFdJrAb2eXDVr1ixOPPFE\nyPwujSL2AJEJD4cBA0MI7zfyaXYH6goeywF69epFUVFRI58+t3Ts2LFgXgsU1usppNcCej25rJBe\nC+j15IHISwBiDRBmNgooAQYDy8ysa+ZLlSGE5ZnH/BbYqnp6wswuAOYBb+BzMz8FUsAP46xVRERE\nGi7uEYiz8F0XE2rdfypwX+a/twC61/haW2AEsCXwFfAasH8IYWKslYqIiEiDxRogQgj1bhMNIZxa\n6/MbgRtjK0pERESaTGdh5KCSkpKkS8iqQno9hfRaQK8nlxXSawG9nkLUrJ0o42BmRUB5eXl5oS1o\nERERiVVFRQXFxcUAxSGEiijXagRCREREIlOAEBERkcgUIERERCQyBQgRERGJTAFCREREIlOAEBER\nkcgUIERERCQyBQgRERGJTAFCREREIlOAEBERkcgUIERERCQyBQgRERGJTAFCREREIlOAEBERkcgU\nIERERCQyBQgRERGJTAFCREREIlOAEBERkcgUIERERCQyBQgRERGJTAFCREREIlOAEBERkcgUIERE\nRCQyBQgRERGJTAFCREREIlOAkFiFkHQFIiISBwUIic38+bD55jB+fNKViIhItilASGxuuw0WL4bH\nHku6EhERyTYFCInFsmUwahS0bQv//nfS1YiISLYpQEgs7r0Xli6Fq6+GN9+ETz9NuiIREckmBQjJ\nulWr4Kab4JhjYOhQv2/ChERLEhGRLIs1QJjZZWb2ipktNbP5ZvaomfVswHWDzKzczJab2RwzGxpn\nnZJdjzwC8+bBhRdCt26w886axhARKTRxj0AMAG4D9gYOANoAz5pZh7ouMLNtgCeA54DewC3AH83s\nhzHXKlkQAtx4I6RSUFzs96VSChAiIoWmdZxPHkI4uObnZnYKsAAoBibVcdnZwDshhEsyn79lZv2B\nUuBfMZUqWTJpEkybBk89tfq+dBruuAPefx+23jq52kREJHuaew1EJyAAn63jMfsAtTsHPAP0jaso\nyZ7hw33K4sc/Xn3fwIFgBs8/n1xdIiKSXc0WIMzMgJuBSSGEN9fx0G7A/Fr3zQc2NrN2cdUnTffW\nW/D443DRRR4YqnXuDL17axpDRKSQNOcIxChgZ+C4Zvye0oxGjIAttoDjj//u19JpH4FQa2sRkcIQ\n6xqIamZ2O3AwMCCE8Ek9D/8U6Frrvq7A0hDCN3VdVFpaSseOHde4r6SkhJKSkkZULFHNnw/33Qe/\n/jW0W8s4UTrtWzvnzoUePZq9PBGRFq+srIyysrI17qusrGz081mI+S1hJjwcBgwMIbzTgMf/Djgo\nhNC7xn0PAp1qL8rMfK0IKC8vL6eoqCiLlUsUV17pAeGDD2CTTb779aVLYdNNvTvlmWc2f30iIvJd\nFRUVFPuWueIQQkWUa+PuAzEKOAE4HlhmZl0zt/Y1HvNbMxtT47K7gO3M7PdmtqOZDQOOAm6Ks1Zp\nvK++8l0WZ5yx9vAAsPHGsOeeWkgpIlIo4l4DcRawMTAB+LjG7Zgaj9kC6F79SQjhXeAneN+IGfj2\nzdNDCDrTMUfdey98/jn8/Ofrflw67QsptQ5CRCT/xd0Hot6AEkI4dS33TcR7RUiOq25bffTRsM02\n635sKgXXX+9nY+yyS7OUJyIiMdFZGNIk//gHvPOOb92sz777Qps2msYQESkEChDSaNVtqwcN8vUN\n9Vl/fejbV/0gREQKgQKENNrkyfDyyw0bfaiWSvnJnFVVsZUlIiLNQAFCGm34cOjVCw46qOHXpNOw\nZAnMnBlfXSIiEj8FCGmUmm2rW0X4V7T33tChg6YxRETynQKENMrIkdClC5xwQrTr2rXzxZQKECIi\n+U0BQiJbsADGjIHzz1972+r6pNMwcSKsWJH92kREpHkoQEhkd9zh0xZnndW469Np+PJLKC/Pbl0i\nItJ8FCAkkuq21aef7mdbNEZxMWy0kaYxRETymQKERDJmjO+iKC1t/HO0bg377aeGUiIi+UwBQhqs\num31UUfBtts27bnSaZg0Cb6p84B2ERHJZQoQ0mCPPQb//W+0xlF1SaVg+XKYOrXpzyUiIs1PAUIa\nbPhwn3ro06fpz9W7tx/9rWkMEZH8pAAhDfLSSzBlClx8cXaer1UrH4XQQkoRkfykACENMnw47LQT\nHHxw9p4zlfIpjK++yt5ziohI81CAkHq9/bYf233hhdHaVtcnnfZmUpMnZ+85RUSkeShASL1uugk2\n3xxOPDG7z9urF3TtqmkMEZF8pAAh67RwIYweDeedB+3bZ/e5zbQOQkQkXylAyDqNGuXTFmefHc/z\np9MwfTpUVsbz/CIiEg8FCKnT11/D7bfDaadB587xfI90Gqqq4MUX43l+ERGJhwKE1GnMGPjsM/j5\nz+P7HtttB927axpDRCTfKEDIWlW3rR4yBLbfPr7vY+ajEGooJSKSXxQgZK3GjfPtm9loW12fdBpm\nzIDFi+P/XiIikh0KELJWw4fDgAGw997xf69Uyj9OmBD/9xIRkexQgJDvmDLFmzs1x+gD+BqIHj00\njSEikk8UIOQ7hg+Hnj3hkEOa73um01pIKSKSTxQgZA3//S88+mj221bXJ5WCWbPg00+b73uKiEjj\nKUDIGkaO9LbVJ5/cvN+3eh2EpjFERPKDAoT8z6JFcO+9cO652W9bXZ+uXWHnnTWNISKSLxQg5H9G\njfKPcbWtro/6QYiI5A8FCAFWt60+9VTYbLNkakinYe5ceO+9ZL6/iIg0nAKEAHD//T6F8YtfJFfD\nwIHemVKjECIiuU8BQqiqghEj4m9bXZ9NN4Xdd1eAEBHJBwoQwrhxMGdO8zWOWpfqfhAhJF2JiIis\nS6wBwswGmNnjZvaRmVWZ2eB6Hj8w87iat1Vm1iXOOlu64cNh331hn32SrsS3c374ofejEBGR3BX3\nCMQGwAxgGNDQ95QB2AHolrltEUJYEE95MnUqTJqUG6MP4OdvrLeepjFERHJdrAEihPB0COHKEMJj\ngEW4dGEIYUH1La76xNc+7LADDF7n2FDz2Xhj6NNH/SBERHJdLq6BMGCGmX1sZs+aWb+kCypUc+fC\nI480f9vq+qRSPgKhdRAiIrkrh35tAPAJ8DPgSGAI8AEwwcx2T7SqAjVypO98aO621fVJp2HBAnjz\nzaQrERGRurROuoCaQghzgDk17ppqZtsDpcDQdV1bWlpKx44d17ivpKSEkpKSrNdZCBYvhj//GS69\nFDp0SLqaNfXrB23b+jTGLrskXY2ISGEoKyujrKxsjfsqKysb/XwWmmmc2MyqgMNDCI9HvO4GYN8Q\nwr51fL0IKC8vL6eoqCgLlbYM114L110HH3yQXOfJdRk40EdHHn006UpERApXRUUFxcXFAMUhhIoo\n1+baFMba7I5PbUiWLF8Ot92WbNvq+qTT8MILsGpV0pWIiMjaxN0HYgMz611jDcN2mc+7Z75+vZmN\nqfH4C8xssJltb2a7mNnNQAq4Pc46W5r774eFC6G0NOlK6pZOw5IlMHNm0pWIiMjaxD0CsSfwKlCO\n93cYAVQAv8l8vRvQvcbj22Ye8xowAdgV2D+EMCHmOluM6rbVhx/u2zdz1V57+doMbecUEclNsS6i\nDCG8wDpCSgjh1Fqf3wjcGGdNLd2TT8Jbb8G99yZdybq1awf9+/t2zlxpciUiIqvlwxoIyaLhw32X\nQ9++SVdSv3QaJk6EFSuSrkRERGpTgGhBXnnFfyHnyzv6VAq+/BKmT0+6EhERqU0BogUZPhx69Mid\nttX1KS6GjTbSuRgiIrlIAaKFeOcdGDsWfvELP6wqH7Ru7f0gtJBSRCT3KEC0EDff7I2Zhq6zn2fu\nSaVg8mT45pukKxERkZoUIFqAzz6DP/0JzjkH1l8/6WqiSae98dXUqUlXIiIiNSlAtAB33un9H4YN\nS7qS6HbbzUdONI0hIpJbFCAKXHXb6qFDoUuXpKuJrlUrGDRIAUJEJNcoQBS4Bx7wo7F/8YukK2m8\ndBpefhmWLUu6EhERqaYAUcCq21Yfdhj07Jl0NY2XTnszqcmTk65ERESqKUAUsKeeglmz8qdxVF12\n2gm6ddM0hohILlGAKGDDh8M++3jr6nxm5ts51VBKRCR3KEAUqGnT4IUXfPTBLOlqmi6d9pbWlZVJ\nVyIiIqAAUbBGjIDtt/djuwtBKuVrOiZOTLoSEREBBYiCNG8e/O1v+dW2uj7bbQdbb61pDBGRXKEA\nUYBuvhk22QROOSXpSrLHzKcxtJBSRCQ3KEAUmOq21cOG5V/b6vqkUjBzJixalHQlIiKiAFFg7r4b\nVq6Ec89NupLsS6X84wsvJFuHiIgoQBSUb76BW2/N37bV9eneHXbYQdMYIiK5QAGigDzwAHz6aX63\nra5PKqUAISKSCxQgCkRVlTeOGjwYdtwx6Wrik07D7NnwySdJVyIi0rIpQBSIp58ujLbV9Rk0yD9q\nO6eISLIUIArE8OGw997Qv3/SlcSra1fYZRdNY4iIJK110gVI05WX+zvyv/2tMNpW1yedhiefTLoK\nEZGWTSMQBWD4cNh2WzjiiKQraR7pNLzzDrz7btKViIi0XAoQee7ddwuvbXV9Bg70kRatgxARSY4C\nRJ675Rbo2BFOPTXpSprPJpvAHnsoQIiIJEkBIo8tWQL33ONtqzfYIOlqmlf1uRghJF2JiEjLpACR\nx+6+G1asKMy21fVJpeCjj+Dtt5OuRESkZVKAyFPVbatPPtm3NrY0Awb4mg9NY4iIJEMBIk+VlXk3\nxkJuW70uG20Ee+2lfhAiIklRgMhDIfjWzUMPhV69kq4mOamUj0BoHYSISPNTgMhDTz8Nb7xR+G2r\n65NOw8KF/mchIiLNK9YAYWYDzOxxM/vIzKrMbHADrhlkZuVmttzM5pjZ0DhrzEfDh0OfPr4OoCXr\n1w/attU0hohIEuIegdgAmAEMA+odaDazbYAngOeA3sAtwB/N7IfxlZhfKir8F+ZFF7WMttXr0qED\n9O2rACEikoRYz8IIITwNPA1g1qBfd2cD74QQLsl8/paZ9QdKgX/FU2V+GTHC21YPGZJ0JbkhnYaR\nI2HVqpbTiVNEJBfk2hqIfYDxte57BuibQC0557334K9/hdJSaK1j0AAPEJ9/DjNmJF2JiEjLkmsB\nohswv9Z984GNzaxdAvXklFtugY03blltq+uz116w/vqaxhARaW4F8z62tLSUjh07rnFfSUkJJSUl\nCVWUXZ9/7m2rzz8fNtww6WpyR9u20L+/b+e8+OKkqxERyV1lZWWUlZWtcV9lZWWjny/XAsSnQO2+\nil2BpSGEb9Z14ciRIykqKoqtsKT94Q/w7bcts211fdJpuOYab+vdpk3S1YiI5Ka1vamuqKiguLi4\nUc+Xa1MYU4D9a933o8z9Lda33/r0xUknwRZbJF1N7kmlYNkymD496UpERFqOuPtAbGBmvc1s98xd\n22U+7575+vVmNqbGJXdlHvN7M9vRzIYBRwE3xVlnrisrg48/brltq+tTVORrQ7QOQkSk+cQ9ArEn\n8CpQjveBGAFUAL/JfL0b0L36wSGEd4GfAAfg/SNKgdNDCLV3ZrQY1W2rf/IT2HnnpKvJTa1bw8CB\nChAiIs0p7j4QL7COkBJC+M5+ghDCRKBxEzIF6Nln4fXX4bbbkq4kt6VS8MtfwvLl0L590tWIiBS+\nXFsDIbUMHw577unvsKVu6bSHh6lTk65ERKRlUIDIYa++CuPHq211Q+y6K3TurGkMEZHmogCRw0aM\ngO9/H448MulKcl+rVjBokPeDEBGR+ClA5KgPPoCHHlLb6ijSaZ/CWLYs6UpERAqfAkSOuuUW2Ggj\nOP30pCvJH6kUrFwJkyYlXYmISOFTgMhBlZXeefLss9W2OoqddoJu3TSNISLSHBQgctAf/uA7Cs47\nL+lK8ouZT2NoIaWISPwUIHJMddvqE09U2+rGSKWgvNxHcUREJD4KEDnmr3+Fjz6CCy9MupL8lE5D\nVRVMnJh0JSIihU0BIod8+CH83/952+pddkm6mvy07ba+9VXTGCIi8VKAyBFffAGHHOJbNv/4x6Sr\nyV9mPo2hACEiEi8FiBywciUccwzMmwdPPeU7CaTx0ml47TVYtCjpSkRECpcCRMJC8N0W48fD2LGa\nusiGVMo/TpiQaBkiIgVNASJhI0bAXXfB3XfDAQckXU1h+N73YIcdNI0hIhInBYgEjR0LF1/sx1Cf\ndlrS1RSWdFoNpURE4qQAkZCpU73Xw3HHwTXXJF1N4UmnYfZs+PjjpCsRESlMChAJeOcdGDwYiovh\n3nv9JEnJrkGD/KNGIURE4qFfXc1syRLv89CxI/zjH9C+fdIVFaYuXeAHP1CAEBGJiw6KbkbffgtD\nhsDChTBlCmy2WdIVFbZ0GsaNS7oKEZHCpBGIZhICnHEGvPSSjzzssEPSFRW+VMp7a7z7btKViIgU\nHgWIZnL11XD//TBmDPTvn3Q1LcPAgd6ZUtMYIiLZpwDRDO6/H379a7juOt91Ic1jk02gqEj9IERE\n4qAAEbMJE+D00/122WVJV9PyVJ+LEULSlYiIFBYFiBjNng1HHOFD6Xfe6cPp0rzSae8F8fbbSVci\nIlJYFCBismABHHwwbLUV/P3v0KZN0hW1TP37+wmnmsYQEckuBYgYfP01HHaYf3zySe/5IMnYaCPo\n00cBQkQk2xQgsqyqCk46yY+THjcOvv/9pCuSdNrXolRVJV2JiEjhUIDIsv/7P3jkEXjwQdhzz6Sr\nEfAAsXAhvPFG0pWIiBQOBYgsuvtuuPFGGDnSpzAkN/TtC23bahpDRCSbFCCy5Omn4Zxz4Lzz4IIL\nkq5GaurQAfr1U0MpEZFsUoDIgpkz4eijfdfFyJFJVyNrU70OYtWqpCsRESkMChBN9NFHfrpmz56+\n7mG99ZKuSNYmlYLKSnj11aQrEREpDAoQTfDFF3DIIdCqFTzxBGy4YdIVSV322gvWX1/TGCIi2RJ7\ngDCzc8xsnpl9bWZTzazPOh470Myqat1WmVmXuOuMauVKP9di7lzv9bDFFklXJOvSti0MGKCFlCIi\n2RJrgDCzY4ERwFXAHsBM4Bkz22wdlwVgB6Bb5rZFCGFBnHVGFYIvlHzmGe8yueuuSVckDZFKwYsv\nwooVSVciIpL/4h6BKAXuDiHcF0KYDZwFfAWcVs91C0MIC6pvMdcY2ciRMGoU3HUX/OhHSVcjDZVO\nw7JlMG1a0pWIiOS/2AKEmbUBioHnqu8LIQRgPNB3XZcCM8zsYzN71sz6xVVjYzz6KFx0kTeMOuOM\npKuRKPbYw9uKaxpDRKTp4hyB2AxYD5hf6/75+NTE2nwC/Aw4EhgCfABMMLPd4yoyildegRNOgGOO\ngeuuS7oaiap1a9hvPwUIEZFsaJ10ATWFEOYAc2rcNdXMtsenQoYmU5WbNw8OPdTfxY4e7TsvJP+k\n0z56tHw5tG+fdDUiIvkrzgCxCFgFdK11f1fg0wjP8wqwb30PKi0tpWOtYy9LSkooKSmJ8K3WbskS\n7/Ww0Ubw2GP6xZPP0mn45huYMsUXVYqItBRlZWWUlZWtcV9lZWWjn898WUI8zGwq8HII4YLM5wa8\nD9waQrixgc/xLLA0hHBUHV8vAsrLy8spKirKUuWrffst/PjH3m1yyhRvGCX5q6oKunSBs8+Ga65J\nuhoRkWRVVFRQXFwMUBxCqIhybdxTGDcBo82sHB9JKAXWB0YDmNn1wJYhhKGZzy8A5gFvAO2BnwIp\n4Icx17lWIcCZZ8LkyTB+vMJDIWjVykce1FBKRKRpYg0QIYSHMz0frsanLmYAB4YQFmYe0g3oXuOS\ntnjfiC3x7Z6vAfuHECbGWWddrr0WxoyBBx7wJkRSGNJpOP98+PJLdQ8VEWms2BdRhhBGAaPq+Nqp\ntT6/EWjQ1EbcHngArrzSh7mPPz7paiSbUinvJDppkk9PiYhIdNpLsBYTJ8Jpp8Epp8DllyddjWTb\njjt663FNY4iINJ4CRC1vvQWHHw79+8Pdd4NZ0hVJtpn5NIb6QYiINJ4CRA0LF8LBB/u707Fj/QAm\nKUypFFRUwOefJ12JiEh+UoDI+PprOOwwPyvhySehU6ekK5I4pdO+pXNiIstzRUTynwIE/otk6FCY\nMQPGjYNttkm6Ionbttv637OmMUREGienWlkn5Ze/9GO5H3kE+vRJuhppLqmUAoSISGO1+BGIe+6B\n3/8eRozwxZPScqTT8J//+NoXERGJpkUHiGee8ZbG55wDP/950tVIc6s+C2PChETLEBHJSy02QLz2\nGhx9tDcSuvlmbddsibbaytuTaxpDRCS6FhkgPv7YT9fs0QMeeghaayVIi5VOq6GUiEhjtLgA8eWX\ncMgh/t9PPKGzEFq6dNqbh338cdKViIjklxYVIFauhOOOg//+13s9bLll0hVJ0gYN8o8ahRARiabF\nBIgQfKHk00/D3/4Gu+2WdEWSCzbfHHbdVesgRESiajEB4uab4Y47YNQoOPDApKuRXKJzMUREomsR\nAeLRR+HCC+GSS+DMM5OuRnJNKgXvvgvz5iVdiYhI/ij4APHKK3DCCXDUUXD99UlXI7lo4EBo1Urr\nIEREoijoAPHuu3DoobD77jBmjP+SEKmtUycoKtI0hohIFAX7K/Xzz/1o7g03hMcegw4dkq5Iclkq\n5SMQISRdiYhIfijIAPHtt3DkkfDpp/DUU77SXmRd0mnvBTFnTtKViIjkh4ILECHAz34GL77oiyd3\n3DHpiiQf9O/vHUk1jSEi0jAFFyCuuw5Gj4Y//9kXx4k0xIYbwl57aSGliEhDFVSAePBBuOIK+M1v\n4MQTk65G8k31uRhVVUlXIiKS+womQFRUwKmnwtChHiJEokqlYNEieP31pCsREcl9BRMgLrwQ9t0X\n/vAHHc0tjdO3L7Rrp2mMfDRnDpx9Nrz5ZtKVSEswdy4sXJh0FckrmACx6aYwdiy0bZt0JZKvOnSA\nfv20kDKfLFsGl10GP/gB3H23n7S7eHHSVUmhCgF+9zvo0QO6dIFttoGjj4YbbvA3HkuXJl1h8yqY\nAHHrrbDJJklXIfkulYIXXoBVq5KuRNYlBD8Ub6edYORI+OUv4Y034IsvvOvsihVJVyiFZtUqOOcc\nD6y//CU89JD/W1uwAK6+2tdQdeoEvXrBySfD7bfDyy/D8uVJVx6f1kkXkC1bbZV0BVII0mm48kp4\n9VXYc8+kq5G1mTULzjsPnnvOO83efDNst51/bexY2H9/P3n3jjuSrVMKx1dfQUkJPPkk3HMPnHGG\n33/ssf5x1SqYPRumTVt9++tfvSdR69Z++nOfPqtvO+/s9+e7AngJItnTpw9ssIFPYyhA5JYvvoBr\nrvERh+9/H554An7ykzUfs99+Hhx+9jM/pv2ss5KpVQrHokUeVF97DR5/3Dsc17beerDLLn475RS/\n75tv4D//WR0oJk/28FFV5dOlRUVrhooePfJv/Z6FPO/da2ZFQHl5eTlFRUVJlyMF4Mc/9o9PP51s\nHeJC8HdzF14IS5b48PFFF0H79nVfc955cNdd8K9/waBBzVaqFJi5c+Ggg6Cy0kcfmvqm4ssvfcdg\nzZGKd97xr3Xq5M9fM1RstVX8oaKiooLi4mKA4hBCRZRrNQIhUks67XOa336rRblJe+MNDwPPPw9H\nHAE33eQL1+pz002+I+Ooo/yH9Lbbxl6qFJhp03yEq1MnmDJl9TRZU2y4oY+S7bff6vsWL4bp01cH\nitGjV58c3a3bmoGiTx/o3LnpdWRLwSyiFMmWdNpX90+blnQlLdfSpT7isPvu8OGHPhr0yCMNCw8A\nbdrAww/7D//Bg336Q6ShnnzSR6569ICXXspOeKhL585w4IHwq1/5wY8ff+z/5h99FE47zRdhjhzp\nIyGbbea1HHssDB/uC76T/LetEQiRWvbYAzp29HUQ++6bdDUtSwjeUfaiizxEXH01/OIX3p8jqs6d\n/Qdy375w0kkeQFrpLZPU4557vKfIoYfCAw/A+us3fw1bbeW3ww/3z0Pw6ZSaUx9XXeWLO81850fN\nUYrevRv3/0xUChAitay3np+j8vzz6mranP7zHzj3XJg40aceRoyArbdu2nPusosHksGD/QfuNddk\np1YpPCGs/jcybJi3BlhvvaSrcmY+GtKjh+8GAVi50nck1QwVDz7oW5jbtFlz58dee3nIyPbriT2P\nm9k5ZjbPzL42s6lm1qeexw8ys3IzW25mc8xsaNw1itSWTvvQ5ddfJ11J4aus9G2Xe+wB8+fDs896\nj4emhodqhxzic8rXXuuLMUVqW7HCpwuuucYbRd1+e+6Eh7q0bu07jU47De6809dRLF3qvSdGjvTm\nahMn+pbA39bkAAAXSUlEQVTTXXf1UdX99vOpwYce8hGNpu6hiHUEwsyOBUYAZwKvAKXAM2bWM4Sw\naC2P3wZ4AhgFHA8cAPzRzD4OIfwrzlpFakqlfBvWlCkeJiT7qqrg/vvhkkt8zclvf+tBIo6Fq5dc\n4tvwTj0VdtjBt9CJwOrmY88/D3/5C5xwQtIVNV779j7asNdeq+/74os1d348+qgvMgbv4NyzZ+O/\nX9xTGKXA3SGE+wDM7CzgJ8BpwA1refzZwDshhEsyn79lZv0zz6MAIc3mBz/wBUvPP68AEYcZM7yr\n30svrV4Q9r3vxff9zOCPf4S334bDDvMfpN26xff9JD988onvtJg71xfqFuL/6xtt5FOyAweuvm/R\notU7P/7VhN+ssU1hmFkboBh4rvq+4E0nxgN967hsn8zXa3pmHY8XiUWrVj4KoXMxsmvJEl/nUFwM\nn3/u3SQfeije8FCtQwd/97VqFQwZ4iNM0nLNmuULbBcsgBdfLMzwUJfNNvN+N1dc4Z1cGyvONRCb\nAesB82vdPx+oK/t3q+PxG5tZM6wpFVktlYJXXvHmL9I0VVXw5z/DjjvCmDF++NCMGc3/Q3urrTxE\nVFR4l8o876MnjTRpku+w2nBDn6bcbbekK8pP2tQkUod02lc6T5qUdCX5rbzcf1iffjr88Ifw1lu+\nkKtNm2Tq2Xtvn84YPbpp774kP40dCwcc4FsdJ02C7t2Trih/xbkGYhGwCuha6/6uwKd1XPNpHY9f\nGkJY54BjaWkpHTt2XOO+kpISSqr3vIhE1LMnbLmlT2NUt7eWhvvsM7j8cj9me5ddYMKENedhk3Ti\nib5t9KKL/GCjAw9MuiJpDrfcAqWlvu5m9Ojm6ZWQS8rKyigrK1vjvsrKykY/X6xnYZjZVODlEMIF\nmc8NeB+4NYRw41oe/zvgoBBC7xr3PQh0CiGs5QgTnYUh8TrxRD9lb/r0pCvJH1VV8Kc/+bHHK1Z4\nM6hhw5IbcajLqlXeH2LyZN/6tuOOSVckcamq8p04I0bAxRf7Vk01FXNNOQsj7j/Cm4CfmtnJZrYT\ncBewPjAawMyuN7MxNR5/F7Cdmf3ezHY0s2HAUZnnEWl26bQf7b1kSdKV5Idp02CffeDMM311+1tv\nwQUX5F54AN/n/+CDPso0eLAv6pTC8803cPzxvnXx1lt9/Y3CQ3bE+scYQngYuAi4GngV2A04MISw\nMPOQbkD3Go9/F9/meQAwA9++eXoIofbODJFmkU77u5eJE5OuJLctWuShYe+9/RCyF1/0xZK5vlWy\nY0c/onnhQjjuOF/zIoVjyRKfnnrsMfj73/1gNsme2HNYCGFUCGGbEEKHEELfEML0Gl87NYSQrvX4\niSGE4szjdwgh3B93jSJ12WYbv2k759qtWuXHZvfs6YdX3XqrT/f07590ZQ3Xo4fXPn48XHpp0tVI\ntrz/PgwY4Gtdxo/3rbuSXRrIEalHOu0NpWRNU6d6x7uzz/ZDf+bM8R4PrfPwhJ0DDvD2vzfd5Ivr\nJL/NnOk9HpYt8zUuOhQvHgoQIvVIp/1dzIIFSVeSGxYs8P77fft6H4WXXvIeD126JF1Z05x7rp8b\n8LOf+WuS/PTccz7y0K2b93jYaaekKypcChAi9Uil/OOECYmWkbiVK/2QoR13hH/8A0aN8kWTfQuk\nT6wZ3HGHj6oMGQIffJB0RRLVX/4CBx0E/fr5/6+5vgYn3ylAiNRjyy39l2ZLnsaYPBn23BPOP98P\nHpozx6cucv3EwqjatvVGQ+3a+bTMV18lXZE0RAi+NfOkk3zr9bhxfgaExEsBQqQB0umWuZBy/nwY\nOtQXRbZp4+se7rnHe+kXqi5dfNX+7Nl+eqfaXee2Vav8YLbLLoOrrvIeJLm4bbgQKUCINEAq5e+6\nP/oo6Uqax8qV3rWvZ0944gnvJlm9aLIl2H13uO8+353x298mXY3U5auvfLrpD3/wYPvrX/tUlDQP\nBQiRBhg0yD+2hGmMiROhqMhb/paUeHA688zCm66oz5FH+i+kX/3K13xIblm0CPbf37doPv64L4CV\n5qUAIdIAm2/uJ/YV8jTGJ5/4/PHAgbD++n4S6V13QefOSVeWnCuu8CBRfXaG5Ia5c32h5DvvwAsv\nwMFrPehA4paHO7ZFkpFK+SrvYcOgQ4e6b+3br/vrHTr4Yr1cGWpdsQJuu83fbbdr5ydVnnqq2v2C\n/xmMGeN9BAYP9l0nhbz+Ix9Mm+Zt0jt18m2a222XdEUtlwKESAOdfLIfTT1lCnz99Xdvq1Y1/LnM\n6g8ZUUNJfbe1TUFMmOAL0GbP9l0VV18Nm26atT+ygrDBBr6osk8f34Hy7LMeAKX5PfkkHHOMjwaO\nG6cwlzQFCJEGKiryMx7qsmLFd0PF8uVrDxsNuS1b5vO8dX19+fJo9bdps2YgadsW3n7b+zhMnw57\n7NG0P59C9v3vwyOP+G6cCy6AO+9MuqKW5557POQeeig88IBPs0myFCBEsqRNG79tvHHzfL8QVgeU\nxgaVPff0hZKarqhf//4eHM44w98Bn3120hW1DCH49sxrrvHpw1tvbXkLenOVAoRInqo5DSLN4/TT\n4bXX/FTHnXZa3aVU4rFihe8AGj3aG0VdcknurB0SBQgRkUhGjIA33/T1ENOmaRFfXL74wv+Mn3/e\nFy+fcELSFUltGrgUEYmgdWv46199sengwbB0adIVFZ5PPvHtxFOnwj//qfCQqxQgREQi2nRTb170\nwQfeI6KqKumKCsesWb6wd8ECX7S8//5JVyR1UYAQEWmEXr2grMxbfV9xRdLVFIZJk7znxoYb+nbp\n3XZLuiJZFwUIEZFGOvhg+P3v/byMsrKkq8lvY8fCAQdA794eJLp3T7oiqY8ChIhIE1x0kR8jfdpp\n3k9DorvlFjj6aDjiCHj6ae8yKblPAUJEpAnM/DTI3XaDww/3BYDSMFVVHsB+/nP/+MAD3k5d8oMC\nhIhIE7VvD48+6k2PjjgiepfQluibb+D44+Gmm7w51A03qKFZvtFfl4hIFmy5pR/7PXOmNz8KIemK\ncteSJXDggf7n9be/eWMuyT8KECIiWdKnD/zpT3D//f7OWr7r/fdhwAA/Hv255/y4dMlP6kQpIpJF\nxx/vvxwvuQR23hkOOijpinLHzJm+c6VtW5g82duBS/7SCISISJZde63/ojzuOD8qXXy0YcAA6NrV\nezwoPOQ/BQgRkSxbbz3fUfC973m76yVLkq4oOR995AskDzoI+vWDF16Abt2SrkqyQQFCRCQGG2/s\n7a4XL4Zjj4WVK5OuqPnMm+eHjvXr5yHq8sv9JNNx42CjjZKuTrJFAUJEJCbbb++7DP79b7j44qSr\nidfs2XDddVBc7CeUXn45bL45jBnj51rceSe0aZN0lZJNWkQpIhKjdNo7LZ57Luy6q3esLAQhwGuv\neQvqsWP9iPMNNoCf/AQuvdTXgGy4YdJVSpwUIEREYjZsmP+yPess2HFHPzAqH4UA06atDg1z50LH\njr7O47e/hR/9CDp0SLpKaS4KECIiMTOD227zYf4hQ/yX8NZbJ11Vw6xa5Vsux46FRx6BDz/0qYnD\nD4c77oBUyrdlSsujACEi0gzatoW//92bTR12mJ84ucEGSVe1ditWwIQJHhr+8Q+YP987bQ4Z4o2f\n+veH1vrt0eLpn4CISDPZfHPfmdGvH5xyCjz8sI9O5ILly2H8eA8Njz3mW0+32QZOPNFDw95766wK\nWZMChIhIM9ptN291PWSIN5y64orkalm2DP75Tw8NTz4JX3zhDZ6GDfPQsPvuuRNwJPfElifNbBMz\ne8DMKs1siZn90czWOWBnZveaWVWt21Nx1SgikoQjjoCrr4Yrr/R1Bc2pstKbXA0Z4iMiRx8Ns2b5\nNtM33vD/vvZa2GMPhQdZtzhHIB4EugL7A22B0cDdwIn1XPdP4BSg+p/uN/GUJyKSnF/9ys/MOOkk\n7xfRu3d832vxYp+WGDvWpym+/danJH7zGw8S228f3/eWwhVLgDCznYADgeIQwquZ+84DnjSzi0II\nn67j8m9CCAvjqEtEJFeYwb33+vkQhx3mOzM23zx7z//JJ/Doox4aXngBqqr8e914o4+AdO+eve8l\nLVNcUxh9gSXV4SFjPBCAveu5dpCZzTez2WY2ysw2jalGEZFEbbCB73L4+mtfc/Dtt017vvfeg5Ej\nfZfEVlvBBRf4uRx33OGB4oUX4PzzFR4kO+KawugGLKh5RwhhlZl9lvlaXf4JjAXmAdsD1wNPmVnf\nEEKIqVYRkcRsvbWPFAwa5N0q77472tqDt99e3dhp+nRo184bOt17Lxx6KGyqt2ASk0gBwsyuBy5d\nx0MC0KuxxYQQHq7x6Rtm9h9gLjAIeH5d15aWltKxY8c17ispKaGkpKSx5YiINIt+/eCuu/zAqd12\n8yBRlxDg9ddXh4bXX4f11/fW0Rde6K2kdWCVrE1ZWRllZWVr3FdZWdno57Mob+zNrDPQuZ6HvQOc\nBAwPIfzvsWa2HrAcOCqE8FiE77kAuDyEcE8dXy8CysvLyykqKmro04qI5JzSUu9Y+cwzsP/+q+8P\nAcrLV4eGt9/20z4PPdSnPg480EOESFQVFRUUFxeDr1msiHJtpBGIEMJiYHF9jzOzKUAnM9ujxjqI\n/fGdFS839PuZ2ffwwPJJlDpFRPLRjTf6oVRHHw0vv+wdIB95xG/vvQedO3sL6Vtu8UO62rVLumJp\nyWJZAxFCmG1mzwD3mNnZ+DbO24CymjswzGw2cGkI4bFMj4ir8DUQnwI9gN8Dc4Bn4qhTRCSXtG4N\nDz3kWyx32sl3Tmyxhe+aOPJI2G8/tZCW3BHnP8Xjgdvx3RdVwN+BC2o9ZgegeuHCKmA34GSgE/Ax\nHhyuDCGsiLFOEZGcsckm8NRTcN99PjXRt69aSEtuii1AhBA+p56mUSGE9Wr893Lgx3HVIyKSL3r0\n8E6VIrlMuVZEREQiU4AQERGRyBQgREREJDIFCBEREYlMAUJEREQiU4AQERGRyBQgREREJDIFCBER\nEYlMAUJEREQiU4AQERGRyBQgREREJDIFCBEREYlMAUJEREQiU4AQERGRyBQgREREJDIFCBEREYlM\nAUJEREQiU4AQERGRyBQgREREJDIFCBEREYlMAUJEREQiU4AQERGRyBQgREREJDIFCBEREYlMAUJE\nREQiU4AQERGRyBQgREREJDIFCBEREYlMAUJEREQiU4AQERGRyBQgREREJDIFCBEREYlMASIHlZWV\nJV1CVhXS6ymk1wJ6PbmskF4L6PUUotgChJn90swmm9kyM/sswnVXm9nHZvaVmf3LzHrEVWOuKrR/\nmIX0egrptYBeTy4rpNcCej2FKM4RiDbAw8CdDb3AzC4FzgXOBPYClgHPmFnbWCoUERGRRmkd1xOH\nEH4DYGZDI1x2AXBNCOGJzLUnA/OBw/EwIiIiIjkgZ9ZAmNm2QDfguer7QghLgZeBvknVJSIiIt8V\n2whEI3QDAj7iUNP8zNfq0h5g1qxZMZXV/CorK6moqEi6jKwppNdTSK8F9HpyWSG9FtDryVU1fne2\nj3qthRAa/mCz64FL1/GQAPQKIcypcc1QYGQIYdN6nrsvMAnYMoQwv8b9fwWqQggldVx3PPBAg1+E\niIiI1HZCCOHBKBdEHYEYDtxbz2Peific1T4FDOjKmqMQXYFX13HdM8AJwLvA8kZ+bxERkZaoPbAN\n/rs0kkgBIoSwGFgc9Zs08LnnmdmnwP7AawBmtjGwN3BHPTVFSk0iIiLyPy815qI4+0B0N7PewPeB\n9cysd+a2QY3HzDazw2pcdjPwKzM71Mx2Be4DPgQei6tOERERiS7ORZRXAyfX+Lx6tUkKmJj57x2A\njtUPCCHcYGbrA3cDnYAXgYNCCN/GWKeIiIhEFGkRpYiIiAjkUB8IERERyR8KECIiIhJZ3gcIMzvH\nzOaZ2ddmNtXM+iRdU2OY2QAze9zMPjKzKjMbnHRNjWVml5nZK2a21Mzmm9mjZtYz6boay8zOMrOZ\nZlaZub1kZj9Ouq5sMLP/y/x7uynpWhrDzK7K1F/z9mbSdTWFmW1pZveb2aLMoYIzzawo6boaI/Oz\nufbfT5WZ3ZZ0bVGZWSszu8bM3sn8vfzXzH6VdF1NYWYbmtnNZvZu5jVNMrM9G3p9XgcIMzsWGAFc\nBewBzMQP39os0cIaZwNgBjAMb8iVzwYAt+FbcA/AD1Z71sw6JFpV432AN1ArAoqBfwOPmVmvRKtq\nokzYPhP//yafvY73i+mWufVPtpzGM7NOwGTgG+BAoBdwIbAkybqaYE9W/710A36I/3zLx7ON/g/4\nGf4zeifgEuASMzs30aqa5k9464QTgB8A/wLGm9kWDbk4rxdRmtlU4OUQwgWZzw3/YX9rCOGGRItr\nAjOrAg4PITyedC3ZkAl0C4D9QgiTkq4nG8xsMXBRCKG+xmo5ycw2BMqBs4ErgFdDCL9ItqrozOwq\n4LAQQl6+Q6/NzH4H9A0hDEy6ljiY2c3AwSGEvBuRNLNxwKchhJ/WuO/vwFchhJPrvjI3mVl74Avg\n0BDC0zXunw48FUK4sr7nyNsRCDNrg78brHn4VgDGo8O3ck0n/F3HZ0kX0lSZYczjgPWBKUnX0wR3\nAONCCP9OupAs2CEz9TfXzP5iZt2TLqgJDgWmm9nDmem/CjM7I+misiHzM/sE/F1vPnoJ2N/MdgDI\n9DnaF3gq0aoarzWwHj7aVdPXNHAUL5cO04pqM/zFr+3wrR2bvxxZm8yo0M3ApBBC3s5Nm9kP8MBQ\nndqPCCHMTraqxskEoN3x4eV8NxU4BXgL2AL4NTDRzH4QQliWYF2NtR0+KjQCuA7YC7jVzL4JIdyf\naGVNdwTe92dM0oU00u+AjYHZZrYKfwN+eQjhoWTLapwQwpdmNgW4wsxm4787j8ffgL/dkOfI5wAh\n+WEUsDOe1PPZbKA3/gPwKOA+M9sv30KEmX0PD3QHhBBWJF1PU4UQavbvf93MXgHeA46h/nN7clEr\n4JUQwhWZz2dmwutZQL4HiNOAf4YQPk26kEY6Fv8FexzwJh7CbzGzj/M43J0I/Bn4CFiJN3x8EB/d\nr1c+B4hFwCp88VRNXfGDuSRhZnY7cDAwIITwSdL1NEUIYSWrD4p71cz2Ai7A3y3mk2Jgc6AiMzoE\nPpK3X2YxWLuQxwujQgiVZjYH6JF0LY30CTCr1n2zgCEJ1JI1ZrY1vqD68KRraYIbgOtDCH/LfP6G\nmW0DXEaehrsQwjwglVngvnEIYb6ZPUQDD8XM2zUQmXdP5fgKUuB/w+X708iDQSR7MuHhMCAVQng/\n6Xpi0Apol3QRjTAe2BV/99Q7c5sO/AXonc/hAf63OLQH/os4H03mu1OwO+KjKvnsNHyIPF/XC4Cv\ne1pV674q8vj3aLUQwteZ8LAJvvvnHw25Lp9HIABuAkabWTnwClCK/yWPTrKoxjA/ZKwHfqQ5wHaZ\nRTqfhRA+SK6y6MxsFFACDAaWmVn1KFFlCCHvjlw3s98C/wTeBzbCF4INBH6UZF2NkVkXsMZaFDNb\nBiwOIdR+55vzzOxGYBz+C3Yr4DfACqAsybqaYCQw2cwuw7c67g2cAfx0nVflsMwbu1OA0SGEqoTL\naYpx+GGPHwJv4Nu6S4E/JlpVE5jZj/DfOW/hZ1PdgP98GN2Q6/M6QIQQHs5sEbwan7qYARwYQliY\nbGWNsifwPL5bIeCLqMAXHJ2WVFGNdBb+GibUuv9U/ITVfNMF/3vYAqjEj5v/UYHsYID87jvyPXzO\ntjOwEJgE7BNCWJxoVY0UQphuZkfgC/auAOYBF+TrQr2MA4Du5OealJrOBa7BdzB1AT4G7szcl686\nAtfj4fsz4O/Ar0IItUda1iqv+0CIiIhIMvJ+7kZERESanwKEiIiIRKYAISIiIpEpQIiIiEhkChAi\nIiISmQKEiIiIRKYAISIiIpEpQIiIiEhkChAiIiISmQKEiIiIRKYAISIiIpH9P+ofpu3jnIMAAAAA\nAElFTkSuQmCC\n", + "image/png": "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\npVuT0Ci5VQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -95,10 +120,44 @@ } ], "source": [ - "import matplotlib\n", - "import matplotlib.pyplot as plt\n", - "\n", - "plt.plot(b)" + "plt.plot(b)\n", + "plt.plot(c)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([ 5., 29., 75., 151., 277., 237., 141., 64., 15., 6.]),\n", + " array([-3.29808432, -2.63067717, -1.96327001, -1.29586286, -0.6284557 ,\n", + " 0.03895145, 0.70635861, 1.37376576, 2.04117292, 2.70858007,\n", + " 3.37598722]),\n", + " )" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgkAAAFkCAYAAACq4KjhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAG3FJREFUeJzt3X+QZWWd3/H3B5AZwZ2hdIpB1NlVibNjbXQzzcJSG9At\nXH9mUUOyS8cpV6jEYkVidcoKMdGVQO0PMTIUCompGIWgnRAQcS0EXfyxgggrg7q7tuOiYIsMIw3Y\nQxibn0/+OGewp30G5t6+d86d7ver6tbMfc5zT3/P3J7uz32e55yTUgqSJEkLHdB1AZIkaTQZEiRJ\nUpUhQZIkVRkSJElSlSFBkiRVGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkSJElSVU8hIcnpSb6dZLZ9\nfD3Jaxf0OSfJ3Ul2JvlikqMWbF+R5KIkM0keTHJFksMHcTCSJGlweh1J+DFwFrARGAO+BFydZANA\nkrOAdwJvB44BHgKuS3LwvH1cALwBOBk4ATgSuHIRxyBJkoYgi73BU5L7gHeXUj6e5G7gg6WUze22\nVcB24I9KKZe3z+8FTimlXNX2WQ9MAb9dSrllUcVIkqSB6XtNQpIDkpwCHAJ8PckLgSOA63f1KaXs\nAG4GjmubjgYOWtBnKzA9r48kSRoBB/X6giS/AdwErAQeBN5cStma5Dig0IwczLedJjwArAUeacPD\nnvrUvuZzgNcAdwJzvdYsSdIythL4NeC6Usp9vbyw55AAfA94ObAa+BfApUlO6GM/vXgN8Mkhfw1J\nkpaytwCf6uUFPYeEUspjwA/bp7clOQZ4F3AeEJrRgvmjCWuB29q/3wMcnGTVgtGEte22PbkT4LLL\nLmPDhg29lrxfmZiYYPPmzV2XMXTL5Thh+Ryrx7m0eJxLx9TUFJs2bYL2d2kv+hlJWOgAYEUp5Y4k\n9wAnAt+BJxcuHgtc1Pa9FXis7TN/4eI6mimMPZkD2LBhAxs3bhxAyaNr9erVS/4YYfkcJyyfY/U4\nlxaPc0nqebq+p5CQ5M+Az9MsNPwVmqGLVwCvbrtcALw3ye00ieVc4C7gamgWMib5GHB+kgdo1jRc\nCNzomQ2SJI2WXkcSDgcuAZ4LzNKMGLy6lPIlgFLKeUkOAT4KHAZ8DXhdKeWRefuYAB4HrgBWANcC\nZyzmICRJ0uD1FBJKKf96L/qcDZz9FNsfBs5sH5IkaUR574YRMz4+3nUJ+8RyOU5YPsfqcS4tHqdg\nAFdc3BeSbARuvfXWW5fTAhNJkhZty5YtjI2NAYyVUrb08lpHEiRJUpUhQZIkVRkSJElSlSFBkiRV\nGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkSJElSlSFBkiRVGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkS\nJElS1UFdFyCpd9PT08zMzHRdRtWaNWtYt25d12VIGgBDgrSfmZ6eZv36DczN7ey6lKqVKw9h69Yp\ng4K0BBgSpP3MzMxMGxAuAzZ0Xc4CU8zNbWJmZsaQIC0BhgRpv7UB2Nh1EZKWMBcuSpKkKkOCJEmq\nMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIk\nSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmq6ikkJHlPkluS7EiyPclV\nSV6yoM/Hkzyx4HHNgj4rklyUZCbJg0muSHL4IA5IkiQNRq8jCccDHwaOBV4FPAP4QpJnLuj3eWAt\ncET7GF+w/QLgDcDJwAnAkcCVPdYiSZKG6KBeOpdSXj//eZK3AT8FxoAb5m16uJRyb20fSVYBpwGn\nlFK+2radCkwlOaaUcksvNUmSpOFY7JqEw4AC3L+g/ZXtdMT3klyc5Nnzto3RhJPrdzWUUrYC08Bx\ni6xHkiQNSE8jCfMlCc20wQ2llO/O2/R5mqmDO4AXA38OXJPkuFJKoZl+eKSUsmPBLre32yRJ0gjo\nOyQAFwMvBX5nfmMp5fJ5T/8+yd8CPwBeCXx5EV+PiYkJVq9evVvb+Pg44+MLlzxIkrT8TE5OMjk5\nuVvb7Oxs3/vrKyQk+QjweuD4Usq2p+pbSrkjyQxwFE1IuAc4OMmqBaMJa9tte7R582Y2btzYT8mS\nJC15tQ/OW7ZsYWxsrK/99bwmoQ0IbwR+t5QyvRf9nw88B9gVJm4FHgNOnNdnPbAOuKnXeiRJ0nD0\nNJKQ5GKa0xlPAh5KsrbdNFtKmUtyKPB+mjUJ99CMHnwA+D5wHUApZUeSjwHnJ3kAeBC4ELjRMxsk\nSRodvU43nE5zNsNXFrSfClwKPA68DHgrzZkPd9OEgz8ppTw6r/9E2/cKYAVwLXBGj7VIkqQh6vU6\nCU85PVFKmQNeuxf7eRg4s31IkqQR5L0bJElSlSFBkiRVGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkS\nJElS1WJu8CRJVVNTU12XULVmzRrWrVvXdRnSfsOQIGmAtgEHsGnTpq4LqVq58hC2bp0yKEh7yZAg\naYB+BjwBXAZs6LiWhaaYm9vEzMyMIUHaS4YESUOwAfC27tL+zoWLkiSpypAgSZKqDAmSJKnKkCBJ\nkqoMCZIkqcqQIEmSqgwJkiSpypAgSZKqDAmSJKnKkCBJkqoMCZIkqcqQIEmSqgwJkiSpypAgSZKq\nDAmSJKnKkCBJkqoMCZIkqcqQIEmSqgwJkiSpypAgSZKqDAmSJKnKkCBJkqoMCZIkqcqQIEmSqgwJ\nkiSpypAgSZKqDAmSJKnKkCBJkqoMCZIkqaqnkJDkPUluSbIjyfYkVyV5SaXfOUnuTrIzyReTHLVg\n+4okFyWZSfJgkiuSHL7Yg5EkSYPT60jC8cCHgWOBVwHPAL6Q5Jm7OiQ5C3gn8HbgGOAh4LokB8/b\nzwXAG4CTgROAI4Er+zwGSZI0BAf10rmU8vr5z5O8DfgpMAbc0Da/Czi3lPK5ts9bge3Am4DLk6wC\nTgNOKaV8te1zKjCV5JhSyi39H44kSRqUxa5JOAwowP0ASV4IHAFcv6tDKWUHcDNwXNt0NE04md9n\nKzA9r48kSepY3yEhSWimDW4opXy3bT6CJjRsX9B9e7sNYC3wSBse9tRHkiR1rKfphgUuBl4K/M6A\napEkSSOkr5CQ5CPA64HjSynb5m26BwjNaMH80YS1wG3z+hycZNWC0YS17bY9mpiYYPXq1bu1jY+P\nMz4+3s9hSJK0pExOTjI5Oblb2+zsbN/76zkktAHhjcArSinT87eVUu5Icg9wIvCdtv8qmrMhLmq7\n3Qo81va5qu2zHlgH3PRUX3vz5s1s3Lix15IlSVoWah+ct2zZwtjYWF/76ykkJLkYGAdOAh5Ksrbd\nNFtKmWv/fgHw3iS3A3cC5wJ3AVdDs5AxyceA85M8ADwIXAjc6JkNkiSNjl5HEk6nWZj4lQXtpwKX\nApRSzktyCPBRmrMfvga8rpTyyLz+E8DjwBXACuBa4Ixei5ckScPT63US9upsiFLK2cDZT7H9YeDM\n9iFJkkaQ926QJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWG\nBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJ\nklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJU\nZUiQJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWGBEmSVGVI\nkCRJVT2HhCTHJ/lskp8keSLJSQu2f7xtn/+4ZkGfFUkuSjKT5MEkVyQ5fLEHI0mSBqefkYRDgW8B\n7wDKHvp8HlgLHNE+xhdsvwB4A3AycAJwJHBlH7VIkqQhOajXF5RSrgWuBUiSPXR7uJRyb21DklXA\nacAppZSvtm2nAlNJjiml3NJrTZIkafB6Dgl76ZVJtgMPAF8C3ltKub/dNtZ+3et3dS6lbE0yDRwH\nGBI0Eqanp5mZmem6jF8yNTXVdQmSlolhhITP00wd3AG8GPhz4Jokx5VSCs30wyOllB0LXre93SZ1\nbnp6mvXrNzA3t7PrUiSpMwMPCaWUy+c9/fskfwv8AHgl8OXF7HtiYoLVq1fv1jY+Ps74+MIlD9Li\nzMzMtAHhMmBD1+UscA3wvq6LkDSCJicnmZyc3K1tdna27/0Na7rhSaWUO5LMAEfRhIR7gIOTrFow\nmrC23bZHmzdvZuPGjcMrVvolG4BR+55zukFSXe2D85YtWxgbG+trf0O/TkKS5wPPAba1TbcCjwEn\nzuuzHlgH3DTseiRJ0t7peSQhyaE0owK7zmx4UZKXA/e3j/fTrEm4p+33AeD7wHUApZQdST4GnJ/k\nAeBB4ELgRs9skCRpdPQz3XA0zbRBaR8fatsvobl2wsuAtwKHAXfThIM/KaU8Om8fE8DjwBXACppT\nKs/ooxZJkjQk/Vwn4as89TTFa/diHw8DZ7YPSZI0grx3gyRJqjIkSJKkKkOCJEmqGvp1EiRplIzq\nZa3XrFnDunXrui5D2o0hQdIysQ04gE2bNnVdSNXKlYewdeuUQUEjxZAgaZn4GfAEo3mp7Snm5jYx\nMzNjSNBIMSRIWmZG8VLb0mhy4aIkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoy\nJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRI\nkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKk\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(b)" ] } ], From d9cf821b94176f449bcf1b82434a0e1f484db406 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 6 Jan 2017 16:40:55 -0500 Subject: [PATCH 027/180] Clear all output and add audio code. --- stats/helloworld.ipynb | 198 +++++++++++++++++++++++++---------------- 1 file changed, 121 insertions(+), 77 deletions(-) diff --git a/stats/helloworld.ipynb b/stats/helloworld.ipynb index 0bd8c4e..20471c4 100644 --- a/stats/helloworld.ipynb +++ b/stats/helloworld.ipynb @@ -14,6 +14,10 @@ "$ brew cask install docker\n", "# Run Applications -> Docker\n", "$ docker run -it --rm -p 8888:8888 -v `pwd`:/home/jovyan/work jupyter/tensorflow-notebook\n", + "\n", + "# Connect to container with env variables loaded\n", + "$ docker ps\n", + "$ docker exec -t -i container_name start.sh /bin/bash\n", "```\n", " \n", "More: https://github.com/jupyter/docker-stacks/tree/master/tensorflow-notebook" @@ -21,7 +25,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "collapsed": true }, @@ -44,22 +48,11 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([10, 20, 30])" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "a = np.array([10,20,30])\n", "b = np.random.randn(1000)\n", @@ -69,22 +62,11 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "3" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import matplotlib\n", "import matplotlib.pyplot as plt\n", @@ -93,32 +75,11 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\npVuT0Ci5VQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.plot(b)\n", "plt.plot(c)" @@ -126,39 +87,110 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([ 5., 29., 75., 151., 277., 237., 141., 64., 15., 6.]),\n", - " array([-3.29808432, -2.63067717, -1.96327001, -1.29586286, -0.6284557 ,\n", - " 0.03895145, 0.70635861, 1.37376576, 2.04117292, 2.70858007,\n", - " 3.37598722]),\n", - " )" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgkAAAFkCAYAAACq4KjhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAG3FJREFUeJzt3X+QZWWd3/H3B5AZwZ2hdIpB1NlVibNjbXQzzcJSG9At\nXH9mUUOyS8cpV6jEYkVidcoKMdGVQO0PMTIUCompGIWgnRAQcS0EXfyxgggrg7q7tuOiYIsMIw3Y\nQxibn0/+OGewp30G5t6+d86d7ver6tbMfc5zT3/P3J7uz32e55yTUgqSJEkLHdB1AZIkaTQZEiRJ\nUpUhQZIkVRkSJElSlSFBkiRVGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkSJElSVU8hIcnpSb6dZLZ9\nfD3Jaxf0OSfJ3Ul2JvlikqMWbF+R5KIkM0keTHJFksMHcTCSJGlweh1J+DFwFrARGAO+BFydZANA\nkrOAdwJvB44BHgKuS3LwvH1cALwBOBk4ATgSuHIRxyBJkoYgi73BU5L7gHeXUj6e5G7gg6WUze22\nVcB24I9KKZe3z+8FTimlXNX2WQ9MAb9dSrllUcVIkqSB6XtNQpIDkpwCHAJ8PckLgSOA63f1KaXs\nAG4GjmubjgYOWtBnKzA9r48kSRoBB/X6giS/AdwErAQeBN5cStma5Dig0IwczLedJjwArAUeacPD\nnvrUvuZzgNcAdwJzvdYsSdIythL4NeC6Usp9vbyw55AAfA94ObAa+BfApUlO6GM/vXgN8Mkhfw1J\nkpaytwCf6uUFPYeEUspjwA/bp7clOQZ4F3AeEJrRgvmjCWuB29q/3wMcnGTVgtGEte22PbkT4LLL\nLmPDhg29lrxfmZiYYPPmzV2XMXTL5Thh+Ryrx7m0eJxLx9TUFJs2bYL2d2kv+hlJWOgAYEUp5Y4k\n9wAnAt+BJxcuHgtc1Pa9FXis7TN/4eI6mimMPZkD2LBhAxs3bhxAyaNr9erVS/4YYfkcJyyfY/U4\nlxaPc0nqebq+p5CQ5M+Az9MsNPwVmqGLVwCvbrtcALw3ye00ieVc4C7gamgWMib5GHB+kgdo1jRc\nCNzomQ2SJI2WXkcSDgcuAZ4LzNKMGLy6lPIlgFLKeUkOAT4KHAZ8DXhdKeWRefuYAB4HrgBWANcC\nZyzmICRJ0uD1FBJKKf96L/qcDZz9FNsfBs5sH5IkaUR574YRMz4+3nUJ+8RyOU5YPsfqcS4tHqdg\nAFdc3BeSbARuvfXWW5fTAhNJkhZty5YtjI2NAYyVUrb08lpHEiRJUpUhQZIkVRkSJElSlSFBkiRV\nGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkSJElSlSFBkiRVGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkS\nJElS1UFdFyCpd9PT08zMzHRdRtWaNWtYt25d12VIGgBDgrSfmZ6eZv36DczN7ey6lKqVKw9h69Yp\ng4K0BBgSpP3MzMxMGxAuAzZ0Xc4CU8zNbWJmZsaQIC0BhgRpv7UB2Nh1EZKWMBcuSpKkKkOCJEmq\nMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIk\nSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmq6ikkJHlPkluS7EiyPclV\nSV6yoM/Hkzyx4HHNgj4rklyUZCbJg0muSHL4IA5IkiQNRq8jCccDHwaOBV4FPAP4QpJnLuj3eWAt\ncET7GF+w/QLgDcDJwAnAkcCVPdYiSZKG6KBeOpdSXj//eZK3AT8FxoAb5m16uJRyb20fSVYBpwGn\nlFK+2radCkwlOaaUcksvNUmSpOFY7JqEw4AC3L+g/ZXtdMT3klyc5Nnzto3RhJPrdzWUUrYC08Bx\ni6xHkiQNSE8jCfMlCc20wQ2llO/O2/R5mqmDO4AXA38OXJPkuFJKoZl+eKSUsmPBLre32yRJ0gjo\nOyQAFwMvBX5nfmMp5fJ5T/8+yd8CPwBeCXx5EV+PiYkJVq9evVvb+Pg44+MLlzxIkrT8TE5OMjk5\nuVvb7Oxs3/vrKyQk+QjweuD4Usq2p+pbSrkjyQxwFE1IuAc4OMmqBaMJa9tte7R582Y2btzYT8mS\nJC15tQ/OW7ZsYWxsrK/99bwmoQ0IbwR+t5QyvRf9nw88B9gVJm4FHgNOnNdnPbAOuKnXeiRJ0nD0\nNJKQ5GKa0xlPAh5KsrbdNFtKmUtyKPB+mjUJ99CMHnwA+D5wHUApZUeSjwHnJ3kAeBC4ELjRMxsk\nSRodvU43nE5zNsNXFrSfClwKPA68DHgrzZkPd9OEgz8ppTw6r/9E2/cKYAVwLXBGj7VIkqQh6vU6\nCU85PVFKmQNeuxf7eRg4s31IkqQR5L0bJElSlSFBkiRVGRIkSVKVIUGSJFUZEiRJUpUhQZIkVRkS\nJElS1WJu8CRJVVNTU12XULVmzRrWrVvXdRnSfsOQIGmAtgEHsGnTpq4LqVq58hC2bp0yKEh7yZAg\naYB+BjwBXAZs6LiWhaaYm9vEzMyMIUHaS4YESUOwAfC27tL+zoWLkiSpypAgSZKqDAmSJKnKkCBJ\nkqoMCZIkqcqQIEmSqgwJkiSpypAgSZKqDAmSJKnKkCBJkqoMCZIkqcqQIEmSqgwJkiSpypAgSZKq\nDAmSJKnKkCBJkqoMCZIkqcqQIEmSqgwJkiSpypAgSZKqDAmSJKnKkCBJkqoMCZIkqcqQIEmSqgwJ\nkiSpypAgSZKqDAmSJKnKkCBJkqoMCZIkqaqnkJDkPUluSbIjyfYkVyV5SaXfOUnuTrIzyReTHLVg\n+4okFyWZSfJgkiuSHL7Yg5EkSYPT60jC8cCHgWOBVwHPAL6Q5Jm7OiQ5C3gn8HbgGOAh4LokB8/b\nzwXAG4CTgROAI4Er+zwGSZI0BAf10rmU8vr5z5O8DfgpMAbc0Da/Czi3lPK5ts9bge3Am4DLk6wC\nTgNOKaV8te1zKjCV5JhSyi39H44kSRqUxa5JOAwowP0ASV4IHAFcv6tDKWUHcDNwXNt0NE04md9n\nKzA9r48kSepY3yEhSWimDW4opXy3bT6CJjRsX9B9e7sNYC3wSBse9tRHkiR1rKfphgUuBl4K/M6A\napEkSSOkr5CQ5CPA64HjSynb5m26BwjNaMH80YS1wG3z+hycZNWC0YS17bY9mpiYYPXq1bu1jY+P\nMz4+3s9hSJK0pExOTjI5Oblb2+zsbN/76zkktAHhjcArSinT87eVUu5Icg9wIvCdtv8qmrMhLmq7\n3Qo81va5qu2zHlgH3PRUX3vz5s1s3Lix15IlSVoWah+ct2zZwtjYWF/76ykkJLkYGAdOAh5Ksrbd\nNFtKmWv/fgHw3iS3A3cC5wJ3AVdDs5AxyceA85M8ADwIXAjc6JkNkiSNjl5HEk6nWZj4lQXtpwKX\nApRSzktyCPBRmrMfvga8rpTyyLz+E8DjwBXACuBa4Ixei5ckScPT63US9upsiFLK2cDZT7H9YeDM\n9iFJkkaQ926QJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWG\nBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJ\nklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJU\nZUiQJElVhgRJklRlSJAkSVWGBEmSVGVIkCRJVYYESZJUZUiQJElVhgRJklRlSJAkSVWGBEmSVGVI\nkCRJVT2HhCTHJ/lskp8keSLJSQu2f7xtn/+4ZkGfFUkuSjKT5MEkVyQ5fLEHI0mSBqefkYRDgW8B\n7wDKHvp8HlgLHNE+xhdsvwB4A3AycAJwJHBlH7VIkqQhOajXF5RSrgWuBUiSPXR7uJRyb21DklXA\nacAppZSvtm2nAlNJjiml3NJrTZIkafB6Dgl76ZVJtgMPAF8C3ltKub/dNtZ+3et3dS6lbE0yDRwH\nGBI0Eqanp5mZmem6jF8yNTXVdQmSlolhhITP00wd3AG8GPhz4Jokx5VSCs30wyOllB0LXre93SZ1\nbnp6mvXrNzA3t7PrUiSpMwMPCaWUy+c9/fskfwv8AHgl8OXF7HtiYoLVq1fv1jY+Ps74+MIlD9Li\nzMzMtAHhMmBD1+UscA3wvq6LkDSCJicnmZyc3K1tdna27/0Na7rhSaWUO5LMAEfRhIR7gIOTrFow\nmrC23bZHmzdvZuPGjcMrVvolG4BR+55zukFSXe2D85YtWxgbG+trf0O/TkKS5wPPAba1TbcCjwEn\nzuuzHlgH3DTseiRJ0t7peSQhyaE0owK7zmx4UZKXA/e3j/fTrEm4p+33AeD7wHUApZQdST4GnJ/k\nAeBB4ELgRs9skCRpdPQz3XA0zbRBaR8fatsvobl2wsuAtwKHAXfThIM/KaU8Om8fE8DjwBXACppT\nKs/ooxZJkjQk/Vwn4as89TTFa/diHw8DZ7YPSZI0grx3gyRJqjIkSJKkKkOCJEmqGvp1EiRplIzq\nZa3XrFnDunXrui5D2o0hQdIysQ04gE2bNnVdSNXKlYewdeuUQUEjxZAgaZn4GfAEo3mp7Snm5jYx\nMzNjSNBIMSRIWmZG8VLb0mhy4aIkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoy\nJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRI\nkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKkKkOCJEmqMiRIkqQqQ4IkSaoyJEiSpCpDgiRJqjIkSJKk\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.hist(b)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(np.arange(5))\n", + "print(np.arange(5, 10))\n", + "print(np.arange(1, 10, 2))\n", + "\n", + "print(np.arange(5) + 4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "a = np.array([np.arange(5), np.arange(5, 10), np.arange(11, 16)])\n", + "print(a.shape)\n", + "print(a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interactivity" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from ipywidgets import interact, interactive, fixed\n", + "import ipywidgets as widgets\n", + "\n", + "def plotter(start, end, step):\n", + " plt.plot(np.sin(np.arange(start, end, step)))\n", + " \n", + "interact(plotter, start=(0.01, 10, 1), end=(0.01, 100, 10), step=(0.01, 1, 0.01))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from IPython.display import Audio\n", + "import math\n", + "\n", + "PI2 = math.pi * 2\n", + "samplerate = 8000\n", + "\n", + "def sin_wave(freq, amplitude, duration_s):\n", + " return np.sin((np.arange(duration_s * samplerate) / samplerate) * PI2 * freq) * amplitude\n", + "\n", + "# Play two tones\n", + "audio = np.concatenate((sin_wave(440, 10, 0.5), sin_wave(640, 10, 0.5)))\n", + "Audio(data=audio, rate=samplerate)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Play two tones simultaneously\n", + "audio = sin_wave(440, 10, 0.5) + sin_wave(640, 10, 0.5)\n", + "Audio(data=audio, rate=samplerate)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -178,6 +210,18 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" + }, + "widgets": { + "state": { + "1f20340803b24fb3a4120a7ba815d000": { + "views": [ + { + "cell_index": 10 + } + ] + } + }, + "version": "1.2.0" } }, "nbformat": 4, From 64dc8f30206d2f7cfe904b61daa19c14e6b30e35 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 6 Jan 2017 16:46:55 -0500 Subject: [PATCH 028/180] Added notes for nbstripout. --- stats/helloworld.ipynb | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/stats/helloworld.ipynb b/stats/helloworld.ipynb index 20471c4..8bee6b4 100644 --- a/stats/helloworld.ipynb +++ b/stats/helloworld.ipynb @@ -18,6 +18,11 @@ "# Connect to container with env variables loaded\n", "$ docker ps\n", "$ docker exec -t -i container_name start.sh /bin/bash\n", + "\n", + "# To strip output for git commits\n", + "$ docker exec -t -i container_name start.sh /bin/bash\n", + "$ pip install --upgrade nbstripout\n", + "$ nbstripout helloworld.\n", "```\n", " \n", "More: https://github.com/jupyter/docker-stacks/tree/master/tensorflow-notebook" @@ -27,7 +32,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -187,7 +192,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [] @@ -210,18 +215,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" - }, - "widgets": { - "state": { - "1f20340803b24fb3a4120a7ba815d000": { - "views": [ - { - "cell_index": 10 - } - ] - } - }, - "version": "1.2.0" } }, "nbformat": 4, From f1d51875a1a0f0c967d728f51b57b276be32197f Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 6 Jan 2017 20:29:34 -0500 Subject: [PATCH 029/180] Add FFT code. --- stats/helloworld.ipynb | 49 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/stats/helloworld.ipynb b/stats/helloworld.ipynb index 8bee6b4..460de35 100644 --- a/stats/helloworld.ipynb +++ b/stats/helloworld.ipynb @@ -22,7 +22,7 @@ "# To strip output for git commits\n", "$ docker exec -t -i container_name start.sh /bin/bash\n", "$ pip install --upgrade nbstripout\n", - "$ nbstripout helloworld.\n", + "$ nbstripout helloworld.ipynb\n", "```\n", " \n", "More: https://github.com/jupyter/docker-stacks/tree/master/tensorflow-notebook" @@ -188,6 +188,53 @@ "Audio(data=audio, rate=samplerate)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Manual FFT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import scipy.fftpack\n", + "points = 2048\n", + "\n", + "au = audio[0:points]\n", + "fr = np.fft.rfft(au)\n", + "\n", + "mags = np.absolute(fr)\n", + "phases = np.angle(fr)\n", + "\n", + "plt.plot(np.linspace(0, samplerate, num=(points/2 + 1)), mags)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Matplotlib Auto-FFT\n", + "\n", + "Uses a hanning window by default, hence the tighter spikes. See http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.magnitude_spectrum." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.magnitude_spectrum(au, Fs=samplerate)" + ] + }, { "cell_type": "code", "execution_count": null, From eb4bcb94fc3a3c943109c2a18fe0069014a77e26 Mon Sep 17 00:00:00 2001 From: Mike Slinn Date: Thu, 30 Aug 2018 21:03:22 -0700 Subject: [PATCH 030/180] Fixed error where ASCII value of a number was concatenated to a string, instead of the number --- ruby/refresher.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/refresher.md b/ruby/refresher.md index 8465a14..f54f949 100644 --- a/ruby/refresher.md +++ b/ruby/refresher.md @@ -56,7 +56,7 @@ previously established rule. primes = [2, 3, 5, 7] people = ["Bob", "Alice", "Eve"] - puts "The first prime is " << primes[0] + puts "The first prime is " << primes[0].to_s puts "The last person is " << people[-1] puts "The first person is " << people.first From 1fca2198c04a99128ecf078201681e763f69b3cb Mon Sep 17 00:00:00 2001 From: Mike Slinn Date: Thu, 30 Aug 2018 21:15:43 -0700 Subject: [PATCH 031/180] Fixed syntax error, unexpected tCONSTANT, expecting keyword_end --- ruby/refresher.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ruby/refresher.md b/ruby/refresher.md index f54f949..5c112bf 100644 --- a/ruby/refresher.md +++ b/ruby/refresher.md @@ -62,7 +62,7 @@ previously established rule. puts "The first person is " << people.first puts "The last prime is " << primes.last primes.pop - puts "The last prime is now " << primes.last + puts "The last prime is now " << primes.last.to_s primes.push 7 puts "The last prime is #{primes.last} again" primes << 11 @@ -112,9 +112,9 @@ previously established rule. } person = { - :first_name, "Albert", - :last_name, "Einstein", - :email, "al@wormhole.com" + :first_name => "Albert", + :last_name => "Einstein", + :email => "al@wormhole.com" } puts "The capital of India is #{capitals[India]}" From f1741fff15a72355174a02e0edad16ed1ba53cf4 Mon Sep 17 00:00:00 2001 From: Tomilayo Israel Date: Wed, 17 Jul 2019 09:52:44 +0100 Subject: [PATCH 032/180] Update refresher.md add closing quotation --- ruby/refresher.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/refresher.md b/ruby/refresher.md index 5c112bf..08b9083 100644 --- a/ruby/refresher.md +++ b/ruby/refresher.md @@ -193,7 +193,7 @@ previously established rule. when 6 puts "You win!" else - raise "What just happened? + raise "What just happened?" end ## Getting Stuff Done From 89b05f424fb7efb360980b713c808328503a9832 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 5 Oct 2019 12:28:26 -0400 Subject: [PATCH 033/180] Golang data structure experiments --- go/empty.go | 20 +++++++++++++++++++ go/stack.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 go/empty.go create mode 100644 go/stack.go diff --git a/go/empty.go b/go/empty.go new file mode 100644 index 0000000..199d452 --- /dev/null +++ b/go/empty.go @@ -0,0 +1,20 @@ +package main + +import "fmt" + +// Bottom is a valueless type +type Bottom struct{} + +func main() { + set := make(map[string]Bottom) + exists := Bottom{} + + set["foo"] = exists + set["bar"] = exists + + fmt.Printf("%v+\n", set) + + for k, v := range set { + fmt.Printf("%v = %v\n", k, v) + } +} diff --git a/go/stack.go b/go/stack.go new file mode 100644 index 0000000..366ec10 --- /dev/null +++ b/go/stack.go @@ -0,0 +1,56 @@ +package main + +import "fmt" + +// Stack is an implementation of a stack data structure +type Stack struct { + elements []interface{} + top int +} + +// Push adds an element to the stack +func (s *Stack) Push(v interface{}) { + if len(s.elements) > s.top { + s.elements[s.top] = v + } else { + s.elements = append(s.elements, v) + } + s.top++ +} + +// Pop removes an element from the stack and returns it +func (s *Stack) Pop() (interface{}, error) { + if s.top > 0 { + s.top-- + return s.elements[s.top], nil + } + + return nil, fmt.Errorf("empty stack") +} + +// Size returns the size of the stack +func (s Stack) Size() int { + return s.top +} + +func (s Stack) String() string { + v := "" + for e := 0; e < s.top; e++ { + v += fmt.Sprintf("%v ", s.elements[e]) + } + + return v +} + +func main() { + s := &Stack{} + + s.Push("bob") + s.Push("boo") + s.Push("foo") + s.Pop() + s.Pop() + s.Push("bar") + + fmt.Printf("%v\n", s) +} From 6a437feba99ad09ee187fd526df0e7c2dcac4685 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 5 Oct 2019 17:06:42 -0400 Subject: [PATCH 034/180] Add GC() method to stack --- go/stack.go | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/go/stack.go b/go/stack.go index 366ec10..67559ac 100644 --- a/go/stack.go +++ b/go/stack.go @@ -2,7 +2,10 @@ package main import "fmt" -// Stack is an implementation of a stack data structure +// Stack is an implementation of a stack data structure. This implementation +// is optimized for deterministic latency, at the expense of additional memory. +// +// The GC() function can be called to reclaim mamory when it is safe to do so. type Stack struct { elements []interface{} top int @@ -28,6 +31,13 @@ func (s *Stack) Pop() (interface{}, error) { return nil, fmt.Errorf("empty stack") } +// GC garbage collects popped elements +func (s *Stack) GC() { + if s.top > 0 && len(s.elements) > s.top { + s.elements = s.elements[:s.top] + } +} + // Size returns the size of the stack func (s Stack) Size() int { return s.top @@ -39,7 +49,7 @@ func (s Stack) String() string { v += fmt.Sprintf("%v ", s.elements[e]) } - return v + return fmt.Sprintf("%s%v %v", v, s.Size(), len(s.elements)) } func main() { @@ -48,9 +58,22 @@ func main() { s.Push("bob") s.Push("boo") s.Push("foo") + + v, err := s.Pop() + if err != nil { + panic(err) + } + fmt.Printf("Popped: %v\n", v) + s.Pop() - s.Pop() + v, err = s.Pop() + if err != nil { + panic(err) + } + fmt.Printf("Popped: %v\n", v) s.Push("bar") fmt.Printf("%v\n", s) + s.GC() + fmt.Printf("%v\n", s) } From 8dbff6aefa6b2c941de72ae23cab01e553790c8d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 5 Oct 2019 17:36:19 -0400 Subject: [PATCH 035/180] Calculate parity of integer --- go/parity.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 go/parity.go diff --git a/go/parity.go b/go/parity.go new file mode 100644 index 0000000..d5c0631 --- /dev/null +++ b/go/parity.go @@ -0,0 +1,26 @@ +package main + +import "fmt" + +// Parity is a naive parity calculator +func Parity(v int64) int64 { + parity := int64(0) + + for v > 0 { + parity ^= v & 1 + v >>= 1 + } + + return parity +} + +func main() { + fmt.Printf("1 << 0: %v\n", 1<<0) + fmt.Printf("1 << 1: %v\n", 1<<1) + fmt.Printf("1 << 2: %v\n", 1<<2) + fmt.Printf("1 << 3: %v\n", 1<<3) + fmt.Printf("parity of 1: %v\n", Parity(1)) + fmt.Printf("parity of 2: %v\n", Parity(2)) + fmt.Printf("parity of 3: %v\n", Parity(3)) + fmt.Printf("parity of 4: %v\n", Parity(4)) +} From 6c246bebbea70218b11820a8c75bfcd229d3fabf Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 6 Oct 2019 07:53:20 -0400 Subject: [PATCH 036/180] Start implementing A* search --- go/astar.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 go/astar.go diff --git a/go/astar.go b/go/astar.go new file mode 100644 index 0000000..363d1db --- /dev/null +++ b/go/astar.go @@ -0,0 +1,72 @@ +package main + +import "fmt" + +// Peer is a graph edge +type Peer struct { + Weight int + Node *Node +} + +// Node is a vertex in a graph +type Node struct { + Label string + Peers []*Peer // List of weighted peers +} + +// NewNode creates a new graph node +func NewNode(label string) *Node { + return &Node{ + Label: label, + Peers: []*Peer{}, + } +} + +// AddPeer adds node as a peer +func (n *Node) AddPeer(node *Node, weight int) *Peer { + peer := &Peer{weight, node} + n.Peers = append(n.Peers, peer) + return peer +} + +// StateMap is a list of global k/v pairs +type StateMap map[string]interface{} + +// Graph is a convenience struct for global graph state +type Graph struct { + Root *Node + State StateMap +} + +// NewGraph creates a new graph +func NewGraph(label string) *Graph { + return &Graph{ + Root: NewNode(label), + State: StateMap{}, + } +} + +// PeerHeap is a priority queue of peers +type PeerHeap []*Peer + +func (h PeerHeap) Len() int { + return len(h) +} + +func (h PeerHeap) Less(i, j int) bool { + return h[i].Weight < h[j].Weight +} + +func (h PeerHeap) Swap(i, j int) { + h[i], h[j] = h[j], h[i] +} + +func main() { + g := NewGraph("test") + + peer := g.Root.AddPeer(NewNode("foo"), 1) + fmt.Printf("%+v\n", peer) + + peer = peer.Node.AddPeer(NewNode("bar"), 2) + fmt.Printf("%+v\n", g.Root.Peers[0].Node.Peers[0].Node) +} From d26a33b3f2c6e0441735dcd900c318adb27610a0 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 6 Oct 2019 16:55:23 -0400 Subject: [PATCH 037/180] Working A* search --- go/astar.go | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 126 insertions(+), 5 deletions(-) diff --git a/go/astar.go b/go/astar.go index 363d1db..45c6b33 100644 --- a/go/astar.go +++ b/go/astar.go @@ -4,8 +4,8 @@ import "fmt" // Peer is a graph edge type Peer struct { - Weight int - Node *Node + Cost int + Node *Node } // Node is a vertex in a graph @@ -23,8 +23,8 @@ func NewNode(label string) *Node { } // AddPeer adds node as a peer -func (n *Node) AddPeer(node *Node, weight int) *Peer { - peer := &Peer{weight, node} +func (n *Node) AddPeer(node *Node, cost int) *Peer { + peer := &Peer{cost, node} n.Peers = append(n.Peers, peer) return peer } @@ -54,13 +54,113 @@ func (h PeerHeap) Len() int { } func (h PeerHeap) Less(i, j int) bool { - return h[i].Weight < h[j].Weight + return h[i].Cost < h[j].Cost } func (h PeerHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +func (h *PeerHeap) Push(v interface{}) { + *h = append(*h, v.(*Peer)) +} + +func (h *PeerHeap) Pop() interface{} { + // Return the first element, and resize slice + n := len(*h) + ret := (*h)[n-1] + *h = (*h)[:n-1] + return ret +} + +type PeerHeaps = map[*Node]*PeerHeap +type Path struct { + Nodes []*Node + Cost int +} + +func NewPath() *Path { + return &Path{ + Nodes: []*Node{}, + } +} + +func (p Path) Clone() *Path { + newPath := &Path{[]*Node{}, p.Cost} + for _, node := range p.Nodes { + newPath.Nodes = append(newPath.Nodes, node) + } + + return newPath +} + +type AStarSearcher struct { + From *Node + To *Node + paths []*Path + minCost int +} + +func NewAStarSearcher(from *Node, to *Node) *AStarSearcher { + return &AStarSearcher{ + From: from, + To: to, + paths: []*Path{}, + minCost: -1, + } +} + +func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { + path.Nodes = append(path.Nodes, cur) + + if cur == a.To { + // Found! + a.paths = append(a.paths, path) + if a.minCost == -1 || path.Cost < a.minCost { + a.minCost = path.Cost + } + return true, path + } + + // If no paths from here, return false + if len(cur.Peers) == 0 { + return false, path + } + + // Add peers to priority queue weighted by total cost + peerHeaps := &PeerHeap{} + for _, peer := range cur.Peers { + // Prune search if we already found a lower cost path + if a.minCost == -1 || path.Cost+peer.Cost < a.minCost { + peerHeaps.Push(&Peer{path.Cost + peer.Cost, peer.Node}) + } + } + + // Search available paths and return the lowest cost path + minCost := -1 + var minPath *Path + for peerHeaps.Len() != 0 { + peer := peerHeaps.Pop().(*Peer) + newPath := path.Clone() + newPath.Cost = peer.Cost + found, foundPath := a.search(peer.Node, newPath) + if found && (minCost == -1 || foundPath.Cost < minCost) { + minCost = foundPath.Cost + minPath = foundPath + } + } + + if minPath != nil { + return true, minPath + } + + return false, path +} + +func (a *AStarSearcher) Search() (bool, *Path) { + return a.search(a.From, NewPath()) +} + func main() { g := NewGraph("test") @@ -69,4 +169,25 @@ func main() { peer = peer.Node.AddPeer(NewNode("bar"), 2) fmt.Printf("%+v\n", g.Root.Peers[0].Node.Peers[0].Node) + + peer1 := peer.Node.AddPeer(NewNode("bar1"), 1) + peer2 := peer.Node.AddPeer(NewNode("bar2"), 2) + + peer1 = peer1.Node.AddPeer(NewNode("bars1"), 1) + peer2 = peer2.Node.AddPeer(NewNode("bars2"), 2) + + peer1 = peer1.Node.AddPeer(NewNode("barsx1"), 1) + peer2 = peer2.Node.AddPeer(NewNode("barsx2"), 2) + + target := NewNode("target") + peer1.Node.AddPeer(target, 1) + peer2.Node.AddPeer(target, 2) + + finder := NewAStarSearcher(g.Root, target) + found, path := finder.Search() + + fmt.Println(found, path.Cost) + for i, node := range path.Nodes { + fmt.Println(i, node.Label) + } } From 2fadb9b44894ab27c05ac3c811e140cf83d68d8e Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 6 Oct 2019 16:57:53 -0400 Subject: [PATCH 038/180] Add comments to A* search --- go/astar.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/go/astar.go b/go/astar.go index 45c6b33..06dd720 100644 --- a/go/astar.go +++ b/go/astar.go @@ -1,5 +1,8 @@ package main +// Framework for A* search. Reduces to Djikstra's algorithm. +// Mohit Cheppudira 2019 + import "fmt" // Peer is a graph edge @@ -162,6 +165,8 @@ func (a *AStarSearcher) Search() (bool, *Path) { } func main() { + // Create a graph with two paths to a target with different + // costs. g := NewGraph("test") peer := g.Root.AddPeer(NewNode("foo"), 1) @@ -183,6 +188,7 @@ func main() { peer1.Node.AddPeer(target, 1) peer2.Node.AddPeer(target, 2) + // Find the lowest cost path to target finder := NewAStarSearcher(g.Root, target) found, path := finder.Search() From 11fda0a9a4f0ba93a00fbf1d3e986e41f9b0aaca Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 6 Oct 2019 20:02:08 -0400 Subject: [PATCH 039/180] Return actual shortest path instead of last found path --- go/astar.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/go/astar.go b/go/astar.go index 06dd720..241434a 100644 --- a/go/astar.go +++ b/go/astar.go @@ -3,7 +3,10 @@ package main // Framework for A* search. Reduces to Djikstra's algorithm. // Mohit Cheppudira 2019 -import "fmt" +import ( + "container/heap" + "fmt" +) // Peer is a graph edge type Peer struct { @@ -101,6 +104,7 @@ type AStarSearcher struct { From *Node To *Node paths []*Path + minPath *Path minCost int } @@ -121,6 +125,7 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { a.paths = append(a.paths, path) if a.minCost == -1 || path.Cost < a.minCost { a.minCost = path.Cost + a.minPath = path } return true, path } @@ -132,6 +137,7 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { // Add peers to priority queue weighted by total cost peerHeaps := &PeerHeap{} + heap.Init(peerHeaps) for _, peer := range cur.Peers { // Prune search if we already found a lower cost path if a.minCost == -1 || path.Cost+peer.Cost < a.minCost { @@ -161,7 +167,11 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { } func (a *AStarSearcher) Search() (bool, *Path) { - return a.search(a.From, NewPath()) + found, _ := a.search(a.From, NewPath()) + if found { + return true, a.minPath + } + return false, nil } func main() { From 79096a91980f71628d45eea78b11ee3ebd22165d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 6 Oct 2019 20:10:29 -0400 Subject: [PATCH 040/180] A* optimizations --- go/astar.go | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/go/astar.go b/go/astar.go index 241434a..2f2db50 100644 --- a/go/astar.go +++ b/go/astar.go @@ -123,10 +123,6 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { if cur == a.To { // Found! a.paths = append(a.paths, path) - if a.minCost == -1 || path.Cost < a.minCost { - a.minCost = path.Cost - a.minPath = path - } return true, path } @@ -146,16 +142,15 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { } // Search available paths and return the lowest cost path - minCost := -1 var minPath *Path for peerHeaps.Len() != 0 { peer := peerHeaps.Pop().(*Peer) newPath := path.Clone() newPath.Cost = peer.Cost found, foundPath := a.search(peer.Node, newPath) - if found && (minCost == -1 || foundPath.Cost < minCost) { - minCost = foundPath.Cost + if found && (minPath == nil || foundPath.Cost < minPath.Cost) { minPath = foundPath + a.minCost = minPath.Cost } } @@ -167,11 +162,7 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { } func (a *AStarSearcher) Search() (bool, *Path) { - found, _ := a.search(a.From, NewPath()) - if found { - return true, a.minPath - } - return false, nil + return a.search(a.From, NewPath()) } func main() { From 1a5906653f59cfd4ce4af76d23a9c32d35650d25 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 25 Feb 2020 17:32:40 -0500 Subject: [PATCH 041/180] Added basic typescript / tensorflow demo. --- go/astar.go | 10 +- stats/tstf/.babelrc | 11 + stats/tstf/.eslintignore | 1 + stats/tstf/.eslintrc.js | 18 + stats/tstf/index.html | 36 + stats/tstf/package-lock.json | 12993 +++++++++++++++++++++++++++++++ stats/tstf/package.json | 63 + stats/tstf/postcss.config.js | 11 + stats/tstf/src/index.ts | 102 + stats/tstf/src/style.css | 91 + stats/tstf/stylelint.config.js | 16 + stats/tstf/tailwind.config.js | 7 + stats/tstf/webpack.config.js | 66 + 13 files changed, 13421 insertions(+), 4 deletions(-) create mode 100644 stats/tstf/.babelrc create mode 100644 stats/tstf/.eslintignore create mode 100644 stats/tstf/.eslintrc.js create mode 100644 stats/tstf/index.html create mode 100644 stats/tstf/package-lock.json create mode 100644 stats/tstf/package.json create mode 100644 stats/tstf/postcss.config.js create mode 100644 stats/tstf/src/index.ts create mode 100644 stats/tstf/src/style.css create mode 100644 stats/tstf/stylelint.config.js create mode 100644 stats/tstf/tailwind.config.js create mode 100644 stats/tstf/webpack.config.js diff --git a/go/astar.go b/go/astar.go index 2f2db50..f7b9ea8 100644 --- a/go/astar.go +++ b/go/astar.go @@ -128,7 +128,7 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { // If no paths from here, return false if len(cur.Peers) == 0 { - return false, path + return false, nil } // Add peers to priority queue weighted by total cost @@ -158,7 +158,7 @@ func (a *AStarSearcher) search(cur *Node, path *Path) (bool, *Path) { return true, minPath } - return false, path + return false, nil } func (a *AStarSearcher) Search() (bool, *Path) { @@ -182,8 +182,10 @@ func main() { peer1 = peer1.Node.AddPeer(NewNode("bars1"), 1) peer2 = peer2.Node.AddPeer(NewNode("bars2"), 2) - peer1 = peer1.Node.AddPeer(NewNode("barsx1"), 1) - peer2 = peer2.Node.AddPeer(NewNode("barsx2"), 2) + peer1.Node.AddPeer(NewNode("barsx1a"), 1) + peer1 = peer1.Node.AddPeer(NewNode("barsx1b"), 1) + peer2.Node.AddPeer(NewNode("barsx2a"), 2) + peer2 = peer2.Node.AddPeer(NewNode("barsx2b"), 2) target := NewNode("target") peer1.Node.AddPeer(target, 1) diff --git a/stats/tstf/.babelrc b/stats/tstf/.babelrc new file mode 100644 index 0000000..37ad185 --- /dev/null +++ b/stats/tstf/.babelrc @@ -0,0 +1,11 @@ +{ + "presets": [ + "@babel/env", + "@babel/typescript" + ], + "plugins": [ + "@babel/proposal-class-properties", + "@babel/proposal-object-rest-spread", + "@babel/plugin-transform-runtime", + ] +} \ No newline at end of file diff --git a/stats/tstf/.eslintignore b/stats/tstf/.eslintignore new file mode 100644 index 0000000..8d87b1d --- /dev/null +++ b/stats/tstf/.eslintignore @@ -0,0 +1 @@ +node_modules/* diff --git a/stats/tstf/.eslintrc.js b/stats/tstf/.eslintrc.js new file mode 100644 index 0000000..ef0eb56 --- /dev/null +++ b/stats/tstf/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + "parser": "babel-eslint", + "env": { + "browser": true, + "jquery": true, + "es6": true, + "mocha": true, + }, + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 6, + }, + "rules": { + "max-len": [1, 180, 2, { ignoreComments: true }], + "prefer-destructuring": "off", + }, + "extends": ["airbnb-base"] +}; diff --git a/stats/tstf/index.html b/stats/tstf/index.html new file mode 100644 index 0000000..6f393d7 --- /dev/null +++ b/stats/tstf/index.html @@ -0,0 +1,36 @@ + + + + float64 - Cloud Software Development and Consulting + + + + + + + + + + + + + + +

+ + + \ No newline at end of file diff --git a/stats/tstf/package-lock.json b/stats/tstf/package-lock.json new file mode 100644 index 0000000..7e454f4 --- /dev/null +++ b/stats/tstf/package-lock.json @@ -0,0 +1,12993 @@ +{ + "name": "tstf", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", + "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-call-delegate": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", + "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", + "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", + "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", + "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", + "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", + "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", + "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", + "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", + "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", + "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", + "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-typescript": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-typescript": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", + "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-typescript": "^7.8.3" + } + }, + "@babel/runtime": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", + "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@tensorflow/tfjs": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-1.5.2.tgz", + "integrity": "sha512-BCvcbnkE/zMdORIGE7TFAiJU3zLLVUaRv/HyWucVVyHU40oU4L5mGyRXK6RwqU38KmeK3HSI5rUHop4cLNUaRQ==", + "requires": { + "@tensorflow/tfjs-converter": "1.5.2", + "@tensorflow/tfjs-core": "1.5.2", + "@tensorflow/tfjs-data": "1.5.2", + "@tensorflow/tfjs-layers": "1.5.2" + } + }, + "@tensorflow/tfjs-converter": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.5.2.tgz", + "integrity": "sha512-RRrB8lZFxjLPHO6TwEJPgViVuJP5yqq0IPqA35PhWLYjsNNuC6Tx8vxEa5BZ0Le0mX21CTURak6pdmyac/Jc2w==" + }, + "@tensorflow/tfjs-core": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.5.2.tgz", + "integrity": "sha512-Rj6l8xf0PxrEKctvX3bvxjqhHLaCBQT0ChvqFK6//HBu8A1/ao4SzeVKpXKNnP9Niax+qV3c9U9VcOwwIkCMag==", + "requires": { + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "@types/webgl2": "0.0.4", + "node-fetch": "~2.1.2", + "seedrandom": "2.4.3" + } + }, + "@tensorflow/tfjs-data": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.5.2.tgz", + "integrity": "sha512-ruCsTSyH67CADWthgLQlWKh8u8YGEXD+4vsW8uOGdFNcDFLcL0ffy4jsSzIV/X6NdPIWYsvSHmiz57LtgfCFew==", + "requires": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.1.2" + } + }, + "@tensorflow/tfjs-layers": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.5.2.tgz", + "integrity": "sha512-fn2hi5D1sOKGEgiBCuoU/hTHO87znODweGivIn6x2HMtF1EC39QWroYQBWzJyrWWMOUZZ4nOFR6coA0Fkhc+nA==" + }, + "@tensorflow/tfjs-vis": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-vis/-/tfjs-vis-1.4.0.tgz", + "integrity": "sha512-q47Pd6wl8O2NKVfD2dNSX6JIVXzVKpsPRTr1mEsNlzXjX0XLZWaydzVKbgajWvkY2/BwpTFynSC/68v6iDxKlw==", + "requires": { + "d3-format": "~1.3.0", + "d3-selection": "~1.3.0", + "glamor": "~2.20.40", + "preact": "~8.2.9", + "vega": "~5.4.0", + "vega-embed": "~5.1.2", + "vega-lite": "~4.0.0-beta.1" + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/clone": { + "version": "0.1.30", + "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz", + "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=" + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha512-mky/O83TXmGY39P1H9YbUpjV6l6voRYlufqfFCvel8l1phuy8HRjdWc1rrPuN53ITBJlbyMSV6z3niOySO5pgQ==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "13.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.5.tgz", + "integrity": "sha512-PfSBCTQhAQg6QBP4UhXgrZ/wQ3pjfwBr4sA7Aul+pC9XwGgm9ezrJF7OiC/I4Kf+7VPu/5ThKngAruqxyctZfA==" + }, + "@types/node-fetch": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.5.tgz", + "integrity": "sha512-IWwjsyYjGw+em3xTvWVQi5MgYKbRs0du57klfTaZkv/B24AEQ/p/IopNeqIYNy3EsfHOpg8ieQSDomPcsYMHpA==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/offscreencanvas": { + "version": "2019.3.0", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", + "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true + }, + "@types/seedrandom": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz", + "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz", + "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webgl-ext": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz", + "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" + }, + "@types/webgl2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.4.tgz", + "integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==" + }, + "@types/webpack": { + "version": "4.41.6", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.6.tgz", + "integrity": "sha512-iWRpV5Ej+8uKrgxp6jXz3v7ZTjgtuMXY+rsxQjFNU0hYCnHkpA7vtiNffgxjuxX4feFHBbz0IF76OzX2OqDYPw==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-sources": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.6.tgz", + "integrity": "sha512-FtAWR7wR5ocJ9+nP137DV81tveD/ZgB1sadnJ/axUGM3BUVfRPx8oQNMtv3JNfTeHx3VP7cXiyfR/jmtEsVHsQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flat-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", + "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.26", + "postcss-value-parser": "^4.0.2" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.8.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", + "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001027", + "electron-to-chromium": "^1.3.349", + "node-releases": "^1.1.49" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001030", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001030.tgz", + "integrity": "sha512-QGK0W4Ft/Ac+zTjEiRJfwDNATvS3fodDczBXrH42784kcfqcDKpEPfN08N0HQjrAp8He/Jw8QiSS9QRn7XAbUw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "requires": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-in-js-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", + "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", + "requires": { + "hyphenate-style-name": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-delaunay": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.2.1.tgz", + "integrity": "sha512-ZZdeJl6cKRyqYVFYK+/meXvWIrAvZsZTD7WSxl4OPXCmuXNgDyACAClAJHD63zL25TA+IJGURUNO7rFseNFCYw==", + "requires": { + "delaunator": "4" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-force": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.0.1.tgz", + "integrity": "sha512-zh73/N6+MElRojiUG7vmn+3vltaKon7iD5vB/7r9nUaBeftXMzRo5IWEG63DLBCto4/8vr9i3m9lwr1OTJNiCg==", + "requires": { + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "d3-geo": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz", + "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==", + "requires": { + "d3-array": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-geo-projection": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.8.1.tgz", + "integrity": "sha512-VObmT3vQQgU7IxkDwyIuOrWK4AS2OHyvucp1vHo98WE7DvAN+VcS3Pf/oKenszPfbMtHusOfQNBLEMyGHguvTg==", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.10.0", + "resolve": "^1.1.10" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-scale": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", + "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", + "requires": { + "d3-array": "1.2.0 - 2", + "d3-format": "1", + "d3-interpolate": "^1.2.0", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", + "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecstatic": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz", + "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==", + "dev": true, + "requires": { + "he": "^1.1.1", + "mime": "^1.6.0", + "minimist": "^1.1.0", + "url-join": "^2.0.5" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.360", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.360.tgz", + "integrity": "sha512-RE1pv2sjQiDRRN1nI0fJ0eQHZ9le4oobu16OArnwEUV5ycAU5SNjFyvzjZ1gPUAqBa2Ud1XagtW8j3ZXfHuQHA==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz", + "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.0.0", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", + "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "loader-fs-cache": "^1.0.2", + "loader-utils": "^1.2.3", + "object-hash": "^2.0.1", + "schema-utils": "^2.6.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "dev": true, + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.1.0.tgz", + "integrity": "sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==", + "dev": true, + "requires": { + "loader-utils": "^1.4.0", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-revision-webpack-plugin": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/git-revision-webpack-plugin/-/git-revision-webpack-plugin-3.0.4.tgz", + "integrity": "sha512-ym4Zkl32HtTRZVVgl1KoE+sWtgeFyDjN3vaBQfn8cCv1btAX7rdDY9tgpv4Zi+yxq150pp+pUkGH9L1lRpZOUg==", + "dev": true + }, + "glamor": { + "version": "2.20.40", + "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz", + "integrity": "sha512-DNXCd+c14N9QF8aAKrfl4xakPk5FdcFwmH7sD0qnC0Pr7xoZ5W9yovhUrY/dJc3psfGGXC58vqQyRtuskyUJxA==", + "requires": { + "fbjs": "^0.8.12", + "inline-style-prefixer": "^3.0.6", + "object-assign": "^4.1.1", + "prop-types": "^15.5.10", + "through": "^2.3.8" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.6.tgz", + "integrity": "sha512-Kp6rShEsCHhF5dD3EWKdkgVA8ix90oSUJ0VY4g9goxxa0+f4lx63muTftn0mlJ/+8IESGWyKnP//V2D7S4ZbIQ==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-server": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.12.1.tgz", + "integrity": "sha512-T0jB+7J7GJ2Vo+a4/T7P7SbQ3x2GPDnqRqQXdfEuPuUOmES/9NBxPnDm7dh1HGEeUWqUmLUNtGV63ZC5Uy3tGA==", + "dev": true, + "requires": { + "basic-auth": "^1.0.3", + "colors": "^1.3.3", + "corser": "^2.0.1", + "ecstatic": "^3.3.2", + "http-proxy": "^1.17.0", + "opener": "^1.5.1", + "optimist": "~0.6.1", + "portfinder": "^1.0.20", + "secure-compare": "3.0.1", + "union": "~0.5.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "hyphenate-style-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inline-style-prefixer": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", + "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", + "requires": { + "bowser": "^1.7.3", + "css-in-js-utils": "^2.0.0" + } + }, + "inquirer": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", + "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "node-sass": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", + "dev": true, + "requires": { + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", + "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^7.0.18" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", + "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nested": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.1.tgz", + "integrity": "sha512-AMayXX8tS0HCp4O4lolp4ygj9wBn32DJWXvG6gCv+ZvJrEa00GUxJcJEEzMh87BIe6FrWdYkpR2cuyqHKrxmXw==", + "dev": true, + "requires": { + "postcss": "^7.0.21", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "dev": true + }, + "preact": { + "version": "8.2.9", + "resolved": "https://registry.npmjs.org/preact/-/preact-8.2.9.tgz", + "integrity": "sha512-ThuGXBmJS3VsT+jIP+eQufD3L8pRw/PY3FoCys6O9Pu6aF12Pn9zAJDX99TfwRAFOCEKm/P0lwiPTbqKMJp0fA==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reduce-css-calc": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", + "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", + "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=", + "dev": true + }, + "seedrandom": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", + "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "style-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.6.4" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylelint-config-recommended": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", + "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "tailwindcss": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.2.0.tgz", + "integrity": "sha512-CKvY0ytB3ze5qvynG7qv4XSpQtFNGPbu9pUn8qFdkqgD8Yo/vGss8mhzbqls44YCXTl4G62p3qVZBj45qrd6FQ==", + "dev": true, + "requires": { + "autoprefixer": "^9.4.5", + "bytes": "^3.0.0", + "chalk": "^3.0.0", + "detective": "^5.2.0", + "fs-extra": "^8.0.0", + "lodash": "^4.17.15", + "node-emoji": "^1.8.1", + "normalize.css": "^8.0.1", + "postcss": "^7.0.11", + "postcss-functions": "^3.0.0", + "postcss-js": "^2.0.0", + "postcss-nested": "^4.1.1", + "postcss-selector-parser": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "reduce-css-calc": "^2.1.6", + "resolve": "^1.14.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.4.tgz", + "integrity": "sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "find-cache-dir": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.0.tgz", + "integrity": "sha512-PtXtQb7IrD8O+h6Cq1dbpJH5NzD8+9keN1zZ0YlpDzl1PwXEJEBj6u1Xa92t1Hwluoozd9TNKul5Hi2iqpsWwg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tslib": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", + "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.2.tgz", + "integrity": "sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "undefined": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/undefined/-/undefined-0.1.0.tgz", + "integrity": "sha1-m3BqSzKtMMIMpP5l3cu72sMr3tA=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "requires": { + "qs": "^6.4.0" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", + "dev": true + }, + "url-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-3.0.0.tgz", + "integrity": "sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vega": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-5.4.0.tgz", + "integrity": "sha512-1c77yse5ZOYXgVig5RjJCWwM8yHvY1Ds7ncusiT1Hu3wXVhOw8TKe2CLCbcOpWSmPRJ48BRw/6qF70iS4zWYAQ==", + "requires": { + "vega-crossfilter": "^4.0.1", + "vega-dataflow": "^5.2.1", + "vega-encode": "^4.3.0", + "vega-event-selector": "^2.0.0", + "vega-expression": "^2.6.0", + "vega-force": "^4.0.1", + "vega-functions": "^5.3.0", + "vega-geo": "^4.0.3", + "vega-hierarchy": "^4.0.1", + "vega-loader": "^4.1.0", + "vega-parser": "^5.7.0", + "vega-projection": "^1.2.1", + "vega-regression": "^1.0.0", + "vega-runtime": "^5.0.1", + "vega-scale": "^4.1.1", + "vega-scenegraph": "^4.2.0", + "vega-statistics": "^1.4.0", + "vega-transforms": "^4.1.0", + "vega-typings": "^0.7.0", + "vega-util": "^1.10.0", + "vega-view": "^5.2.2", + "vega-view-transforms": "^4.3.1", + "vega-voronoi": "^4.0.1", + "vega-wordcloud": "^4.0.2" + } + }, + "vega-canvas": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.1.tgz", + "integrity": "sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw==" + }, + "vega-crossfilter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.0.1.tgz", + "integrity": "sha512-wLNS4JzKaOLj8EAzI/v8XBJjUWMRWYSu6EeQF4o9Opq/78u87Ol9Lc5I27UHsww5dNNH/tHubAV4QPIXnGOp5Q==", + "requires": { + "d3-array": "^2.0.3", + "vega-dataflow": "^5.1.0", + "vega-util": "^1.8.0" + } + }, + "vega-dataflow": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.5.0.tgz", + "integrity": "sha512-9eRe2qLpwvEegBoSaH3vdziSLMZSszY02wxVmvcFzHe57Rf/eYEr0YRuW4qc+gMmwURPYu9wtmeUTiK4XhDKXw==", + "requires": { + "vega-loader": "^4.0.0", + "vega-util": "^1.11.0" + } + }, + "vega-embed": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-5.1.3.tgz", + "integrity": "sha512-y6QMVwK+f5xfg9nntGdflDdOWOh6vAwGaM5SH/xdnLYrFsbQXZaVkgzZ0jaqRbpyFNvTLU80XRWQpR/DNxvyXw==", + "requires": { + "d3-selection": "^1.4.0", + "deepmerge": "^4.0.0", + "json-stringify-pretty-compact": "^2.0.0", + "semver": "^6.3.0", + "vega-schema-url-parser": "^1.1.0", + "vega-themes": "^2.4.0", + "vega-tooltip": "^0.19.1" + }, + "dependencies": { + "d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "vega-encode": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.5.2.tgz", + "integrity": "sha512-iL1njX++VE0SAMJuDqc0k9kmsU8AeyRRHv15MXh2+PXe2JmyiSWn6HcF3RzFUy5xmKlZOU5BiL8KrTgTrxh+WA==", + "requires": { + "d3-array": "^2.4.0", + "d3-format": "^1.4.2", + "d3-interpolate": "^1.4.0", + "vega-dataflow": "^5.5.0", + "vega-scale": "^6.0.0", + "vega-time": "^1.0.0", + "vega-util": "^1.12.2" + }, + "dependencies": { + "d3-format": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + }, + "vega-scale": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-6.0.0.tgz", + "integrity": "sha512-uNJ5LC+s+XLxdO2iXC36/TLen3mMNv0wzhMZMNXa8h+Ih10geJ57sHbYYA8Z8403JC9AYTaWUe7m0H9CHgV9NA==", + "requires": { + "d3-array": "^2.4.0", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.2.1", + "vega-util": "^1.12.1" + } + } + } + }, + "vega-event-selector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.2.tgz", + "integrity": "sha512-Uv72vBfM0lrlI2belKHFMZuVnW2uJl2ShqWPwGSXPVe6p+PzgqoPJYC8A/i5N8B54UA4UMDzlbBeo3x7q2W9Yg==" + }, + "vega-expression": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-2.6.3.tgz", + "integrity": "sha512-sME1+45BToTGsftb1Q6Ubs2iRYEoXkD2NRGnJuKS9YJ2ITzZwPHF/jy2kHW3iLpuNjj54meaO7HMQ/hUKrciUw==", + "requires": { + "vega-util": "^1.11.0" + } + }, + "vega-force": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.0.3.tgz", + "integrity": "sha512-4stItN4jD9H1CENaCz4jXRNS1Bi9cozMOUjX2824FeJENi2RZSiAZAaGbscgerZQ/jbNcOHD8PHpC2pWldEvGA==", + "requires": { + "d3-force": "^2.0.1", + "vega-dataflow": "^5.4.0", + "vega-util": "^1.11.0" + } + }, + "vega-functions": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.5.1.tgz", + "integrity": "sha512-VTfEwf/ChSOGc4d4yUIgu2XoScky6NH06WN4vwVGY5PREhsyVPsQ+p2zqgD/N/a00EyWPHeOSHEhsPU28oIMtQ==", + "requires": { + "d3-array": "^2.4.0", + "d3-color": "^1.4.0", + "d3-format": "^1.4.2", + "d3-geo": "^1.11.9", + "d3-time-format": "^2.2.2", + "vega-dataflow": "^5.5.0", + "vega-expression": "^2.6.3", + "vega-scale": "^6.0.0", + "vega-scenegraph": "^4.5.0", + "vega-selections": "^5.1.0", + "vega-statistics": "^1.7.1", + "vega-time": "^1.0.0", + "vega-util": "^1.12.1" + }, + "dependencies": { + "d3-format": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + }, + "vega-scale": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-6.0.0.tgz", + "integrity": "sha512-uNJ5LC+s+XLxdO2iXC36/TLen3mMNv0wzhMZMNXa8h+Ih10geJ57sHbYYA8Z8403JC9AYTaWUe7m0H9CHgV9NA==", + "requires": { + "d3-array": "^2.4.0", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.2.1", + "vega-util": "^1.12.1" + } + } + } + }, + "vega-geo": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.3.0.tgz", + "integrity": "sha512-Rcz4z+TR4qy727pjBWSsbMAn8eM9bDZ5MXKqo5AWuFkoj/8ngv13vafHd1tvEMTA8L5BjAW3/eTqN4tyx9KSQg==", + "requires": { + "d3-array": "^2.4.0", + "d3-color": "^1.4.0", + "d3-geo": "^1.11.9", + "vega-canvas": "^1.2.1", + "vega-dataflow": "^5.1.1", + "vega-projection": "^1.4.0", + "vega-statistics": "^1.7.1", + "vega-util": "^1.12.1" + } + }, + "vega-hierarchy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.0.3.tgz", + "integrity": "sha512-9wNe+KyKqZW1S4++jCC38HuAhZbqNhfY7gOvwiMLjsp65tMtRETrtvYfHkULClm3UokUIX54etAXREAGW7znbw==", + "requires": { + "d3-hierarchy": "^1.1.8", + "vega-dataflow": "^5.4.0", + "vega-util": "^1.11.0" + } + }, + "vega-lite": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-4.0.2.tgz", + "integrity": "sha512-J74ThSBg2l6cjSDOw7Sjc2YP2ETZxEdyz8lSkjnZsTKbuvy4wbvrrbqdiGo34ffxvTdGSVz+SuXLSxGEwKdxAg==", + "requires": { + "@types/clone": "~0.1.30", + "@types/fast-json-stable-stringify": "^2.0.0", + "array-flat-polyfill": "^1.0.1", + "clone": "~2.1.2", + "fast-deep-equal": "~3.1.1", + "fast-json-stable-stringify": "~2.0.0", + "json-stringify-pretty-compact": "~2.0.0", + "tslib": "~1.10.0", + "vega-event-selector": "~2.0.2", + "vega-expression": "~2.6.3", + "vega-typings": "~0.12.0", + "vega-util": "~1.12.1", + "yargs": "~15.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "vega-typings": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.12.4.tgz", + "integrity": "sha512-2tnAfFMxaGul1875q6v6vZW20s+j9hYGlt/lpp3yVYYGARG7hjgwyHpOKnHzw3C/huy4JaHaMhf3psXgG/VnHw==", + "requires": { + "vega-util": "^1.12.1" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.0.2.tgz", + "integrity": "sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^16.1.0" + } + }, + "yargs-parser": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "vega-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.1.3.tgz", + "integrity": "sha512-50aetjuct4WqU7LctwnZqF/NCyya9aZ1HDQZ9unFi++62vOQgRfbXLNL/dZavqwnWX3S9i0ltCznLyFMG4ck8g==", + "requires": { + "d3-dsv": "^1.1.1", + "d3-time-format": "^2.2.1", + "node-fetch": "^2.6.0", + "topojson-client": "^3.0.1", + "vega-util": "^1.11.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + } + } + }, + "vega-parser": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-5.12.0.tgz", + "integrity": "sha512-sIQcWp7aqafpfELEJr+gQDsz7TlLYaHkowKhp3O/pcOdIuvqeI3IYpP2+oNpXVGi8ikcq8cJLcCUMi9oP2Xtrw==", + "requires": { + "vega-dataflow": "^5.5.0", + "vega-event-selector": "^2.0.2", + "vega-expression": "^2.6.3", + "vega-functions": "^5.5.0", + "vega-scale": "^6.0.0", + "vega-util": "^1.12.1" + }, + "dependencies": { + "vega-scale": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-6.0.0.tgz", + "integrity": "sha512-uNJ5LC+s+XLxdO2iXC36/TLen3mMNv0wzhMZMNXa8h+Ih10geJ57sHbYYA8Z8403JC9AYTaWUe7m0H9CHgV9NA==", + "requires": { + "d3-array": "^2.4.0", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.2.1", + "vega-util": "^1.12.1" + } + } + } + }, + "vega-projection": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.4.0.tgz", + "integrity": "sha512-Prb/E41PqZT5b+46rHv6BZLDsXMe+NFClHxJ9NbwW7mntz8aMGAHiYolVa/M2KuTLbsXVgDAPxk/aA9tbQ0SSg==", + "requires": { + "d3-geo": "^1.11.9", + "d3-geo-projection": "^2.7.1" + } + }, + "vega-regression": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.0.4.tgz", + "integrity": "sha512-fHWJ0t1VEZOzpfBrI66Wo6RxMnqvJXYnXcIUZlOrZ9RLLbb1I6cdEASZp0cQ8M2oYAqu0YVgC0UEjnLs9mJaxQ==", + "requires": { + "d3-array": "^2.4.0", + "vega-dataflow": "^5.4.1", + "vega-statistics": "^1.7.2", + "vega-util": "^1.12.2" + } + }, + "vega-runtime": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-5.0.2.tgz", + "integrity": "sha512-Cuv+RY6kprH+vtNERg6xP4dgcdYGD2ZnxPxJNEtGi7dmtQQTBa1s7jQ0VDXTolsO6lKJ3B7np2GzKJYwevgj1A==", + "requires": { + "vega-dataflow": "^5.1.1", + "vega-util": "^1.11.0" + } + }, + "vega-scale": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-4.1.3.tgz", + "integrity": "sha512-hpLrEFntN18e+eRAxa8b8malSbNVQyziKmUMGI1Za8ZB64cYj+A/G87ePE0ExSymfrvc/Xulh4VQZNxkPJll4w==", + "requires": { + "d3-array": "^2.3.2", + "d3-interpolate": "^1.3.2", + "d3-scale": "^3.1.0", + "d3-time": "^1.1.0", + "vega-util": "^1.11.0" + } + }, + "vega-scenegraph": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.5.0.tgz", + "integrity": "sha512-nO1bTFwhLdkOPzJ++f8dmlMX6OLZya9c94/HZNwFRfGNfri1vXyCIudFwCJD9/h0dJ0kSWfG8ybH9wDQMcZZDw==", + "requires": { + "d3-path": "^1.0.9", + "d3-shape": "^1.3.7", + "vega-canvas": "^1.2.1", + "vega-loader": "^4.1.3", + "vega-util": "^1.12.1" + } + }, + "vega-schema-url-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz", + "integrity": "sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg==" + }, + "vega-selections": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.1.0.tgz", + "integrity": "sha512-Gm+16RaCMkWbimqKh9kuIGMK91vutJsTbIDKBXxmq0c3pTvf+Djy6KfBoFsipEJ9wkwhXHSqpLqS1tExV93E9g==", + "requires": { + "vega-expression": "^2.6.1", + "vega-util": "^1.11.0" + } + }, + "vega-statistics": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.7.2.tgz", + "integrity": "sha512-G6rvZ50MqnmiN1fGqDnFoCLWFwBCYt3nCucXu3zWov7A1/lsatvbDKYeSlVlnvT9OHtv4L+3pRpepFh5IhXKFg==", + "requires": { + "d3-array": "^2.4.0" + } + }, + "vega-themes": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.7.1.tgz", + "integrity": "sha512-EHCmMpHfEdLMxIH6JYE2+i6Ni8s0pDpaPr6YMDd0Oj7bRL5Z40KRNlHZikiCSdv45y1d6iCggjdGjazPX0RHJQ==" + }, + "vega-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-1.0.0.tgz", + "integrity": "sha512-r0yOFr/VklJwD3ew1+fEcB7E0LBCLChYlwh0KoO6cTIWMdlC4KhIIUN3/FuBfUZ4qx4V/xp71xH2YYYZTH6izg==", + "requires": { + "d3-array": "^2.3.3", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.1", + "vega-util": "^1.12.0" + } + }, + "vega-tooltip": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.19.1.tgz", + "integrity": "sha512-BNZ5T866SLOai+NZyGxg60U6hZhNINHuX313/z1TrUTeCprYLfCR1Ex4qRozY1WPY3HfxQcd5czLJMhoAFDotQ==", + "requires": { + "vega-util": "^1.11.1" + } + }, + "vega-transforms": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.6.0.tgz", + "integrity": "sha512-5nsMMnyOME/Xe1xLNGCcQ+BS94cix9gSItHiXqU7wR50ukp5U9JoUxnfeYJkuv37FAbnFpkuYlPcBCWp55zXhQ==", + "requires": { + "d3-array": "^2.4.0", + "vega-dataflow": "^5.5.0", + "vega-statistics": "^1.7.1", + "vega-time": "^1.0.0", + "vega-util": "^1.12.1" + } + }, + "vega-typings": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.7.2.tgz", + "integrity": "sha512-BReB2qRERA/Ke+QoxKDQ7fES25A9Q3qKRm1CJxwvpLGhAl4k5cGDORx6yW+J3rFHMzpJlmdRM+kb489EuphxZQ==", + "requires": { + "vega-util": "^1.10.0" + } + }, + "vega-util": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.12.2.tgz", + "integrity": "sha512-p02+oQ/XU/gzY9S/CTZinym2NKWEMIneLc+FYdUeJZZnDGa3DvcNgUDlVR90JlwLcYZNs5dBdfYLfdRHsKZKiw==" + }, + "vega-view": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.4.0.tgz", + "integrity": "sha512-Q8nH93NceWJRB4/KTehOvsrpbCGGDnkjOCcNQpTsGgu6QRmgMTHtRQTHkE+LhLXMO/55zZrVR22thvMEH9r36w==", + "requires": { + "d3-array": "^2.4.0", + "d3-timer": "^1.0.10", + "vega-dataflow": "^5.5.0", + "vega-functions": "^5.5.1", + "vega-runtime": "^5.0.2", + "vega-scenegraph": "^4.5.0", + "vega-util": "^1.12.1" + } + }, + "vega-view-transforms": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.5.0.tgz", + "integrity": "sha512-8n52147HxNSjQ23NeHN//AWt99zZP+Ukiy4kSbkCJGPZ3dW3NYdunEYNvZWyMmOKSrHIMtgdcHUM9FmPTQpE9w==", + "requires": { + "vega-dataflow": "^5.4.1", + "vega-scenegraph": "^4.4.0", + "vega-util": "^1.12.0" + } + }, + "vega-voronoi": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.1.1.tgz", + "integrity": "sha512-agLmr+UGxJs5KB9D8GeZqxgeWWGoER/eVHPcFFPgVuoNBsrqf2bdoltmIkRnpiRsQnGCibGixhFEDCc9GGNAww==", + "requires": { + "d3-delaunay": "^5.1.3", + "vega-dataflow": "^5.1.1", + "vega-util": "^1.11.0" + } + }, + "vega-wordcloud": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.0.4.tgz", + "integrity": "sha512-+FwgCKTj8JBMbBjNiVciLvjQnk+rC59uyecmlTsmtUGVZz5wyANooYcXt4xtiRu+G8ohdlJ6L/59+UFTaUR8og==", + "requires": { + "vega-canvas": "^1.2.1", + "vega-dataflow": "^5.4.1", + "vega-scale": "^6.0.0", + "vega-statistics": "^1.7.1", + "vega-util": "^1.12.1" + }, + "dependencies": { + "vega-scale": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-6.0.0.tgz", + "integrity": "sha512-uNJ5LC+s+XLxdO2iXC36/TLen3mMNv0wzhMZMNXa8h+Ih10geJ57sHbYYA8Z8403JC9AYTaWUe7m0H9CHgV9NA==", + "requires": { + "d3-array": "^2.4.0", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.2.1", + "vega-util": "^1.12.1" + } + } + } + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.41.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", + "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.6", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "zepto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", + "integrity": "sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g=", + "dev": true + }, + "zepto-webpack": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/zepto-webpack/-/zepto-webpack-1.2.1.tgz", + "integrity": "sha1-ByYQd0ipDJY0nzB2wBWgbMYiLV8=", + "dev": true + } + } +} diff --git a/stats/tstf/package.json b/stats/tstf/package.json new file mode 100644 index 0000000..99c48eb --- /dev/null +++ b/stats/tstf/package.json @@ -0,0 +1,63 @@ +{ + "name": "tstf", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "webpack --progress --mode production --env.NODE_ENV=production --config webpack.config.js", + "build-dev": "webpack --progress --mode development --env.NODE_ENV=development --config webpack.config.js", + "start": "webpack-dev-server --progress --colors --mode development --port 10000 --disable-host-check --env.NODE_ENV=development --env.TAG_NAME=dev --config webpack.config.js", + "serve": "npx http-server -c 1 -p 8092", + "watch": "webpack -w --progress --mode development --env.NODE_ENV=development --config webpack.config.js", + "clean": "rm -rf ./dist/*" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/core": "^7.8.4", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.8.3", + "@babel/preset-env": "^7.8.4", + "@babel/preset-typescript": "^7.8.3", + "@babel/runtime": "^7.8.4", + "autoprefixer": "^9.7.4", + "babel-eslint": "^10.0.3", + "babel-loader": "^8.0.6", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "clean-webpack-plugin": "^3.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.4.2", + "eslint": "^6.8.0", + "eslint-config-airbnb": "^18.0.1", + "eslint-loader": "^3.0.3", + "eslint-plugin-import": "^2.20.1", + "file-loader": "^5.1.0", + "git-revision-webpack-plugin": "^3.0.4", + "glob": "^7.1.6", + "html-webpack-plugin": "^3.2.0", + "http-server": "^0.12.1", + "mini-css-extract-plugin": "^0.9.0", + "node-sass": "^4.13.1", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "postcss-loader": "^3.0.0", + "sass-loader": "^8.0.2", + "style-loader": "^1.1.3", + "stylelint-config-recommended": "^3.0.0", + "tailwindcss": "^1.2.0", + "terser-webpack-plugin": "^2.3.5", + "typescript": "^3.8.2", + "undefined": "^0.1.0", + "url-loader": "^3.0.0", + "webpack": "^4.41.6", + "webpack-cli": "^3.3.11", + "webpack-dev-server": "^3.10.3", + "webpack-merge": "^4.2.2", + "zepto": "^1.2.0", + "zepto-webpack": "^1.2.1" + }, + "dependencies": { + "@tensorflow/tfjs": "^1.5.2", + "@tensorflow/tfjs-vis": "^1.4.0" + } +} diff --git a/stats/tstf/postcss.config.js b/stats/tstf/postcss.config.js new file mode 100644 index 0000000..309bd20 --- /dev/null +++ b/stats/tstf/postcss.config.js @@ -0,0 +1,11 @@ +/* eslint import/no-extraneous-dependencies: "off" */ + +const tailwindcss = require('tailwindcss'); +const autoprefixer = require('autoprefixer'); + +module.exports = { + plugins: [ + tailwindcss('./tailwind.config.js'), + autoprefixer, + ], +}; diff --git a/stats/tstf/src/index.ts b/stats/tstf/src/index.ts new file mode 100644 index 0000000..ff0fcb4 --- /dev/null +++ b/stats/tstf/src/index.ts @@ -0,0 +1,102 @@ +import * as tf from '@tensorflow/tfjs'; +import * as tfvis from '@tensorflow/tfjs-vis'; + +/* eslint-disable no-shadow */ + +async function getData() { + const carsDataReq = await fetch('https://storage.googleapis.com/tfjs-tutorials/carsData.json'); + const carsData = await carsDataReq.json(); + const cleaned = carsData.map((car) => ({ + mpg: car.Miles_per_Gallon, + horsepower: car.Horsepower, + })) + .filter((car) => (car.mpg != null && car.horsepower != null)); + + return cleaned; +} + +function createModel() { + // Create a sequential model + const model = tf.sequential(); + + // Add a single hidden layer + model.add(tf.layers.dense({ inputShape: [1], units: 1, useBias: true })); + + // Add an output layer + model.add(tf.layers.dense({ units: 1, useBias: true })); + + return model; +} + + +/* +function testModel(model, inputData, normalizationData) { + const { + inputMax, inputMin, labelMin, labelMax, + } = normalizationData; + + // Generate predictions for a uniform range of numbers between 0 and 1; + // We un-normalize the data by doing the inverse of the min-max scaling + // that we did earlier. + const [xs, preds] = tf.tidy(() => { + const xs = tf.linspace(0, 1, 100); + const preds = model.predict(xs.reshape([100, 1])); + + const unNormXs = xs + .mul(inputMax.sub(inputMin)) + .add(inputMin); + + const unNormPreds = preds + .mul(labelMax.sub(labelMin)) + .add(labelMin); + + // Un-normalize the data + return [unNormXs.dataSync(), unNormPreds.dataSync()]; + }); + + + const predictedPoints = Array.from(xs).map((val, i) => ({ x: val, y: preds[i] })); + + const originalPoints = inputData.map((d) => ({ + x: d.horsepower, y: d.mpg, + })); + + + tfvis.render.scatterplot( + { name: 'Model Predictions vs Original Data' }, + { values: [originalPoints, predictedPoints], series: ['original', 'predicted'] }, + { + xLabel: 'Horsepower', + yLabel: 'MPG', + height: 300, + }, + ); +} +*/ + +async function run() { + // Load and plot the original input data that we are going to train on. + const data = await getData(); + const values = data.map((d) => ({ + x: d.horsepower, + y: d.mpg, + })); + + tfvis.render.scatterplot( + { name: 'Horsepower v MPG' }, + { values }, + { + xLabel: 'Horsepower', + yLabel: 'MPG', + height: 300, + }, + ); + + const model = createModel(); + tfvis.show.modelSummary({ name: 'Model Summary' }, model); + + // More code will be added below +} + + +$('document').ready(() => { run(); }); diff --git a/stats/tstf/src/style.css b/stats/tstf/src/style.css new file mode 100644 index 0000000..9dd7ae8 --- /dev/null +++ b/stats/tstf/src/style.css @@ -0,0 +1,91 @@ +@tailwind base; + +body { + font-family: Rubik, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-size: 16px; +} + +button { + @apply p-2 text-sm bg-blue-600 text-white border-2 border-blue-600 rounded shadow +} + +strong { + @apply text-black font-extrabold +} + +li { + padding: 0.2rem; +} + +.animated-bg { + background: linear-gradient(-45deg, rgb(168, 199, 245), #fff); + background-size: 400% 400%; + animation: bg-gradient 5s ease infinite; +} + +.animated-bg2 { + background: linear-gradient(-45deg, #fff, #ddd, #eee); + background-size: 400% 400%; + animation: bg-gradient 5s ease infinite; +} + +@keyframes bg-gradient { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +.panel { + @apply flex flex-col justify-center items-center pt-16 pb-16 max-w-screen-lg m-auto +} + +.logo { + filter: grayscale(100%); + @apply p-4 opacity-50 +} + +i.contact { + @apply p-1 text-lg +} + +.blink { + animation: blinker 0.4s linear infinite; +} + +@keyframes blinker { + 50% { + opacity: 0; + } +} + +@tailwind components; + +@tailwind utilities; + +@responsive { + .text-shadow { + text-shadow: 0 2px 4px rgba(0,0,0,0.10); + } + + .text-shadow-md { + text-shadow: 0 4px 8px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.08); + } + + .text-shadow-lg { + text-shadow: 0 15px 30px rgba(0,0,0,0.11), 0 5px 15px rgba(0,0,0,0.08); + } + + .text-shadow-white { + text-shadow: 0 15px 30px rgba(255,255,255,0.11), 0 5px 15px rgba(255,255,255,0.08); + } + + .text-shadow-none { + text-shadow: none; + } + } diff --git a/stats/tstf/stylelint.config.js b/stats/tstf/stylelint.config.js new file mode 100644 index 0000000..09e97a2 --- /dev/null +++ b/stats/tstf/stylelint.config.js @@ -0,0 +1,16 @@ +module.exports = { + extends: ['stylelint-config-recommended'], + rules: { + 'at-rule-no-unknown': [true, { + ignoreAtRules: [ + 'tailwind', + 'apply', + 'variants', + 'responsive', + 'screen', + ], + }], + 'declaration-block-trailing-semicolon': null, + 'no-descending-specificity': null, + }, +}; diff --git a/stats/tstf/tailwind.config.js b/stats/tstf/tailwind.config.js new file mode 100644 index 0000000..3da6fa0 --- /dev/null +++ b/stats/tstf/tailwind.config.js @@ -0,0 +1,7 @@ +module.exports = { + theme: { + extend: {}, + }, + variants: {}, + plugins: [], +}; diff --git a/stats/tstf/webpack.config.js b/stats/tstf/webpack.config.js new file mode 100644 index 0000000..4f7dbee --- /dev/null +++ b/stats/tstf/webpack.config.js @@ -0,0 +1,66 @@ +const path = require('path'); +const webpack = require('webpack'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); +const CopyPlugin = require('copy-webpack-plugin'); +const GitRevisionPlugin = require('git-revision-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); + +const TerserJSPlugin = require('terser-webpack-plugin'); +const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); + + +module.exports = (env) => { + const tag = (env && env.TAG_NAME) || (process && process.env && process.env.TAG_NAME); + const hasTag = typeof tag !== 'undefined' && tag !== ''; + const gitRevisionPlugin = new GitRevisionPlugin(); + + return { + optimization: { + minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})], + }, + plugins: [ + new webpack.ProvidePlugin({ + $: 'zepto-webpack', + }), + new CleanWebpackPlugin(), + new HtmlWebpackPlugin({ + template: './index.html', + filename: 'index.html', + inject: false, + }), + new MiniCssExtractPlugin({ + filename: hasTag ? `[name].${tag}.css` : '[name].[contenthash].css', + chunkFilename: '[id].[contenthash].css', + }), + new CopyPlugin([{ from: 'static/*', flatten: true }], { + // Always copy (for --watch / webpack-dev-server). Needed + // because CleanWebpackPlugin wipes everything out. + copyUnmodified: true, + }), + new webpack.DefinePlugin({ + NODE_ENV: JSON.stringify((env && env.NODE_ENV) || 'dev'), + __VERSION: JSON.stringify(gitRevisionPlugin.version()), + __COMMITHASH: JSON.stringify(gitRevisionPlugin.commithash()), + __BRANCH: JSON.stringify(gitRevisionPlugin.branch()), + }), + ], + devtool: (env && env.NODE_ENV === 'production') ? 'hidden-source-map' : false, + entry: { + index: './src/index.ts', + }, + output: { + filename: hasTag ? `[name].${tag}.js` : '[name].[contenthash].js', + path: path.resolve(__dirname, 'dist'), + }, + resolve: { extensions: ['.ts', '.tsx', '.js', '.json'] }, + module: { + rules: [ + { test: /\.[jt]sx?$/, exclude: /node_modules/, use: [{ loader: 'babel-loader' }, { loader: 'eslint-loader', options: { fix: true } }] }, + { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'] }, + { test: /\.hbs$/, loader: 'handlebars-loader' }, + { test: /\.svg$/, loader: 'svg-inline-loader' }, + ], + }, + }; +}; From 9d0f55118dea5c4d6325652e49bec10a8c46b33a Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 25 Feb 2020 17:33:40 -0500 Subject: [PATCH 042/180] Added some older stuff. --- stats/hellotf.py | 12 ++++++++++++ stats/stopwords.js | 6 ++++++ 2 files changed, 18 insertions(+) create mode 100644 stats/hellotf.py create mode 100644 stats/stopwords.js diff --git a/stats/hellotf.py b/stats/hellotf.py new file mode 100644 index 0000000..95b2967 --- /dev/null +++ b/stats/hellotf.py @@ -0,0 +1,12 @@ +import tensorflow as tf +import numpy as np +from tensorflow import keras + +model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])]) +model.compile(optimizer='sgd', loss='mean_squared_error') + +xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float) +ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float) + +model.fit(xs, ys, epochs=500) +print(model.predict([10.0])) diff --git a/stats/stopwords.js b/stats/stopwords.js new file mode 100644 index 0000000..4d331ca --- /dev/null +++ b/stats/stopwords.js @@ -0,0 +1,6 @@ +function stopwords() { + return [ "a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "could", "did", "do", "does", "doing", "down", "during", "each", "few", "for", "from", "further", "had", "has", "have", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "it", "it's", "its", "itself", "let's", "me", "more", "most", "my", "myself", "nor", "of", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "she", "she'd", "she'll", "she's", "should", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "we", "we'd", "we'll", "we're", "we've", "were", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "would", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves" ]; +}; + +const s = stopwords() +console.log(s.join("\n")) From 39daa481371a47c21075c754b091697bf31732d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 21:03:47 +0000 Subject: [PATCH 043/180] Bump ua-parser-js from 0.7.21 to 0.7.28 in /stats/tstf Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.21 to 0.7.28. - [Release notes](https://github.com/faisalman/ua-parser-js/releases) - [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.21...0.7.28) Signed-off-by: dependabot[bot] --- stats/tstf/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stats/tstf/package-lock.json b/stats/tstf/package-lock.json index 7e454f4..aa395d3 100644 --- a/stats/tstf/package-lock.json +++ b/stats/tstf/package-lock.json @@ -11134,9 +11134,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" }, "uglify-js": { "version": "3.4.10", From a2b2f114358b5db0093fe1351dbccafd5dd579ab Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 6 Sep 2021 15:59:46 -0400 Subject: [PATCH 044/180] Toying with rust. --- rust/hello/.gitignore | 1 + rust/hello/Cargo.lock | 7 +++++++ rust/hello/Cargo.toml | 8 ++++++++ rust/hello/src/main.rs | 14 ++++++++++++++ rust/hello/src/print.rs | 17 +++++++++++++++++ rust/hello/src/strings.rs | 5 +++++ rust/hello/src/types.rs | 10 ++++++++++ rust/hello/src/vars.rs | 13 +++++++++++++ 8 files changed, 75 insertions(+) create mode 100644 rust/hello/.gitignore create mode 100644 rust/hello/Cargo.lock create mode 100644 rust/hello/Cargo.toml create mode 100644 rust/hello/src/main.rs create mode 100644 rust/hello/src/print.rs create mode 100644 rust/hello/src/strings.rs create mode 100644 rust/hello/src/types.rs create mode 100644 rust/hello/src/vars.rs diff --git a/rust/hello/.gitignore b/rust/hello/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/rust/hello/.gitignore @@ -0,0 +1 @@ +/target diff --git a/rust/hello/Cargo.lock b/rust/hello/Cargo.lock new file mode 100644 index 0000000..c3aedd7 --- /dev/null +++ b/rust/hello/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "hello" +version = "0.1.0" diff --git a/rust/hello/Cargo.toml b/rust/hello/Cargo.toml new file mode 100644 index 0000000..128fbbb --- /dev/null +++ b/rust/hello/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "hello" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs new file mode 100644 index 0000000..ce5bf64 --- /dev/null +++ b/rust/hello/src/main.rs @@ -0,0 +1,14 @@ +mod print; +mod strings; +mod types; +mod vars; + +fn main() { + println!("Hello, world!"); + println!("Foo bar, foo foo!"); + + print::run(); + vars::run(); + types::run(); + strings::run(); +} diff --git a/rust/hello/src/print.rs b/rust/hello/src/print.rs new file mode 100644 index 0000000..9fc294f --- /dev/null +++ b/rust/hello/src/print.rs @@ -0,0 +1,17 @@ +pub fn run() { + let a = format!("blah"); + println!("{}", a); + + let pi = 3.14159; + println!("{:1.3}", pi); + + #[derive(Debug)] + struct MyType(i32); + + // Use debug print {:?} + let b = MyType(4); + println!("{:?}", b); + + println!("{} is from {}", "Mo", "Canada"); + println!("{0:b} {0:x}", 16233); +} diff --git a/rust/hello/src/strings.rs b/rust/hello/src/strings.rs new file mode 100644 index 0000000..5fd9e63 --- /dev/null +++ b/rust/hello/src/strings.rs @@ -0,0 +1,5 @@ +pub fn run() { + let s = String::from("heyoooo!"); + + println!("{}", s); +} diff --git a/rust/hello/src/types.rs b/rust/hello/src/types.rs new file mode 100644 index 0000000..9f4c985 --- /dev/null +++ b/rust/hello/src/types.rs @@ -0,0 +1,10 @@ +pub fn run() { + let i: i64 = 4; + + println!("Max i64: {} i {}", std::i64::MAX, i); + + let is_active = true; + let expr: char = 'x'; + + println!("bool: {}, char: {}", is_active, expr); +} diff --git a/rust/hello/src/vars.rs b/rust/hello/src/vars.rs new file mode 100644 index 0000000..5f768ef --- /dev/null +++ b/rust/hello/src/vars.rs @@ -0,0 +1,13 @@ +pub fn run() { + let mut blah = "foo"; + println!("{}", blah); + blah = "bar"; + println!("{}", blah); + + // Constants should have explicit types + const ID: i32 = 001; + println!("{}", ID); + + let (foo, bar) = ("hi", "bye"); + println!("{} and {}", foo, bar); +} From 3cf5cde5c26f7558a5c56bb438b42c0feb6cfca4 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 6 Sep 2021 16:06:34 -0400 Subject: [PATCH 045/180] Update rust strings. --- rust/hello/src/strings.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rust/hello/src/strings.rs b/rust/hello/src/strings.rs index 5fd9e63..1987fca 100644 --- a/rust/hello/src/strings.rs +++ b/rust/hello/src/strings.rs @@ -1,5 +1,13 @@ pub fn run() { - let s = String::from("heyoooo!"); + let mut s = String::from("heyoooo "); - println!("{}", s); + s.push_str("foo!"); + + println!("{} {}", s, s.len()); + + if s.is_empty() { + println!("empty!") + } else { + println!("not empty!") + } } From a37a5cf31e545ac4cf4cc8eee0944049137868cc Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 6 Sep 2021 16:30:55 -0400 Subject: [PATCH 046/180] Added rust tuples test. --- rust/hello/src/main.rs | 2 ++ rust/hello/src/strings.rs | 4 ++++ rust/hello/src/tuples.rs | 5 +++++ 3 files changed, 11 insertions(+) create mode 100644 rust/hello/src/tuples.rs diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index ce5bf64..fd10d86 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -2,6 +2,7 @@ mod print; mod strings; mod types; mod vars; +mod tuples; fn main() { println!("Hello, world!"); @@ -11,4 +12,5 @@ fn main() { vars::run(); types::run(); strings::run(); + tuples::run(); } diff --git a/rust/hello/src/strings.rs b/rust/hello/src/strings.rs index 1987fca..44f7bd4 100644 --- a/rust/hello/src/strings.rs +++ b/rust/hello/src/strings.rs @@ -10,4 +10,8 @@ pub fn run() { } else { println!("not empty!") } + + // Immutable primitive string type + let imm_s : &str = "boo"; + println!("Immutable: {}", imm_s); } diff --git a/rust/hello/src/tuples.rs b/rust/hello/src/tuples.rs new file mode 100644 index 0000000..c0211c2 --- /dev/null +++ b/rust/hello/src/tuples.rs @@ -0,0 +1,5 @@ +pub fn run() { + let tup: (&str, &str, i32) = ("mo", "by", 42); + + println!("{} {} {}", tup.0, tup.1, tup.2); +} \ No newline at end of file From e91ce9ad7e5208dc526436fcc460df5ac67d7fb2 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 6 Sep 2021 16:32:15 -0400 Subject: [PATCH 047/180] Added README.md. --- rust/hello/README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 rust/hello/README.md diff --git a/rust/hello/README.md b/rust/hello/README.md new file mode 100644 index 0000000..ee1ec0b --- /dev/null +++ b/rust/hello/README.md @@ -0,0 +1,31 @@ +# Rust Experiments + +Install via official management tool. + +$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +$ source $HOME/.cargo/env + +Add "source $HOME/.cargo/env" to end of .zshrc + +## API Docs + +https://doc.rust-lang.org/std/fmt/ + +## New project + +Follow instructions: https://www.rust-lang.org/learn/get-started + +$ cargo new hello-rust +$ cargo run + +You can also: + +$ rustc  main.rs +$ ./main + +Build for production: +$ cargo build --release + +## VSCode + +Install rust extension. Then cmd-shift-p --> restart rust server, will prompt to install if not found From 8cadef74b06ebf1d2f8c3f5dd3751e98fb509563 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 6 Sep 2021 19:22:23 -0400 Subject: [PATCH 048/180] Add arrays, functions, and structs. --- rust/hello/src/arrays.rs | 41 +++++++++++++++++++++++++++++++++++++ rust/hello/src/functions.rs | 17 +++++++++++++++ rust/hello/src/main.rs | 6 ++++++ rust/hello/src/structs.rs | 15 ++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 rust/hello/src/arrays.rs create mode 100644 rust/hello/src/functions.rs create mode 100644 rust/hello/src/structs.rs diff --git a/rust/hello/src/arrays.rs b/rust/hello/src/arrays.rs new file mode 100644 index 0000000..ce7863d --- /dev/null +++ b/rust/hello/src/arrays.rs @@ -0,0 +1,41 @@ +pub fn run() { + let numbers: [i32;5] = [1, 2, 3, 4, 5]; + + let mut n = 0; + while n < numbers.len() { + println!("Number {}", numbers[n]); + n += 1; + } + + println!("Numbers {:?}", numbers); + + let mut vnumbers : Vec = vec![1, 3, 5, 7, 9]; + vnumbers.push(11); + println!("Vector of numbers: {:?}", vnumbers); + + vnumbers.pop(); + println!("Vector of numbers: {:?}", vnumbers); + + for x in vnumbers.iter() { + println!("Got: {}", x) + } + + for x in vnumbers.iter_mut() { + *x *= 2; + } + println!("Post mutation: {:?}", vnumbers); + + println!("Starting loop loop... "); + let mut count = 0; + loop { + count += 1; + println!("{}", count); + if count == 5 { + break; + } + } + + for x in 0..5 { + println!("for {}", x); + } +} \ No newline at end of file diff --git a/rust/hello/src/functions.rs b/rust/hello/src/functions.rs new file mode 100644 index 0000000..d5d1469 --- /dev/null +++ b/rust/hello/src/functions.rs @@ -0,0 +1,17 @@ +fn greet(text: &str, name: &str) { + println!("{}, {}!", text, name); +} + +fn add(a: i32, b: i32) -> i32 { + a + b +} + +pub fn run() { + println!("TEST: functions.rs"); + greet("Hello", "Mo"); + + println!("Sum: {}", add(4,5)); + + let adder = |a: i32, b: i32| a + b; + println!("Adder: {}", adder(4,5)); +} \ No newline at end of file diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index fd10d86..bc3e6b4 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -3,6 +3,9 @@ mod strings; mod types; mod vars; mod tuples; +mod arrays; +mod functions; +mod structs; fn main() { println!("Hello, world!"); @@ -13,4 +16,7 @@ fn main() { types::run(); strings::run(); tuples::run(); + arrays:: run(); + functions::run(); + structs::run(); } diff --git a/rust/hello/src/structs.rs b/rust/hello/src/structs.rs new file mode 100644 index 0000000..1360bb2 --- /dev/null +++ b/rust/hello/src/structs.rs @@ -0,0 +1,15 @@ +struct Color { + r: u8, + g: u8, + b: u8 +} + +pub fn run() { + let c = Color{r: 5, g: 6, b: 7}; + println!("{} {} {}", c.r, c.g, c.b); + + // Tuple Struct + struct OtherColor(u8, u8, u8); + let uc = OtherColor(4, 5, 6); + println!("{} {} {}", uc.0, uc.1, uc.1); +} \ No newline at end of file From 79356eb59cbc9d22e0d39df5e923c853def3f537 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 6 Sep 2021 19:53:33 -0400 Subject: [PATCH 049/180] Add methods to structs. --- rust/hello/src/structs.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/rust/hello/src/structs.rs b/rust/hello/src/structs.rs index 1360bb2..3648deb 100644 --- a/rust/hello/src/structs.rs +++ b/rust/hello/src/structs.rs @@ -4,6 +4,20 @@ struct Color { b: u8 } +impl Color { + fn new(r: u8, g: u8, b: u8) -> Color { + Color{r: r, g: g, b: b} + } + + fn css(&self) -> String { + format!("#{:02x}{:02x}{:02x}", self.r, self.g, self.b) + } + + fn set_r(&mut self, v: u8) { + self.r = v; + } +} + pub fn run() { let c = Color{r: 5, g: 6, b: 7}; println!("{} {} {}", c.r, c.g, c.b); @@ -12,4 +26,10 @@ pub fn run() { struct OtherColor(u8, u8, u8); let uc = OtherColor(4, 5, 6); println!("{} {} {}", uc.0, uc.1, uc.1); + + let mut mycolor = Color::new(25, 68, 230); + println!("{}", mycolor.css()); + + mycolor.set_r(200); + println!("{}", mycolor.css()); } \ No newline at end of file From c61040ed45cd825a9957d694190dcf2de76f08e0 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 6 Sep 2021 20:09:53 -0400 Subject: [PATCH 050/180] Added rust args. --- rust/hello/src/args.rs | 7 +++++++ rust/hello/src/main.rs | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 rust/hello/src/args.rs diff --git a/rust/hello/src/args.rs b/rust/hello/src/args.rs new file mode 100644 index 0000000..54e6430 --- /dev/null +++ b/rust/hello/src/args.rs @@ -0,0 +1,7 @@ +use std::env; + +pub fn run() { + let args: Vec = env::args().collect(); + + println!("Args: {:?}", args); +} \ No newline at end of file diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index bc3e6b4..45b83f5 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -6,6 +6,7 @@ mod tuples; mod arrays; mod functions; mod structs; +mod args; fn main() { println!("Hello, world!"); @@ -19,4 +20,5 @@ fn main() { arrays:: run(); functions::run(); structs::run(); + args::run(); } From d63388a7f32f491f2eb57910f094310f76d463ca Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 9 Sep 2021 21:02:49 -0400 Subject: [PATCH 051/180] Add traits and lifetimes. --- rust/hello/src/args.rs | 15 +++++++++++++ rust/hello/src/lifetimes.rs | 11 ++++++++++ rust/hello/src/main.rs | 4 ++++ rust/hello/src/traits.rs | 42 +++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 rust/hello/src/lifetimes.rs create mode 100644 rust/hello/src/traits.rs diff --git a/rust/hello/src/args.rs b/rust/hello/src/args.rs index 54e6430..8acefdf 100644 --- a/rust/hello/src/args.rs +++ b/rust/hello/src/args.rs @@ -4,4 +4,19 @@ pub fn run() { let args: Vec = env::args().collect(); println!("Args: {:?}", args); + + let target = args[0].clone(); + println!("$0 = {}", target); + + #[derive(Debug, Clone)] + struct MoStruct { + i: i64, + f: f64, + } + + let mo = MoStruct{i: 4, f: 4.4}; + println!("mo {:?}", mo); + + let boo = mo.clone(); + println!("boo {:?}", boo); } \ No newline at end of file diff --git a/rust/hello/src/lifetimes.rs b/rust/hello/src/lifetimes.rs new file mode 100644 index 0000000..1f2f8c8 --- /dev/null +++ b/rust/hello/src/lifetimes.rs @@ -0,0 +1,11 @@ +fn gt<'a>(a: &'a str, b: &'a str) -> &'a str { + if a > b { + a + } else { + b + } +} + +pub fn run() { + println!("gt {}", gt("foo", "bar")) +} \ No newline at end of file diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 45b83f5..83e7f27 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -7,6 +7,8 @@ mod arrays; mod functions; mod structs; mod args; +mod lifetimes; +mod traits; fn main() { println!("Hello, world!"); @@ -21,4 +23,6 @@ fn main() { functions::run(); structs::run(); args::run(); + lifetimes::run(); + traits::run(); } diff --git a/rust/hello/src/traits.rs b/rust/hello/src/traits.rs new file mode 100644 index 0000000..c50dbd5 --- /dev/null +++ b/rust/hello/src/traits.rs @@ -0,0 +1,42 @@ + +struct Color { + r: u8, + g: u8, + b: u8 +} + +// Method syntax +impl Color { + pub fn new() -> Self { + Self {r: 0, g:0, b:0} + } + + fn rgb(&self) -> String { + format!("{} {} {}", self.r, self.g, self.b) + } + + fn set_r(&mut self, r: u8) -> &mut Self { + self.r = r; + self + } + + fn calculate(&self) -> Result { + if self.r > 5 { + Ok(self.r) + } else { + Err("too small") + } + } +} + +pub fn run() { + println!("{}", Color {r: 80, g: 80, b: 80}.rgb()); + + let mut foo = Color::new(); + println!("{}", foo.set_r(200).rgb()); + + match foo.calculate() { + Ok(v) => println!("Ok {}", v), + Err(e) => println!("Err {}", e), + } +} \ No newline at end of file From 4c6246e69b4a3bc27ba04428203482b015e56480 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 9 Sep 2021 21:12:02 -0400 Subject: [PATCH 052/180] Samer trait. --- rust/hello/src/traits.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rust/hello/src/traits.rs b/rust/hello/src/traits.rs index c50dbd5..32295f3 100644 --- a/rust/hello/src/traits.rs +++ b/rust/hello/src/traits.rs @@ -29,6 +29,16 @@ impl Color { } } +trait Samer { + fn same(&self, t: &Self) -> bool; +} + +impl Samer for Color { + fn same(&self, t: &Self) -> bool { + self.r == t.r && self.g == t.g && self.b == t.b + } +} + pub fn run() { println!("{}", Color {r: 80, g: 80, b: 80}.rgb()); @@ -39,4 +49,6 @@ pub fn run() { Ok(v) => println!("Ok {}", v), Err(e) => println!("Err {}", e), } + + println!("same {}", foo.same(&Color::new())) } \ No newline at end of file From 3b8b01ee675f75c7a80854d22a563e8e87a597fe Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 11 Sep 2021 12:01:51 -0400 Subject: [PATCH 053/180] Added rust generics. --- rust/hello/src/generics.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 rust/hello/src/generics.rs diff --git a/rust/hello/src/generics.rs b/rust/hello/src/generics.rs new file mode 100644 index 0000000..04803e1 --- /dev/null +++ b/rust/hello/src/generics.rs @@ -0,0 +1,12 @@ +// You can use "where" to remove the generic type clutter form the +// function signature +fn add(a: T, b: T) -> T +where T: std::ops::Add + std::fmt::Debug +{ + println!("{:?} + {:?}", a, b); + return a + b +} + +pub fn run() { + add(4, 5); +} \ No newline at end of file From 854ea222a6cd4e93ce140c4bd49d3e19c4d331a6 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 07:35:58 -0400 Subject: [PATCH 054/180] Updated generics, lifetimes, and traits. --- rust/hello/src/generics.rs | 2 ++ rust/hello/src/lifetimes.rs | 26 ++++++++++++++++++++++++++ rust/hello/src/main.rs | 2 ++ rust/hello/src/traits.rs | 29 ++++++++++++++++++++++++----- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/rust/hello/src/generics.rs b/rust/hello/src/generics.rs index 04803e1..893d4ea 100644 --- a/rust/hello/src/generics.rs +++ b/rust/hello/src/generics.rs @@ -3,7 +3,9 @@ fn add(a: T, b: T) -> T where T: std::ops::Add + std::fmt::Debug { + // The debug trait lets you do this println!("{:?} + {:?}", a, b); + // The Add trait lets you do this return a + b } diff --git a/rust/hello/src/lifetimes.rs b/rust/hello/src/lifetimes.rs index 1f2f8c8..7568e9d 100644 --- a/rust/hello/src/lifetimes.rs +++ b/rust/hello/src/lifetimes.rs @@ -7,5 +7,31 @@ fn gt<'a>(a: &'a str, b: &'a str) -> &'a str { } pub fn run() { + // Stack allocated int + let a = 5; + + // Copy + let b = a; + + // This is fine + println!("{} {}", a, b); + + // Heap allocated int + let a = Box::new(5); + + // This changes ownership of the int from a to b + let b = a; + + // This won't complile because a is invalid. + // println!("{} {}", a, b); + + // You can clone it instead. (Note b is still the owner, so clone from b) + let c = b.clone(); + + // This is fine + println!("{} {}", b, c); + println!("gt {}", gt("foo", "bar")) + + // b and c are destroyed when they go out of scope } \ No newline at end of file diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 83e7f27..8c7b664 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -9,6 +9,7 @@ mod structs; mod args; mod lifetimes; mod traits; +mod generics; fn main() { println!("Hello, world!"); @@ -25,4 +26,5 @@ fn main() { args::run(); lifetimes::run(); traits::run(); + generics::run(); } diff --git a/rust/hello/src/traits.rs b/rust/hello/src/traits.rs index 32295f3..801d664 100644 --- a/rust/hello/src/traits.rs +++ b/rust/hello/src/traits.rs @@ -1,4 +1,5 @@ +#[derive(Debug)] struct Color { r: u8, g: u8, @@ -29,16 +30,24 @@ impl Color { } } -trait Samer { - fn same(&self, t: &Self) -> bool; +trait Equals { + fn equal(&self, t: &Self) -> bool; } -impl Samer for Color { - fn same(&self, t: &Self) -> bool { +impl Equals for Color { + fn equal(&self, t: &Self) -> bool { self.r == t.r && self.g == t.g && self.b == t.b } } +// Drop is an RAII trait. Run code when Color goes out +// of scope. +impl Drop for Color { + fn drop(&mut self) { + println!("Color drop!"); + } +} + pub fn run() { println!("{}", Color {r: 80, g: 80, b: 80}.rgb()); @@ -50,5 +59,15 @@ pub fn run() { Err(e) => println!("Err {}", e), } - println!("same {}", foo.same(&Color::new())) + // use if let which is simpler + if let Ok(v) = foo.calculate() { + println!("if let Ok: {}", v) + } + + // use unwrap() to return value or panic if Err + println!("v = {}", foo.calculate().unwrap()); + + println!("same {}", foo.equal(&Color::new())); + println!("same {}", Color::new().equal(&Color::new())); + println!("derive Debug {:?}", foo); } \ No newline at end of file From 91b884ac7621b6944e280bb417a7f94f05e5bf5e Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 07:58:28 -0400 Subject: [PATCH 055/180] Added CLI to main, added threads. --- rust/hello/README.md | 25 ++++++++++++++++++--- rust/hello/src/main.rs | 47 +++++++++++++++++++++++++++------------ rust/hello/src/threads.rs | 12 ++++++++++ 3 files changed, 67 insertions(+), 17 deletions(-) create mode 100644 rust/hello/src/threads.rs diff --git a/rust/hello/README.md b/rust/hello/README.md index ee1ec0b..08b5431 100644 --- a/rust/hello/README.md +++ b/rust/hello/README.md @@ -1,31 +1,50 @@ # Rust Experiments +## To run + +``` +cargo run (print|generics|lifetimes|threads|...) +``` + +## Install Rust + Install via official management tool. +``` $ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh $ source $HOME/.cargo/env +``` -Add "source $HOME/.cargo/env" to end of .zshrc +Add `source $HOME/.cargo/env` to end of .zshrc ## API Docs https://doc.rust-lang.org/std/fmt/ +(Use `S` to search.) + ## New project Follow instructions: https://www.rust-lang.org/learn/get-started +``` $ cargo new hello-rust $ cargo run +``` You can also: -$ rustc  main.rs +``` +$ rustc main.rs $ ./main +``` Build for production: + +``` $ cargo build --release +``` ## VSCode -Install rust extension. Then cmd-shift-p --> restart rust server, will prompt to install if not found +Install rust extension. Then cmd-shift-p --> restart rust server, will prompt to install if not found. diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 8c7b664..47efd0f 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -10,21 +10,40 @@ mod args; mod lifetimes; mod traits; mod generics; +mod threads; + +use std::env; + +fn process_cmdline() { + let args: Vec = env::args().collect(); + + if args.len() < 2 { + println!("Usage: {} (print|traits|threads|...)", args[0]); + std::process::exit(-1); + } + + match args[1].as_str() { + "print" => print::run(), + "strings" => strings::run(), + "types" => types::run(), + "vars" => vars::run(), + "tuples" => tuples::run(), + "arrays" => arrays::run(), + "functions" => functions::run(), + "structs" => structs::run(), + "args" => args::run(), + "lifetimes" => lifetimes::run(), + "traits" => traits::run(), + "generics" => generics::run(), + "threads" => threads::run(), + _ => { + println!("Unrecognized module: {}", args[1]); + std::process::exit(-1); + } + } +} fn main() { println!("Hello, world!"); - println!("Foo bar, foo foo!"); - - print::run(); - vars::run(); - types::run(); - strings::run(); - tuples::run(); - arrays:: run(); - functions::run(); - structs::run(); - args::run(); - lifetimes::run(); - traits::run(); - generics::run(); + process_cmdline(); } diff --git a/rust/hello/src/threads.rs b/rust/hello/src/threads.rs new file mode 100644 index 0000000..89dea52 --- /dev/null +++ b/rust/hello/src/threads.rs @@ -0,0 +1,12 @@ +use std::{thread, time}; + +pub fn run() { + let tid = thread::spawn(move || { + for x in 0..10 { + println!("{}", x); + thread::sleep(time::Duration::from_millis(10)); + } + }); + + tid.join().unwrap(); +} \ No newline at end of file From ab61fcefcd5bfc778630d8d2bc9f82874609ca95 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 08:25:40 -0400 Subject: [PATCH 056/180] Use condvar to sync threads. --- rust/hello/README.md | 2 ++ rust/hello/src/threads.rs | 54 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/rust/hello/README.md b/rust/hello/README.md index 08b5431..893264e 100644 --- a/rust/hello/README.md +++ b/rust/hello/README.md @@ -1,5 +1,7 @@ # Rust Experiments +This directory consists of a bunch of random rust code written while learning Rust. + ## To run ``` diff --git a/rust/hello/src/threads.rs b/rust/hello/src/threads.rs index 89dea52..45d511d 100644 --- a/rust/hello/src/threads.rs +++ b/rust/hello/src/threads.rs @@ -1,12 +1,62 @@ use std::{thread, time}; +use std::sync::{Arc, Mutex, Condvar}; pub fn run() { + // Goal: + // . Spawn two threads at the same time + // . Second thread blocks until other thread is done + // . Use mutex and condvar to synchronize the threads + + // This is the mutex and condvar wrapped in a tuple, and then in + // an Atomic Refcounted Pointer (Arc) + let pair = Arc::new((Mutex::new(false), Condvar::new())); + let num_runs = 10; + + // This creates a new ref of the tuple. Since the closure has "move" on + // it, it takes ownership of the ref. + let pair1 = Arc::clone(&pair); + + // Spawn a thread, and specify "move" on the closure, which causes + // it to take ownership of any referred variables. let tid = thread::spawn(move || { - for x in 0..10 { - println!("{}", x); + for x in 0..num_runs { + println!("Thread 1 {}", x); + thread::sleep(time::Duration::from_millis(10)); + } + + // Deref the Arc pointer, then take a ref to the tuple + let (lock, cv) = &*pair1; + + // Get the MutexGuard for the lock + let mut done = lock.lock().unwrap(); + + // Deref because wrapped in MutexGuard + *done = true; + + // Notify that we're done + cv.notify_one(); + }); + + let pair2 = Arc::clone(&pair); + let tid2 = thread::spawn(move || { + // Deref the Arc pointer, then take a ref to the tuple + let (lock, cv) = &*pair2; + + // Get the MutexGuard for the lock + let mut done = lock.lock().unwrap(); + + // Deref, check if we got the signal + while !*done { + // This blocks and returns the MutexGuard if there's a signal + done = cv.wait(done).unwrap(); + } + + for x in 0..num_runs { + println!("Thread 2 {}", x); thread::sleep(time::Duration::from_millis(10)); } }); tid.join().unwrap(); + tid2.join().unwrap(); } \ No newline at end of file From c4d0d3939f84cd67a4474bb60c2d296b1f69233f Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 08:58:09 -0400 Subject: [PATCH 057/180] Added sync:mpsc::channel messaging between threads. --- rust/hello/src/threads.rs | 66 ++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/rust/hello/src/threads.rs b/rust/hello/src/threads.rs index 45d511d..d126bca 100644 --- a/rust/hello/src/threads.rs +++ b/rust/hello/src/threads.rs @@ -1,7 +1,34 @@ +use std::sync::mpsc; +use std::sync::{Arc, Condvar, Mutex}; use std::{thread, time}; -use std::sync::{Arc, Mutex, Condvar}; -pub fn run() { +fn channels() { + let (tx, rx) = mpsc::channel(); + + let tid = thread::spawn(move || { + for i in 0..10 { + println!("Sending {}", i); + tx.send(i).unwrap(); + thread::sleep(time::Duration::from_millis(10)); + } + }); + + thread::spawn(move || loop { + match rx.recv() { + Ok(i) => println!("Received {}", i), + Err(e) => { + // closed channel + println!("Got expected error: {}", e); + break; + } + } + }); + + tid.join().unwrap(); +} + +// Synchronized threads +fn sync_threads() { // Goal: // . Spawn two threads at the same time // . Second thread blocks until other thread is done @@ -12,8 +39,8 @@ pub fn run() { let pair = Arc::new((Mutex::new(false), Condvar::new())); let num_runs = 10; - // This creates a new ref of the tuple. Since the closure has "move" on - // it, it takes ownership of the ref. + // This creates a new ref of the tuple (and increases the refcount). Since the + // closure has "move" on it, the thread below takes ownership of the ref. let pair1 = Arc::clone(&pair); // Spawn a thread, and specify "move" on the closure, which causes @@ -27,7 +54,7 @@ pub fn run() { // Deref the Arc pointer, then take a ref to the tuple let (lock, cv) = &*pair1; - // Get the MutexGuard for the lock + // lock() returns a MutexGuard, which is a scoped (RAII) mutex. let mut done = lock.lock().unwrap(); // Deref because wrapped in MutexGuard @@ -35,20 +62,26 @@ pub fn run() { // Notify that we're done cv.notify_one(); + + // lock released because MutexGuard is scoped. }); let pair2 = Arc::clone(&pair); let tid2 = thread::spawn(move || { - // Deref the Arc pointer, then take a ref to the tuple - let (lock, cv) = &*pair2; + { + // Deref the Arc pointer, then take a ref to the tuple + let (lock, cv) = &*pair2; - // Get the MutexGuard for the lock - let mut done = lock.lock().unwrap(); + // lock() returns a MutexGuard, which is a scoped (RAII) mutex. + let mut done = lock.lock().unwrap(); + + // Deref, check if we got the signal + while !*done { + // This blocks and returns the MutexGuard if there's a signal + done = cv.wait(done).unwrap(); + } - // Deref, check if we got the signal - while !*done { - // This blocks and returns the MutexGuard if there's a signal - done = cv.wait(done).unwrap(); + // lock released at close of scope } for x in 0..num_runs { @@ -59,4 +92,9 @@ pub fn run() { tid.join().unwrap(); tid2.join().unwrap(); -} \ No newline at end of file +} + +pub fn run() { + channels(); + sync_threads(); +} From b260e582f240b1fb21f52b946c83d22dc4bf1e63 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 08:59:42 -0400 Subject: [PATCH 058/180] Join both channel threads. --- rust/hello/src/threads.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rust/hello/src/threads.rs b/rust/hello/src/threads.rs index d126bca..c4114e5 100644 --- a/rust/hello/src/threads.rs +++ b/rust/hello/src/threads.rs @@ -13,7 +13,7 @@ fn channels() { } }); - thread::spawn(move || loop { + let tid2 = thread::spawn(move || loop { match rx.recv() { Ok(i) => println!("Received {}", i), Err(e) => { @@ -25,6 +25,7 @@ fn channels() { }); tid.join().unwrap(); + tid2.join().unwrap(); } // Synchronized threads From 2bbba4069c2951b6c6939430ee8d798661b5c36e Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 16:09:42 -0400 Subject: [PATCH 059/180] First implementation of stack. --- rust/hello/src/arrays.rs | 13 ++++++++++--- rust/hello/src/main.rs | 20 +++++++++++--------- rust/hello/src/threads.rs | 9 ++++++++- rust/hello/src/traits.rs | 17 ++++++++++++----- rust/stack/Cargo.lock | 7 +++++++ rust/stack/Cargo.toml | 8 ++++++++ rust/stack/src/main.rs | 8 ++++++++ rust/stack/src/stack.rs | 17 +++++++++++++++++ 8 files changed, 81 insertions(+), 18 deletions(-) create mode 100644 rust/stack/Cargo.lock create mode 100644 rust/stack/Cargo.toml create mode 100644 rust/stack/src/main.rs create mode 100644 rust/stack/src/stack.rs diff --git a/rust/hello/src/arrays.rs b/rust/hello/src/arrays.rs index ce7863d..ab2c68a 100644 --- a/rust/hello/src/arrays.rs +++ b/rust/hello/src/arrays.rs @@ -1,5 +1,8 @@ pub fn run() { - let numbers: [i32;5] = [1, 2, 3, 4, 5]; + // Create some arrays and vectors and iterate using different kinds of loops. + + // Arrays are fixed-size. You can't add or remove elements. + let numbers: [i32; 5] = [1, 2, 3, 4, 5]; let mut n = 0; while n < numbers.len() { @@ -9,13 +12,15 @@ pub fn run() { println!("Numbers {:?}", numbers); - let mut vnumbers : Vec = vec![1, 3, 5, 7, 9]; + // Vectors can be dynamically appended to, resized, etc. + let mut vnumbers: Vec = vec![1, 3, 5, 7, 9]; vnumbers.push(11); println!("Vector of numbers: {:?}", vnumbers); vnumbers.pop(); println!("Vector of numbers: {:?}", vnumbers); + // You can iterate with iter() and iter_mut() for x in vnumbers.iter() { println!("Got: {}", x) } @@ -25,6 +30,7 @@ pub fn run() { } println!("Post mutation: {:?}", vnumbers); + // You can iterate with loop println!("Starting loop loop... "); let mut count = 0; loop { @@ -35,7 +41,8 @@ pub fn run() { } } + // You can terate with "for in" for x in 0..5 { println!("for {}", x); } -} \ No newline at end of file +} diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 47efd0f..f094150 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -1,20 +1,22 @@ -mod print; -mod strings; -mod types; -mod vars; -mod tuples; +mod args; mod arrays; mod functions; -mod structs; -mod args; -mod lifetimes; -mod traits; mod generics; +mod lifetimes; +mod print; +mod strings; +mod structs; mod threads; +mod traits; +mod tuples; +mod types; +mod vars; use std::env; fn process_cmdline() { + // env::args() returns an iterator. collect() pulls the elements + // into a vector. let args: Vec = env::args().collect(); if args.len() < 2 { diff --git a/rust/hello/src/threads.rs b/rust/hello/src/threads.rs index c4114e5..4817ce5 100644 --- a/rust/hello/src/threads.rs +++ b/rust/hello/src/threads.rs @@ -2,9 +2,12 @@ use std::sync::mpsc; use std::sync::{Arc, Condvar, Mutex}; use std::{thread, time}; +// Synchronized threads with channels. fn channels() { + // Multi sender, single receiver channel. let (tx, rx) = mpsc::channel(); + // Sender thread let tid = thread::spawn(move || { for i in 0..10 { println!("Sending {}", i); @@ -13,7 +16,10 @@ fn channels() { } }); + // Receiver thread let tid2 = thread::spawn(move || loop { + // This call blocks until there's a message or an error + // such as a closed channel. match rx.recv() { Ok(i) => println!("Received {}", i), Err(e) => { @@ -24,11 +30,12 @@ fn channels() { } }); + // Wait for both threads to finish. tid.join().unwrap(); tid2.join().unwrap(); } -// Synchronized threads +// Synchronized threads with mutexes and condvars. fn sync_threads() { // Goal: // . Spawn two threads at the same time diff --git a/rust/hello/src/traits.rs b/rust/hello/src/traits.rs index 801d664..a94491f 100644 --- a/rust/hello/src/traits.rs +++ b/rust/hello/src/traits.rs @@ -1,15 +1,14 @@ - #[derive(Debug)] struct Color { r: u8, g: u8, - b: u8 + b: u8, } // Method syntax impl Color { pub fn new() -> Self { - Self {r: 0, g:0, b:0} + Self { r: 0, g: 0, b: 0 } } fn rgb(&self) -> String { @@ -49,7 +48,15 @@ impl Drop for Color { } pub fn run() { - println!("{}", Color {r: 80, g: 80, b: 80}.rgb()); + println!( + "{}", + Color { + r: 80, + g: 80, + b: 80 + } + .rgb() + ); let mut foo = Color::new(); println!("{}", foo.set_r(200).rgb()); @@ -70,4 +77,4 @@ pub fn run() { println!("same {}", foo.equal(&Color::new())); println!("same {}", Color::new().equal(&Color::new())); println!("derive Debug {:?}", foo); -} \ No newline at end of file +} diff --git a/rust/stack/Cargo.lock b/rust/stack/Cargo.lock new file mode 100644 index 0000000..fcd2ae8 --- /dev/null +++ b/rust/stack/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "stack" +version = "0.1.0" diff --git a/rust/stack/Cargo.toml b/rust/stack/Cargo.toml new file mode 100644 index 0000000..dbbf638 --- /dev/null +++ b/rust/stack/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "stack" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/stack/src/main.rs b/rust/stack/src/main.rs new file mode 100644 index 0000000..694d502 --- /dev/null +++ b/rust/stack/src/main.rs @@ -0,0 +1,8 @@ +mod stack; + +fn main() { + println!("Hello, world!"); + + let mut s = stack::MoStack::new(); + s.push(String::from("boo")); +} diff --git a/rust/stack/src/stack.rs b/rust/stack/src/stack.rs new file mode 100644 index 0000000..e006575 --- /dev/null +++ b/rust/stack/src/stack.rs @@ -0,0 +1,17 @@ +pub struct MoStack { + items: Vec, + pos: u32, +} + +impl MoStack { + pub fn new() -> MoStack { + MoStack { + items: vec![], + pos: 0, + } + } + + pub fn push(&mut self, item: T) { + self.items.push(item) + } +} From 072a7d68cfb367a89a8fb32de42b717b272a6706 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 16:12:11 -0400 Subject: [PATCH 060/180] Add pop to stack. --- rust/stack/src/main.rs | 4 ++++ rust/stack/src/stack.rs | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/rust/stack/src/main.rs b/rust/stack/src/main.rs index 694d502..1300f5a 100644 --- a/rust/stack/src/main.rs +++ b/rust/stack/src/main.rs @@ -5,4 +5,8 @@ fn main() { let mut s = stack::MoStack::new(); s.push(String::from("boo")); + s.push(String::from("foo")); + + println!("pop {}", s.pop().unwrap()); + println!("pop {}", s.pop().unwrap()); } diff --git a/rust/stack/src/stack.rs b/rust/stack/src/stack.rs index e006575..0319be6 100644 --- a/rust/stack/src/stack.rs +++ b/rust/stack/src/stack.rs @@ -12,6 +12,11 @@ impl MoStack { } pub fn push(&mut self, item: T) { - self.items.push(item) + self.items.push(item); + self.pos += 1 + } + + pub fn pop(&mut self) -> Option { + self.items.pop() } } From c113da21d425ba7bc8c9fccf907b4bbd62c2103d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 17:25:02 -0400 Subject: [PATCH 061/180] Types for BTree. --- rust/btree/Cargo.toml | 8 ++++++++ rust/btree/src/btree.rs | 29 +++++++++++++++++++++++++++++ rust/btree/src/main.rs | 9 +++++++++ rust/stack/src/main.rs | 1 + 4 files changed, 47 insertions(+) create mode 100644 rust/btree/Cargo.toml create mode 100644 rust/btree/src/btree.rs create mode 100644 rust/btree/src/main.rs diff --git a/rust/btree/Cargo.toml b/rust/btree/Cargo.toml new file mode 100644 index 0000000..14c0470 --- /dev/null +++ b/rust/btree/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "btree" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs new file mode 100644 index 0000000..20691cb --- /dev/null +++ b/rust/btree/src/btree.rs @@ -0,0 +1,29 @@ +#[derive(Debug)] +pub struct Node +where + T: Ord, +{ + left: Option>>, + right: Option>>, + val: Option, +} + +#[derive(Debug)] +pub struct BTree +where + T: Ord, +{ + root: Node, +} + +impl BTree { + pub fn new() -> BTree { + BTree { + root: Node { + left: None, + right: None, + val: None, + }, + } + } +} diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs new file mode 100644 index 0000000..780695d --- /dev/null +++ b/rust/btree/src/main.rs @@ -0,0 +1,9 @@ +mod btree; + +fn main() { + println!("Hello, world!"); + + let tree: btree::BTree = btree::BTree::new(); + + println!("btree {:?}", tree); +} diff --git a/rust/stack/src/main.rs b/rust/stack/src/main.rs index 1300f5a..5cafa82 100644 --- a/rust/stack/src/main.rs +++ b/rust/stack/src/main.rs @@ -9,4 +9,5 @@ fn main() { println!("pop {}", s.pop().unwrap()); println!("pop {}", s.pop().unwrap()); + println!("pop {}", s.pop().unwrap()); } From 3b3822fbadebd486236479993b41e534e2655950 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Sep 2021 18:01:46 -0400 Subject: [PATCH 062/180] Add btree iterator type. --- rust/btree/src/btree.rs | 49 +++++++++++++++++++++++++++++++++-------- rust/btree/src/main.rs | 2 +- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 20691cb..a8e4b1a 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -1,29 +1,60 @@ +#[derive(Debug, PartialEq)] +enum NodeType { + ROOT, + LEFT, + RIGHT, +} + #[derive(Debug)] -pub struct Node -where - T: Ord, -{ +pub struct Node { + pos: NodeType, left: Option>>, right: Option>>, + parent: Option>>, val: Option, } #[derive(Debug)] -pub struct BTree -where - T: Ord, -{ +pub struct BTree { root: Node, } -impl BTree { +#[derive(Debug)] +pub struct BTreeIter<'a, T: Ord + Copy> { + btree: &'a BTree, + cur: &'a Node, +} + +impl BTree { pub fn new() -> BTree { BTree { root: Node { + pos: NodeType::ROOT, left: None, right: None, + parent: None, val: None, }, } } + + pub fn iter(&self) -> BTreeIter { + BTreeIter { + btree: self, + cur: &self.root, + } + } +} + +impl Iterator for BTreeIter<'_, T> { + // Need this because it's in the fn signature of the trait + type Item = T; + + fn next(&mut self) -> Option { + if self.cur.pos == NodeType::ROOT { + None + } else { + Some(self.cur.val.unwrap()) + } + } } diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index 780695d..539b71e 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -3,7 +3,7 @@ mod btree; fn main() { println!("Hello, world!"); - let tree: btree::BTree = btree::BTree::new(); + let tree: btree::BTree<&str> = btree::BTree::new(); println!("btree {:?}", tree); } From c3675a676ba370bbe28eff40f633535a5573e1a7 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 14 Sep 2021 20:26:12 -0400 Subject: [PATCH 063/180] Working BTree push. --- rust/btree/Cargo.lock | 7 +++ rust/btree/src/btree.rs | 103 ++++++++++++++++++++++++++++++++-------- rust/btree/src/main.rs | 8 +++- 3 files changed, 97 insertions(+), 21 deletions(-) create mode 100644 rust/btree/Cargo.lock diff --git a/rust/btree/Cargo.lock b/rust/btree/Cargo.lock new file mode 100644 index 0000000..d902562 --- /dev/null +++ b/rust/btree/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "btree" +version = "0.1.0" diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index a8e4b1a..25317b8 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -1,53 +1,115 @@ -#[derive(Debug, PartialEq)] +use std::{ + borrow::{Borrow, BorrowMut}, + cell::RefCell, + rc::Rc, +}; + +// We need the Debug trait so we can use println! on it, and +// the PartialEq trait so we can compare the enums. +#[derive(Debug, PartialEq, Clone, Copy)] enum NodeType { ROOT, LEFT, RIGHT, } -#[derive(Debug)] -pub struct Node { +type Item = Rc>>; + +// Down here we add the Ord trait because we want to be able to +// compare the elements during insertion / search. And the Copy trait +// allows you to return a copy of the elements, which encourages you +// to attach primitive types or references. +#[derive(Debug, Clone)] +pub struct Node { pos: NodeType, - left: Option>>, - right: Option>>, - parent: Option>>, + left: Option>, + right: Option>, + parent: Option>, val: Option, } +impl Node { + fn new() -> Item { + Rc::new(RefCell::new(Node { + pos: NodeType::ROOT, + left: None, + right: None, + parent: None, + val: None, + })) + } +} + #[derive(Debug)] pub struct BTree { - root: Node, + root: Item, } #[derive(Debug)] pub struct BTreeIter<'a, T: Ord + Copy> { btree: &'a BTree, - cur: &'a Node, + cur: Item, } -impl BTree { +impl BTree { pub fn new() -> BTree { - BTree { - root: Node { - pos: NodeType::ROOT, - left: None, - right: None, - parent: None, - val: None, - }, + BTree { root: Node::new() } + } + + pub fn push(&mut self, item: T) { + let mut cur = Rc::clone(&self.root); + + loop { + let mut next = Rc::clone(&cur); + let some_val = (*cur).borrow().val; + + if let Some(val) = some_val { + if item <= val { + if let Some(left) = &(*cur).borrow().left { + // If there's already a left node, then move cur to it + next = Rc::clone(left); + } else { + // Otherwise, create a new node, and move to it + let node = Node::new(); + (*node).borrow_mut().parent = Some(Rc::clone(&cur)); + (*cur).borrow_mut().left = Some(Rc::clone(&node)); + next = Rc::clone(&node); + } + } else { + let some = (*cur).borrow(); + if let Some(right) = &some.right { + // If there's already a right node, then move cur to it + next = Rc::clone(right); + } else { + drop(some); + // Otherwise, create a new node, and move to it + let node = Node::new(); + (*node).borrow_mut().parent = Some(Rc::clone(&cur)); + (*cur).borrow_mut().right = Some(Rc::clone(&node)); + next = Rc::clone(&node); + } + } + } else { + drop(some_val); + (*next).borrow_mut().val = Some(item); + break; + } + + cur = Rc::clone(&next); } } pub fn iter(&self) -> BTreeIter { BTreeIter { btree: self, - cur: &self.root, + cur: Rc::clone(&self.root), } } } -impl Iterator for BTreeIter<'_, T> { - // Need this because it's in the fn signature of the trait +/* +impl Iterator for BTreeIter<'_, T> { + // Need this alias because it's in the fn signature of the trait type Item = T; fn next(&mut self) -> Option { @@ -58,3 +120,4 @@ impl Iterator for BTreeIter<'_, T> { } } } +*/ diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index 539b71e..fd0b00e 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -4,6 +4,12 @@ fn main() { println!("Hello, world!"); let tree: btree::BTree<&str> = btree::BTree::new(); - println!("btree {:?}", tree); + + let mut tree2: btree::BTree<&String> = btree::BTree::new(); + let s = String::from("hello"); + let s2 = String::from("world"); + tree2.push(&s); + tree2.push(&s2); + // println!("btree2 {:?}", tree2); } From 418d36140bca714b27fea5f0902babbc19399b05 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 14 Sep 2021 20:58:47 -0400 Subject: [PATCH 064/180] Working BFS iterator for BTree. --- rust/btree/src/btree.rs | 38 ++++++++++++++++++++++++++------------ rust/btree/src/main.rs | 4 ++++ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 25317b8..62a54f1 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -45,12 +45,6 @@ pub struct BTree { root: Item, } -#[derive(Debug)] -pub struct BTreeIter<'a, T: Ord + Copy> { - btree: &'a BTree, - cur: Item, -} - impl BTree { pub fn new() -> BTree { BTree { root: Node::new() } @@ -90,7 +84,6 @@ impl BTree { } } } else { - drop(some_val); (*next).borrow_mut().val = Some(item); break; } @@ -102,22 +95,43 @@ impl BTree { pub fn iter(&self) -> BTreeIter { BTreeIter { btree: self, + q: vec![Rc::clone(&self.root)], cur: Rc::clone(&self.root), } } } -/* +#[derive(Debug)] +pub struct BTreeIter<'a, T: Ord + Copy> { + btree: &'a BTree, + q: Vec>, + cur: Item, +} + impl Iterator for BTreeIter<'_, T> { // Need this alias because it's in the fn signature of the trait type Item = T; fn next(&mut self) -> Option { - if self.cur.pos == NodeType::ROOT { - None + if self.q.len() == 0 { + return None; + } + + let item = self.q.remove(0); + let node = (*item).borrow(); + + if let Some(left) = &node.left { + self.q.push(Rc::clone(&left)); + } + + if let Some(right) = &node.right { + self.q.push(Rc::clone(&right)); + } + + if let Some(val) = &node.val { + Some(*val) } else { - Some(self.cur.val.unwrap()) + self.next() } } } -*/ diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index fd0b00e..e3c3b50 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -12,4 +12,8 @@ fn main() { tree2.push(&s); tree2.push(&s2); // println!("btree2 {:?}", tree2); + + for i in tree2.iter() { + println!("{}", i); + } } From 24dd6b9a8211cdaae517ecc8e0d6a21505977978 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 14 Sep 2021 21:09:01 -0400 Subject: [PATCH 065/180] Fix BFS bugs and remove compiler warnings. --- rust/btree/src/btree.rs | 46 +++++++++++++++++------------------------ rust/btree/src/main.rs | 4 +++- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 62a54f1..4bc4a61 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -1,37 +1,24 @@ -use std::{ - borrow::{Borrow, BorrowMut}, - cell::RefCell, - rc::Rc, -}; - -// We need the Debug trait so we can use println! on it, and -// the PartialEq trait so we can compare the enums. -#[derive(Debug, PartialEq, Clone, Copy)] -enum NodeType { - ROOT, - LEFT, - RIGHT, -} +use std::{cell::RefCell, rc::Rc}; -type Item = Rc>>; +// Our nodes are refcounted refcells. Ref-counted because they +// have multiple owners, and refcells because the borrow checker is mean. +type Item = Rc>>; // Down here we add the Ord trait because we want to be able to // compare the elements during insertion / search. And the Copy trait // allows you to return a copy of the elements, which encourages you // to attach primitive types or references. -#[derive(Debug, Clone)] -pub struct Node { - pos: NodeType, +#[derive(Debug)] +pub struct Node { left: Option>, right: Option>, parent: Option>, val: Option, } -impl Node { +impl Node { fn new() -> Item { Rc::new(RefCell::new(Node { - pos: NodeType::ROOT, left: None, right: None, parent: None, @@ -45,7 +32,7 @@ pub struct BTree { root: Item, } -impl BTree { +impl BTree { pub fn new() -> BTree { BTree { root: Node::new() } } @@ -58,11 +45,14 @@ impl BTree { let some_val = (*cur).borrow().val; if let Some(val) = some_val { + let some = (*cur).borrow(); if item <= val { - if let Some(left) = &(*cur).borrow().left { + if let Some(left) = &some.left { // If there's already a left node, then move cur to it next = Rc::clone(left); } else { + // Unborrow so we can borrow_mut below. + drop(some); // Otherwise, create a new node, and move to it let node = Node::new(); (*node).borrow_mut().parent = Some(Rc::clone(&cur)); @@ -70,11 +60,11 @@ impl BTree { next = Rc::clone(&node); } } else { - let some = (*cur).borrow(); if let Some(right) = &some.right { // If there's already a right node, then move cur to it next = Rc::clone(right); } else { + // Unborrow so we can borrow_mut below. drop(some); // Otherwise, create a new node, and move to it let node = Node::new(); @@ -92,8 +82,9 @@ impl BTree { } } - pub fn iter(&self) -> BTreeIter { - BTreeIter { + // Return a breadth-first search iterator. + pub fn bfs_iter(&self) -> BTreeBFSIter { + BTreeBFSIter { btree: self, q: vec![Rc::clone(&self.root)], cur: Rc::clone(&self.root), @@ -101,14 +92,15 @@ impl BTree { } } +// This is a breadth-first search iterator. #[derive(Debug)] -pub struct BTreeIter<'a, T: Ord + Copy> { +pub struct BTreeBFSIter<'a, T: Ord + Copy> { btree: &'a BTree, q: Vec>, cur: Item, } -impl Iterator for BTreeIter<'_, T> { +impl Iterator for BTreeBFSIter<'_, T> { // Need this alias because it's in the fn signature of the trait type Item = T; diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index e3c3b50..e2a3c1a 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -9,11 +9,13 @@ fn main() { let mut tree2: btree::BTree<&String> = btree::BTree::new(); let s = String::from("hello"); let s2 = String::from("world"); + let s3 = String::from("!"); tree2.push(&s); tree2.push(&s2); + tree2.push(&s3); // println!("btree2 {:?}", tree2); - for i in tree2.iter() { + for i in tree2.bfs_iter() { println!("{}", i); } } From 8443fab494ea1688e084795fbfaf1d145fc6af4a Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 14 Sep 2021 21:13:30 -0400 Subject: [PATCH 066/180] Use &str instead of string in btree test. --- rust/btree/src/btree.rs | 3 ++- rust/btree/src/main.rs | 18 +++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 4bc4a61..6907a80 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -37,7 +37,8 @@ impl BTree { BTree { root: Node::new() } } - pub fn push(&mut self, item: T) { + // Insert a node into the binary tree. + pub fn insert(&mut self, item: T) { let mut cur = Rc::clone(&self.root); loop { diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index e2a3c1a..ecf6d91 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -3,19 +3,15 @@ mod btree; fn main() { println!("Hello, world!"); - let tree: btree::BTree<&str> = btree::BTree::new(); + let tree: btree::BTree<&String> = btree::BTree::new(); println!("btree {:?}", tree); - let mut tree2: btree::BTree<&String> = btree::BTree::new(); - let s = String::from("hello"); - let s2 = String::from("world"); - let s3 = String::from("!"); - tree2.push(&s); - tree2.push(&s2); - tree2.push(&s3); - // println!("btree2 {:?}", tree2); + let mut tree2: btree::BTree<&str> = btree::BTree::new(); + tree2.insert("hello"); + tree2.insert("world"); + tree2.insert("!"); - for i in tree2.bfs_iter() { - println!("{}", i); + for s in tree2.bfs_iter() { + println!("Node: {}", s); } } From d4b855c05d0fd3caf20809834215b28dcf7d4315 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 14 Sep 2021 21:50:13 -0400 Subject: [PATCH 067/180] Rename variables for clarity. --- rust/btree/src/btree.rs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 6907a80..dd2b277 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -46,32 +46,28 @@ impl BTree { let some_val = (*cur).borrow().val; if let Some(val) = some_val { - let some = (*cur).borrow(); + let mut node = (*cur).borrow_mut(); if item <= val { - if let Some(left) = &some.left { + if let Some(left) = &node.left { // If there's already a left node, then move cur to it next = Rc::clone(left); } else { - // Unborrow so we can borrow_mut below. - drop(some); // Otherwise, create a new node, and move to it - let node = Node::new(); - (*node).borrow_mut().parent = Some(Rc::clone(&cur)); - (*cur).borrow_mut().left = Some(Rc::clone(&node)); - next = Rc::clone(&node); + let new_node = Node::new(); + (*new_node).borrow_mut().parent = Some(Rc::clone(&cur)); + node.left = Some(Rc::clone(&new_node)); + next = Rc::clone(&new_node); } } else { - if let Some(right) = &some.right { + if let Some(right) = &node.right { // If there's already a right node, then move cur to it next = Rc::clone(right); } else { - // Unborrow so we can borrow_mut below. - drop(some); // Otherwise, create a new node, and move to it - let node = Node::new(); - (*node).borrow_mut().parent = Some(Rc::clone(&cur)); - (*cur).borrow_mut().right = Some(Rc::clone(&node)); - next = Rc::clone(&node); + let new_node = Node::new(); + (*new_node).borrow_mut().parent = Some(Rc::clone(&cur)); + node.right = Some(Rc::clone(&new_node)); + next = Rc::clone(&new_node); } } } else { From 2da8868f68a1761a8343a5b0b66f6e58dd141371 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 16 Sep 2021 19:44:56 -0400 Subject: [PATCH 068/180] Add DFS search on btree. --- rust/btree/src/btree.rs | 51 +++++++++++++++++++++++++++++++++++++---- rust/btree/src/main.rs | 12 ++++++++-- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index dd2b277..b62c873 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -80,24 +80,33 @@ impl BTree { } // Return a breadth-first search iterator. - pub fn bfs_iter(&self) -> BTreeBFSIter { - BTreeBFSIter { + pub fn bfs_iter(&self) -> BFSIter { + BFSIter { btree: self, q: vec![Rc::clone(&self.root)], cur: Rc::clone(&self.root), } } + + // Return a depth-first search iterator. + pub fn dfs_iter(&self) -> DFSIter { + DFSIter { + btree: self, + stack: vec![Rc::clone(&self.root)], + cur: Rc::clone(&self.root), + } + } } // This is a breadth-first search iterator. #[derive(Debug)] -pub struct BTreeBFSIter<'a, T: Ord + Copy> { +pub struct BFSIter<'a, T: Ord + Copy> { btree: &'a BTree, q: Vec>, cur: Item, } -impl Iterator for BTreeBFSIter<'_, T> { +impl Iterator for BFSIter<'_, T> { // Need this alias because it's in the fn signature of the trait type Item = T; @@ -124,3 +133,37 @@ impl Iterator for BTreeBFSIter<'_, T> { } } } + +#[derive(Debug)] +pub struct DFSIter<'a, T: Ord + Copy> { + btree: &'a BTree, + stack: Vec>, + cur: Item, +} + +impl Iterator for DFSIter<'_, T> { + // Need this alias because it's in the fn signature of the trait + type Item = T; + + fn next(&mut self) -> Option { + if let Some(item) = self.stack.pop() { + let node = (*item).borrow(); + + if let Some(left) = &node.left { + self.stack.push(Rc::clone(&left)); + } + + if let Some(right) = &node.right { + self.stack.push(Rc::clone(&right)); + } + + if let Some(val) = &node.val { + Some(*val) + } else { + self.next() + } + } else { + return None; + } + } +} diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index ecf6d91..e138ae6 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -8,10 +8,18 @@ fn main() { let mut tree2: btree::BTree<&str> = btree::BTree::new(); tree2.insert("hello"); - tree2.insert("world"); tree2.insert("!"); + tree2.insert("2"); + tree2.insert("1"); + tree2.insert("boo"); + tree2.insert("foo"); + tree2.insert("world"); for s in tree2.bfs_iter() { - println!("Node: {}", s); + println!("BFS: {}", s); + } + + for s in tree2.dfs_iter() { + println!("DFS: {}", s); } } From 6806d13930a29777c41d6749a0479bc89efeef90 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 16 Sep 2021 20:28:46 -0400 Subject: [PATCH 069/180] Removed Node::new. --- rust/btree/src/btree.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index b62c873..d2db750 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -16,17 +16,6 @@ pub struct Node { val: Option, } -impl Node { - fn new() -> Item { - Rc::new(RefCell::new(Node { - left: None, - right: None, - parent: None, - val: None, - })) - } -} - #[derive(Debug)] pub struct BTree { root: Item, @@ -34,7 +23,18 @@ pub struct BTree { impl BTree { pub fn new() -> BTree { - BTree { root: Node::new() } + BTree { + root: BTree::new_noderef(), + } + } + + fn new_noderef() -> Item { + Rc::new(RefCell::new(Node { + left: None, + right: None, + parent: None, + val: None, + })) } // Insert a node into the binary tree. @@ -53,7 +53,7 @@ impl BTree { next = Rc::clone(left); } else { // Otherwise, create a new node, and move to it - let new_node = Node::new(); + let new_node = BTree::new_noderef(); (*new_node).borrow_mut().parent = Some(Rc::clone(&cur)); node.left = Some(Rc::clone(&new_node)); next = Rc::clone(&new_node); @@ -64,7 +64,7 @@ impl BTree { next = Rc::clone(right); } else { // Otherwise, create a new node, and move to it - let new_node = Node::new(); + let new_node = BTree::new_noderef(); (*new_node).borrow_mut().parent = Some(Rc::clone(&cur)); node.right = Some(Rc::clone(&new_node)); next = Rc::clone(&new_node); From 9ae09a60b8a8a1860c5e00e7f6e616f06c461cb2 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 17 Sep 2021 18:04:00 -0400 Subject: [PATCH 070/180] Use ? operator for DFS. --- rust/btree/src/btree.rs | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index d2db750..6109e8b 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -146,24 +146,21 @@ impl Iterator for DFSIter<'_, T> { type Item = T; fn next(&mut self) -> Option { - if let Some(item) = self.stack.pop() { - let node = (*item).borrow(); + let item = self.stack.pop()?; + let node = (*item).borrow(); - if let Some(left) = &node.left { - self.stack.push(Rc::clone(&left)); - } + if let Some(left) = &node.left { + self.stack.push(Rc::clone(&left)); + } - if let Some(right) = &node.right { - self.stack.push(Rc::clone(&right)); - } + if let Some(right) = &node.right { + self.stack.push(Rc::clone(&right)); + } - if let Some(val) = &node.val { - Some(*val) - } else { - self.next() - } + if let Some(val) = &node.val { + return Some(*val); } else { - return None; + return self.next(); } } } From 296885f1acfff6272e54efc8c9f101ef3d3b7b9c Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 07:32:04 -0400 Subject: [PATCH 071/180] Switch parent pointers to Rc::Weak. --- rust/btree/src/btree.rs | 24 ++++++++++++++---------- rust/btree/src/main.rs | 2 ++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 6109e8b..2f9191f 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -1,23 +1,27 @@ -use std::{cell::RefCell, rc::Rc}; +use std::{ + cell::RefCell, + rc::{Rc, Weak}, +}; // Our nodes are refcounted refcells. Ref-counted because they // have multiple owners, and refcells because the borrow checker is mean. type Item = Rc>>; +type WeakItem = Weak>>; // Down here we add the Ord trait because we want to be able to // compare the elements during insertion / search. And the Copy trait // allows you to return a copy of the elements, which encourages you // to attach primitive types or references. #[derive(Debug)] -pub struct Node { +pub struct Node { left: Option>, right: Option>, - parent: Option>, + parent: Option>, val: Option, } #[derive(Debug)] -pub struct BTree { +pub struct BTree { root: Item, } @@ -54,7 +58,7 @@ impl BTree { } else { // Otherwise, create a new node, and move to it let new_node = BTree::new_noderef(); - (*new_node).borrow_mut().parent = Some(Rc::clone(&cur)); + (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); node.left = Some(Rc::clone(&new_node)); next = Rc::clone(&new_node); } @@ -65,7 +69,7 @@ impl BTree { } else { // Otherwise, create a new node, and move to it let new_node = BTree::new_noderef(); - (*new_node).borrow_mut().parent = Some(Rc::clone(&cur)); + (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); node.right = Some(Rc::clone(&new_node)); next = Rc::clone(&new_node); } @@ -100,13 +104,13 @@ impl BTree { // This is a breadth-first search iterator. #[derive(Debug)] -pub struct BFSIter<'a, T: Ord + Copy> { +pub struct BFSIter<'a, T> { btree: &'a BTree, q: Vec>, cur: Item, } -impl Iterator for BFSIter<'_, T> { +impl Iterator for BFSIter<'_, T> { // Need this alias because it's in the fn signature of the trait type Item = T; @@ -135,13 +139,13 @@ impl Iterator for BFSIter<'_, T> { } #[derive(Debug)] -pub struct DFSIter<'a, T: Ord + Copy> { +pub struct DFSIter<'a, T> { btree: &'a BTree, stack: Vec>, cur: Item, } -impl Iterator for DFSIter<'_, T> { +impl Iterator for DFSIter<'_, T> { // Need this alias because it's in the fn signature of the trait type Item = T; diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index e138ae6..b57a3b3 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -15,6 +15,8 @@ fn main() { tree2.insert("foo"); tree2.insert("world"); + println!("\nbtree2 {:?}", tree2); + for s in tree2.bfs_iter() { println!("BFS: {}", s); } From b8155f7a6d66cf67e2b260a7e79fa08abc029229 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 08:22:35 -0400 Subject: [PATCH 072/180] Implement IntoIterator for BTree. --- rust/btree/src/btree.rs | 22 ++++++++++++++-------- rust/btree/src/main.rs | 7 +++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 2f9191f..ed03aca 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -86,7 +86,6 @@ impl BTree { // Return a breadth-first search iterator. pub fn bfs_iter(&self) -> BFSIter { BFSIter { - btree: self, q: vec![Rc::clone(&self.root)], cur: Rc::clone(&self.root), } @@ -95,22 +94,30 @@ impl BTree { // Return a depth-first search iterator. pub fn dfs_iter(&self) -> DFSIter { DFSIter { - btree: self, stack: vec![Rc::clone(&self.root)], cur: Rc::clone(&self.root), } } } +// Default to BFS Iterator +impl IntoIterator for &BTree { + type Item = T; + type IntoIter = BFSIter; + + fn into_iter(self) -> Self::IntoIter { + self.bfs_iter() + } +} + // This is a breadth-first search iterator. #[derive(Debug)] -pub struct BFSIter<'a, T> { - btree: &'a BTree, +pub struct BFSIter { q: Vec>, cur: Item, } -impl Iterator for BFSIter<'_, T> { +impl Iterator for BFSIter { // Need this alias because it's in the fn signature of the trait type Item = T; @@ -139,13 +146,12 @@ impl Iterator for BFSIter<'_, T> { } #[derive(Debug)] -pub struct DFSIter<'a, T> { - btree: &'a BTree, +pub struct DFSIter { stack: Vec>, cur: Item, } -impl Iterator for DFSIter<'_, T> { +impl Iterator for DFSIter { // Need this alias because it's in the fn signature of the trait type Item = T; diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index b57a3b3..3cc50d6 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -6,7 +6,7 @@ fn main() { let tree: btree::BTree<&String> = btree::BTree::new(); println!("btree {:?}", tree); - let mut tree2: btree::BTree<&str> = btree::BTree::new(); + let tree2 = &mut btree::BTree::new(); tree2.insert("hello"); tree2.insert("!"); tree2.insert("2"); @@ -15,9 +15,8 @@ fn main() { tree2.insert("foo"); tree2.insert("world"); - println!("\nbtree2 {:?}", tree2); - - for s in tree2.bfs_iter() { + // Turn mutable reference into immutable reference for iterator. + for s in &*tree2 { println!("BFS: {}", s); } From dae0bb8e845a6a20f0db8b531223131ff0ec5d26 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 08:29:23 -0400 Subject: [PATCH 073/180] Clean up main.rs. --- rust/btree/src/main.rs | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index 3cc50d6..8119438 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -1,12 +1,26 @@ mod btree; fn main() { - println!("Hello, world!"); + // Tree1 is a mutable reference. + let tree1 = &mut btree::BTree::new(); + tree1.insert("hello"); + tree1.insert("!"); + tree1.insert("2"); + tree1.insert("1"); + tree1.insert("boo"); + tree1.insert("foo"); + tree1.insert("world"); - let tree: btree::BTree<&String> = btree::BTree::new(); - println!("btree {:?}", tree); + // Turn mutable reference into immutable reference because + // the IntoIterator trait is only implemented for immutable + // references. + println!("Iterating over tree1 {:?}", tree1); + for s in &*tree1 { + println!("tree1 BFS: {}", s); + } - let tree2 = &mut btree::BTree::new(); + // Tree2 is a mutable value. + let mut tree2 = btree::BTree::new(); tree2.insert("hello"); tree2.insert("!"); tree2.insert("2"); @@ -15,12 +29,13 @@ fn main() { tree2.insert("foo"); tree2.insert("world"); - // Turn mutable reference into immutable reference for iterator. - for s in &*tree2 { - println!("BFS: {}", s); + // These get the iterators directly from the instance, not using + // the IntoIterator trait. + for s in tree2.bfs_iter() { + println!("tree3 BFS: {}", s); } for s in tree2.dfs_iter() { - println!("DFS: {}", s); + println!("tree3 DFS: {}", s); } } From c38f79e1dbc1594204c3ca5a2820c8d93777b3c7 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 09:47:44 -0400 Subject: [PATCH 074/180] Iterator example with collect() --- rust/btree/src/main.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index 8119438..99ae767 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -19,6 +19,12 @@ fn main() { println!("tree1 BFS: {}", s); } + let c: Vec<&str> = tree1.bfs_iter().collect(); + println!("Collect: {:?}", c); + + let c: Vec<&str> = tree1.dfs_iter().collect(); + println!("Collect: {:?}", c); + // Tree2 is a mutable value. let mut tree2 = btree::BTree::new(); tree2.insert("hello"); From 3f7618d791532129905247d05f3d5b34da6ab19f Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 09:51:13 -0400 Subject: [PATCH 075/180] Call collect() without temporary. --- rust/btree/src/main.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index 99ae767..676b76a 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -19,11 +19,12 @@ fn main() { println!("tree1 BFS: {}", s); } + // Calling collect() on iterator let c: Vec<&str> = tree1.bfs_iter().collect(); - println!("Collect: {:?}", c); + println!("Collect BFS: {:?}", c); - let c: Vec<&str> = tree1.dfs_iter().collect(); - println!("Collect: {:?}", c); + // Calling collect() without temporary + println!("Collect: DFS {:?}", tree1.dfs_iter().collect::>()); // Tree2 is a mutable value. let mut tree2 = btree::BTree::new(); From f331a257d79ab4e112a9d97b199262e29c3b0c23 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 13:16:03 -0400 Subject: [PATCH 076/180] No need to specify precise type in collect:: signature. --- rust/btree/src/btree.rs | 2 +- rust/btree/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index ed03aca..fe49110 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -6,7 +6,7 @@ use std::{ // Our nodes are refcounted refcells. Ref-counted because they // have multiple owners, and refcells because the borrow checker is mean. type Item = Rc>>; -type WeakItem = Weak>>; +type WeakItem = Weak>>; // prevent cycles // Down here we add the Ord trait because we want to be able to // compare the elements during insertion / search. And the Copy trait diff --git a/rust/btree/src/main.rs b/rust/btree/src/main.rs index 676b76a..9c81bac 100644 --- a/rust/btree/src/main.rs +++ b/rust/btree/src/main.rs @@ -24,7 +24,7 @@ fn main() { println!("Collect BFS: {:?}", c); // Calling collect() without temporary - println!("Collect: DFS {:?}", tree1.dfs_iter().collect::>()); + println!("Collect DFS: {:?}", tree1.dfs_iter().collect::>()); // Tree2 is a mutable value. let mut tree2 = btree::BTree::new(); From 503a8f5cf80ffee8913c54ddb8e707ff6c1ae3e9 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 16:52:54 -0400 Subject: [PATCH 077/180] Use ref keyword as an example. --- rust/btree/src/btree.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index fe49110..4e47c88 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -52,7 +52,9 @@ impl BTree { if let Some(val) = some_val { let mut node = (*cur).borrow_mut(); if item <= val { - if let Some(left) = &node.left { + // You can also do: + // if let Some(left) = &node.left {...} + if let Some(ref left) = node.left { // If there's already a left node, then move cur to it next = Rc::clone(left); } else { @@ -63,7 +65,7 @@ impl BTree { next = Rc::clone(&new_node); } } else { - if let Some(right) = &node.right { + if let Some(ref right) = node.right { // If there's already a right node, then move cur to it next = Rc::clone(right); } else { From 01c6712601f3e29d3f9fc53fcbadf77bbcbb354f Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 17:50:20 -0400 Subject: [PATCH 078/180] Replace if/else with Option or_else. --- rust/btree/src/btree.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 4e47c88..fdb0de0 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -139,11 +139,7 @@ impl Iterator for BFSIter { self.q.push(Rc::clone(&right)); } - if let Some(val) = &node.val { - Some(*val) - } else { - self.next() - } + node.val.or_else(|| self.next()) } } @@ -169,10 +165,6 @@ impl Iterator for DFSIter { self.stack.push(Rc::clone(&right)); } - if let Some(val) = &node.val { - return Some(*val); - } else { - return self.next(); - } + node.val.or_else(|| self.next()) } } From 64b367bc753b1e75cbb4a7534fb782806264966d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 17:56:24 -0400 Subject: [PATCH 079/180] Remove spurious Rc::clone. --- rust/btree/src/btree.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index fdb0de0..58fece6 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -81,7 +81,7 @@ impl BTree { break; } - cur = Rc::clone(&next); + cur = next; } } From 3a31bf89fd229d804a69e570f7304689bb284aba Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 18:41:15 -0400 Subject: [PATCH 080/180] Use .map() instead of if let. --- rust/btree/src/btree.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 58fece6..5d184a7 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -131,13 +131,13 @@ impl Iterator for BFSIter { let item = self.q.remove(0); let node = (*item).borrow(); - if let Some(left) = &node.left { - self.q.push(Rc::clone(&left)); - } - - if let Some(right) = &node.right { - self.q.push(Rc::clone(&right)); - } + // Alternate way to express the if let statements in DFSIter below + node.left + .as_ref() + .map(|ref left| self.q.push(Rc::clone(left))); + node.right + .as_ref() + .map(|ref right| self.q.push(Rc::clone(right))); node.val.or_else(|| self.next()) } From 424d4f7adaee515d05a1b8adb9cebe111705b15b Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 18:43:34 -0400 Subject: [PATCH 081/180] Removed spurious reference. --- rust/btree/src/btree.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 5d184a7..2d949fb 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -132,12 +132,8 @@ impl Iterator for BFSIter { let node = (*item).borrow(); // Alternate way to express the if let statements in DFSIter below - node.left - .as_ref() - .map(|ref left| self.q.push(Rc::clone(left))); - node.right - .as_ref() - .map(|ref right| self.q.push(Rc::clone(right))); + node.left.as_ref().map(|l| self.q.push(Rc::clone(l))); + node.right.as_ref().map(|r| self.q.push(Rc::clone(r))); node.val.or_else(|| self.next()) } @@ -157,11 +153,11 @@ impl Iterator for DFSIter { let item = self.stack.pop()?; let node = (*item).borrow(); - if let Some(left) = &node.left { + if let Some(ref left) = node.left { self.stack.push(Rc::clone(&left)); } - if let Some(right) = &node.right { + if let Some(ref right) = node.right { self.stack.push(Rc::clone(&right)); } From 7a467d788876ed482569d32ec9fa2deb87ff37e3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 19 Sep 2021 18:57:35 -0400 Subject: [PATCH 082/180] Remove unnecessary cur member in iterators. --- rust/btree/src/btree.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 2d949fb..deb63b8 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -89,7 +89,6 @@ impl BTree { pub fn bfs_iter(&self) -> BFSIter { BFSIter { q: vec![Rc::clone(&self.root)], - cur: Rc::clone(&self.root), } } @@ -97,7 +96,6 @@ impl BTree { pub fn dfs_iter(&self) -> DFSIter { DFSIter { stack: vec![Rc::clone(&self.root)], - cur: Rc::clone(&self.root), } } } @@ -116,7 +114,6 @@ impl IntoIterator for &BTree { #[derive(Debug)] pub struct BFSIter { q: Vec>, - cur: Item, } impl Iterator for BFSIter { @@ -142,7 +139,6 @@ impl Iterator for BFSIter { #[derive(Debug)] pub struct DFSIter { stack: Vec>, - cur: Item, } impl Iterator for DFSIter { From 72d41344176aae2e97744b8e94d1b48bcc080102 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 20 Sep 2021 19:36:36 -0400 Subject: [PATCH 083/180] Added tests. --- rust/btree/src/btree.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index deb63b8..dd0a229 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -160,3 +160,27 @@ impl Iterator for DFSIter { node.val.or_else(|| self.next()) } } + +#[cfg(test)] +mod tests { + use super::BTree; + + #[test] + fn it_works() { + let mut tree = BTree::new(); + tree.insert("foo"); + tree.insert("baz"); + tree.insert("bar"); + tree.insert("boo"); + + // println!("collect: {:?}", tree.dfs_iter().collect::>()); + assert_eq!( + vec!["foo", "baz", "boo", "bar"], + tree.dfs_iter().collect::>() + ); + assert_eq!( + vec!["foo", "baz", "bar", "boo"], + tree.bfs_iter().collect::>() + ); + } +} From b454f7d53293072fbe9e17c5580284b02f2080e3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 20 Sep 2021 20:48:46 -0400 Subject: [PATCH 084/180] Simplify trait bounds and insert() logic. --- rust/btree/src/btree.rs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index dd0a229..95c32b0 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -25,7 +25,7 @@ pub struct BTree { root: Item, } -impl BTree { +impl BTree { pub fn new() -> BTree { BTree { root: BTree::new_noderef(), @@ -46,42 +46,39 @@ impl BTree { let mut cur = Rc::clone(&self.root); loop { - let mut next = Rc::clone(&cur); - let some_val = (*cur).borrow().val; + let temp = Rc::clone(&cur); + let mut node = temp.borrow_mut(); - if let Some(val) = some_val { - let mut node = (*cur).borrow_mut(); - if item <= val { + if let Some(ref val) = node.val { + if item <= *val { // You can also do: // if let Some(left) = &node.left {...} if let Some(ref left) = node.left { // If there's already a left node, then move cur to it - next = Rc::clone(left); + cur = Rc::clone(left); } else { // Otherwise, create a new node, and move to it let new_node = BTree::new_noderef(); (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); node.left = Some(Rc::clone(&new_node)); - next = Rc::clone(&new_node); + cur = Rc::clone(&new_node); } } else { if let Some(ref right) = node.right { // If there's already a right node, then move cur to it - next = Rc::clone(right); + cur = Rc::clone(right); } else { // Otherwise, create a new node, and move to it let new_node = BTree::new_noderef(); (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); node.right = Some(Rc::clone(&new_node)); - next = Rc::clone(&new_node); + cur = Rc::clone(&new_node); } } } else { - (*next).borrow_mut().val = Some(item); + (*node).val = Some(item); break; } - - cur = next; } } @@ -112,7 +109,7 @@ impl IntoIterator for &BTree { // This is a breadth-first search iterator. #[derive(Debug)] -pub struct BFSIter { +pub struct BFSIter { q: Vec>, } @@ -137,7 +134,7 @@ impl Iterator for BFSIter { } #[derive(Debug)] -pub struct DFSIter { +pub struct DFSIter { stack: Vec>, } From 0b73f59afa665332af4bf0c750df4e65645386c6 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 20 Sep 2021 21:21:33 -0400 Subject: [PATCH 085/180] Remove two more spurious Rc::clone calls. --- rust/btree/src/btree.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 95c32b0..6b743f3 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -61,7 +61,7 @@ impl BTree { let new_node = BTree::new_noderef(); (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); node.left = Some(Rc::clone(&new_node)); - cur = Rc::clone(&new_node); + cur = new_node; } } else { if let Some(ref right) = node.right { @@ -72,7 +72,7 @@ impl BTree { let new_node = BTree::new_noderef(); (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); node.right = Some(Rc::clone(&new_node)); - cur = Rc::clone(&new_node); + cur = new_node; } } } else { From 34dcc783d86a6b427efe308fbbc3966caff19498 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 20 Sep 2021 21:29:01 -0400 Subject: [PATCH 086/180] Removed more temporaries. --- rust/btree/src/btree.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 6b743f3..39568f7 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -28,15 +28,15 @@ pub struct BTree { impl BTree { pub fn new() -> BTree { BTree { - root: BTree::new_noderef(), + root: BTree::new_noderef(None), } } - fn new_noderef() -> Item { + fn new_noderef(parent: Option>) -> Item { Rc::new(RefCell::new(Node { left: None, right: None, - parent: None, + parent, val: None, })) } @@ -58,10 +58,8 @@ impl BTree { cur = Rc::clone(left); } else { // Otherwise, create a new node, and move to it - let new_node = BTree::new_noderef(); - (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); - node.left = Some(Rc::clone(&new_node)); - cur = new_node; + cur = BTree::new_noderef(Some(Rc::downgrade(&cur))); + node.left = Some(Rc::clone(&cur)); } } else { if let Some(ref right) = node.right { @@ -69,10 +67,8 @@ impl BTree { cur = Rc::clone(right); } else { // Otherwise, create a new node, and move to it - let new_node = BTree::new_noderef(); - (*new_node).borrow_mut().parent = Some(Rc::downgrade(&cur)); - node.right = Some(Rc::clone(&new_node)); - cur = new_node; + cur = BTree::new_noderef(Some(Rc::downgrade(&cur))); + node.right = Some(Rc::clone(&cur)); } } } else { From 646ae38c3c0bd5b0625a3248eab0c5e3c1e04652 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 20 Sep 2021 21:35:24 -0400 Subject: [PATCH 087/180] Replace if let with match. --- rust/btree/src/btree.rs | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index 39568f7..eae0d9f 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -51,24 +51,20 @@ impl BTree { if let Some(ref val) = node.val { if item <= *val { - // You can also do: - // if let Some(left) = &node.left {...} - if let Some(ref left) = node.left { - // If there's already a left node, then move cur to it - cur = Rc::clone(left); - } else { - // Otherwise, create a new node, and move to it - cur = BTree::new_noderef(Some(Rc::downgrade(&cur))); - node.left = Some(Rc::clone(&cur)); + match node.left { + Some(ref left) => cur = Rc::clone(left), + None => { + cur = BTree::new_noderef(Some(Rc::downgrade(&cur))); + node.left = Some(Rc::clone(&cur)); + } } } else { - if let Some(ref right) = node.right { - // If there's already a right node, then move cur to it - cur = Rc::clone(right); - } else { - // Otherwise, create a new node, and move to it - cur = BTree::new_noderef(Some(Rc::downgrade(&cur))); - node.right = Some(Rc::clone(&cur)); + match node.right { + Some(ref right) => cur = Rc::clone(right), + None => { + cur = BTree::new_noderef(Some(Rc::downgrade(&cur))); + node.right = Some(Rc::clone(&cur)); + } } } } else { From ecc6a23a2e6d7d5af91d2209591025b718cc8530 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 23 Sep 2021 20:00:56 -0400 Subject: [PATCH 088/180] Remove stale comments. --- rust/btree/src/btree.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rust/btree/src/btree.rs b/rust/btree/src/btree.rs index eae0d9f..e463f5b 100644 --- a/rust/btree/src/btree.rs +++ b/rust/btree/src/btree.rs @@ -3,15 +3,9 @@ use std::{ rc::{Rc, Weak}, }; -// Our nodes are refcounted refcells. Ref-counted because they -// have multiple owners, and refcells because the borrow checker is mean. type Item = Rc>>; type WeakItem = Weak>>; // prevent cycles -// Down here we add the Ord trait because we want to be able to -// compare the elements during insertion / search. And the Copy trait -// allows you to return a copy of the elements, which encourages you -// to attach primitive types or references. #[derive(Debug)] pub struct Node { left: Option>, From e74c913ab34314a6171e96d9bf62556dcdcc3c88 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 23 Sep 2021 20:29:29 -0400 Subject: [PATCH 089/180] Added rust echo server in tokio. --- rust/echo/Cargo.lock | 278 ++++++++++++++++++++++++++++++++++++++++++ rust/echo/Cargo.toml | 9 ++ rust/echo/src/main.rs | 30 +++++ 3 files changed, 317 insertions(+) create mode 100644 rust/echo/Cargo.lock create mode 100644 rust/echo/Cargo.toml create mode 100644 rust/echo/src/main.rs diff --git a/rust/echo/Cargo.lock b/rust/echo/Cargo.lock new file mode 100644 index 0000000..2a78e2c --- /dev/null +++ b/rust/echo/Cargo.lock @@ -0,0 +1,278 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "echo" +version = "0.1.0" +dependencies = [ + "tokio", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "instant" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "libc" +version = "0.2.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" + +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "mio" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "proc-macro2" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "syn" +version = "1.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tokio" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/rust/echo/Cargo.toml b/rust/echo/Cargo.toml new file mode 100644 index 0000000..5bd5d43 --- /dev/null +++ b/rust/echo/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "echo" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tokio = {version = "1", features = ["full"]} diff --git a/rust/echo/src/main.rs b/rust/echo/src/main.rs new file mode 100644 index 0000000..82974a1 --- /dev/null +++ b/rust/echo/src/main.rs @@ -0,0 +1,30 @@ +use tokio::{ + io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, + net::TcpListener, +}; + +#[tokio::main] +async fn main() { + println!("Hello, world!"); + + let listener = TcpListener::bind("127.0.0.1:4040").await.unwrap(); + + let (mut socket, addr) = listener.accept().await.unwrap(); + + let (reader, mut writer) = socket.split(); + + let mut reader = BufReader::new(reader); + let mut line = String::new(); + + println!("Connection from: {:?}", addr); + loop { + let bytes_read = reader.read_line(&mut line).await.unwrap(); + if bytes_read == 0 { + break; + } + + println!("Received: {:?}", line); + writer.write_all(line.as_bytes()).await.unwrap(); + line.clear(); + } +} From 06ca249494a1198d7b61f15166777ea689e64c22 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 25 Sep 2021 16:57:21 -0400 Subject: [PATCH 090/180] Use tokio::select! for echo server. --- rust/echo/src/main.rs | 46 ++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/rust/echo/src/main.rs b/rust/echo/src/main.rs index 82974a1..1b08216 100644 --- a/rust/echo/src/main.rs +++ b/rust/echo/src/main.rs @@ -1,6 +1,7 @@ use tokio::{ io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::TcpListener, + sync::broadcast, }; #[tokio::main] @@ -9,22 +10,39 @@ async fn main() { let listener = TcpListener::bind("127.0.0.1:4040").await.unwrap(); - let (mut socket, addr) = listener.accept().await.unwrap(); + let (tx, _rx) = broadcast::channel::(10); - let (reader, mut writer) = socket.split(); + loop { + let (mut socket, addr) = listener.accept().await.unwrap(); + let tx = tx.clone(); + let mut rx = tx.subscribe(); - let mut reader = BufReader::new(reader); - let mut line = String::new(); + tokio::spawn(async move { + let (reader, mut writer) = socket.split(); - println!("Connection from: {:?}", addr); - loop { - let bytes_read = reader.read_line(&mut line).await.unwrap(); - if bytes_read == 0 { - break; - } - - println!("Received: {:?}", line); - writer.write_all(line.as_bytes()).await.unwrap(); - line.clear(); + let mut reader = BufReader::new(reader); + let mut line = String::new(); + + println!("Connection from: {:?}", addr); + loop { + tokio::select! { + result = reader.read_line(&mut line) => { + if result.unwrap() == 0 { + break; + } + + tx.send(line.clone()).unwrap(); + line.clear(); + } + + _ = rx.recv() => { + let msg = rx.recv().await.unwrap(); + + println!("Received: {:?}", msg); + writer.write_all(line.as_bytes()).await.unwrap(); + } + } + } + }); } } From 5b34e19206a2c7b01d8f2d7974e6ffdc98007950 Mon Sep 17 00:00:00 2001 From: Mo Date: Fri, 11 Nov 2022 01:29:03 +0000 Subject: [PATCH 091/180] Added minikube experiments and iptables filters. --- minikube/Dockerfile | 26 ++++++++++ minikube/README.md | 108 ++++++++++++++++++++++++++++++++++++++++ minikube/go.mod | 5 ++ minikube/go.sum | 33 ++++++++++++ minikube/iptables.old | 43 ++++++++++++++++ minikube/main-depl.yaml | 53 ++++++++++++++++++++ minikube/main.go | 23 +++++++++ 7 files changed, 291 insertions(+) create mode 100644 minikube/Dockerfile create mode 100644 minikube/README.md create mode 100644 minikube/go.mod create mode 100644 minikube/go.sum create mode 100644 minikube/iptables.old create mode 100644 minikube/main-depl.yaml create mode 100644 minikube/main.go diff --git a/minikube/Dockerfile b/minikube/Dockerfile new file mode 100644 index 0000000..deaf115 --- /dev/null +++ b/minikube/Dockerfile @@ -0,0 +1,26 @@ +FROM golang:1.19 as builder + +# Create and change to the app directory. +WORKDIR /app + +# Retrieve application dependencies. +# This allows the container build to reuse cached dependencies. +COPY go.* ./ +RUN go mod download + +# Copy local code to the container image. +COPY . ./ + +# Build the binary. +RUN CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o main + +# Use the official Alpine image for a lean production container. +# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds +FROM alpine:latest +RUN apk add --no-cache ca-certificates + +# Copy the binary to the production image from the builder stage. +COPY --from=builder /app/main /main + +# Run the web service on container startup. +CMD ["/main"] \ No newline at end of file diff --git a/minikube/README.md b/minikube/README.md new file mode 100644 index 0000000..49ee483 --- /dev/null +++ b/minikube/README.md @@ -0,0 +1,108 @@ +# HOWTO + +## Setup + +``` +minikube start +eval $(minikube -p minikube docker-env) +``` + +## Run + +``` +go run main +``` + +### Build container image + +``` +# Point docker to local minikube image repo +eval $(minikube -p minikube docker-env) + +# builds and pushes to local repo +docker build . -t 0xfe/main +``` + +### Run container on host + +``` +docker run -p 3000:3000 0xfe/main +``` + +### Run in k8s / minikube + +Make sure deployment has "imagePullPolicy: Never". + +``` +kubectl apply -f main-depl.yaml +kubectl get pods +``` + +### Forward ports from outside world to ingress + +``` +ip -4 addr show scope global + +# Try using -I instead of -A for the rules below + +# NAT between internal IP and Ingress IP for locally generated packets (OUTPUT chain) +sudo iptables -t nat -I OUTPUT -p tcp -d 10.240.0.3 --dport 80 -j DNAT --to-destination 192.168.49.2:80 + +# NAT between external IP and Ingress IP for locally generated packets (OUTPUT chain) +sudo iptables -t nat -I OUTPUT -p tcp -d 34.74.108.195 --dport 80 -j DNAT --to-destination 192.168.49.2:80 + +# NAT between host IPs and Ingress IP for packets coming from the outside (PREROUTING) +sudo iptables -t nat -I PREROUTING -p tcp -d 34.74.108.195 --dport 80 -j DNAT --to-destination 192.168.49.2:80 +sudo iptables -t nat -I PREROUTING -p tcp -d 10.240.0.3 --dport 80 -j DNAT --to-destination 192.168.49.2:80 + +# Allow IP forwarding from ens4 (host interface) to Ingress bridge interface +sudo iptables -A FORWARD -i ens4 -o br-f998b9bf1ee5 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT +sudo iptables -A FORWARD -i ens4 -o br-f998b9bf1ee5 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A FORWARD -i br-f998b9bf1ee5 -o ens4 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + +``` + +### Debug iptables + +``` +sudo iptables -L +sudo iptables -L -t nat +sudo iptables -L -t nat --line + +# delete rule 1 in chain OUTPUT +sudo iptables -D OUTPUT 1 +``` + +# OLD STUFF + +``` + +###sudo iptables -t nat -A POSTROUTING -j MASQUERADE + +?? +sudo iptables -t nat -I PREROUTING -p tcp -i ens4 --dport 80 -j DNAT --to 192.168.49.2 +sudo iptables -t nat -I POSTROUTING -p tcp -o ens4 --dport 80 -d 192.168.49.2 -j SNAT --to 10.240.0.3 + + +### more specific, but does not work +sudo iptables -t nat -A PREROUTING -p tcp -d 10.240.0.3 --dport 80 -j DNAT --to-destination 192.168.49.2:80 +sudo iptables -t nat -A PREROUTING -p tcp -d 34.74.108.195 --dport 80 -jDNAT --to-destination 192.168.49.2:80 + +sudo iptables -A FORWARD -i ens4 -o br-f998b9bf1ee5 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT +sudo iptables -A FORWARD -i ens4 -o br-f998b9bf1ee5 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A FORWARD -i br-f998b9bf1ee5 -o ens4 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + +# if filtered +sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT +sudo iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT +sudo iptables -I FORWARD -p tcp -d 192.168.49.2 --dport 80 -j ACCEPT +sudo iptables -I FORWARD -p tcp -d 10.240.0.3 --dport 80 -j ACCEPT + +iptables -t nat -A POSTROUTING -o ens4 -p tcp -d 192.168.49.2 --dport 80 -j RETURN + +sudo tcpdump -i ens4 port 80 + +iptables -t nat -A PREROUTING -p tcp -m tcp -i ens0 --dport 80 -j REDIRECT --to-ports 8080 + + +``` \ No newline at end of file diff --git a/minikube/go.mod b/minikube/go.mod new file mode 100644 index 0000000..97b86d8 --- /dev/null +++ b/minikube/go.mod @@ -0,0 +1,5 @@ +module muthanna.com/code + +go 1.15 + +require golang.org/x/tools v0.2.0 // indirect diff --git a/minikube/go.sum b/minikube/go.sum new file mode 100644 index 0000000..d6ef4e2 --- /dev/null +++ b/minikube/go.sum @@ -0,0 +1,33 @@ +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/minikube/iptables.old b/minikube/iptables.old new file mode 100644 index 0000000..fd3a867 --- /dev/null +++ b/minikube/iptables.old @@ -0,0 +1,43 @@ +# Generated by iptables-save v1.8.7 on Fri Nov 11 00:53:15 2022 +*filter +:INPUT ACCEPT [0:0] +:FORWARD DROP [0:0] +:OUTPUT ACCEPT [0:0] +:DOCKER - [0:0] +:DOCKER-ISOLATION-STAGE-1 - [0:0] +:DOCKER-ISOLATION-STAGE-2 - [0:0] +:DOCKER-USER - [0:0] +-A FORWARD -j DOCKER-USER +-A FORWARD -j DOCKER-ISOLATION-STAGE-1 +-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +-A FORWARD -o docker0 -j DOCKER +-A FORWARD -i docker0 ! -o docker0 -j ACCEPT +-A FORWARD -i docker0 -o docker0 -j ACCEPT +-A FORWARD -o br-f998b9bf1ee5 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT +-A FORWARD -o br-f998b9bf1ee5 -j DOCKER +-A FORWARD -i br-f998b9bf1ee5 ! -o br-f998b9bf1ee5 -j ACCEPT +-A FORWARD -i br-f998b9bf1ee5 -o br-f998b9bf1ee5 -j ACCEPT +-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2 +-A DOCKER-ISOLATION-STAGE-1 -i br-f998b9bf1ee5 ! -o br-f998b9bf1ee5 -j DOCKER-ISOLATION-STAGE-2 +-A DOCKER-ISOLATION-STAGE-1 -j RETURN +-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP +-A DOCKER-ISOLATION-STAGE-2 -o br-f998b9bf1ee5 -j DROP +-A DOCKER-ISOLATION-STAGE-2 -j RETURN +-A DOCKER-USER -j RETURN +COMMIT +# Completed on Fri Nov 11 00:53:15 2022 +# Generated by iptables-save v1.8.7 on Fri Nov 11 00:53:15 2022 +*nat +:PREROUTING ACCEPT [0:0] +:INPUT ACCEPT [0:0] +:OUTPUT ACCEPT [0:0] +:POSTROUTING ACCEPT [0:0] +:DOCKER - [0:0] +-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER +-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER +-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE +-A POSTROUTING -s 192.168.49.0/24 ! -o br-f998b9bf1ee5 -j MASQUERADE +-A DOCKER -i docker0 -j RETURN +-A DOCKER -i br-f998b9bf1ee5 -j RETURN +COMMIT +# Completed on Fri Nov 11 00:53:15 2022 diff --git a/minikube/main-depl.yaml b/minikube/main-depl.yaml new file mode 100644 index 0000000..c7310a9 --- /dev/null +++ b/minikube/main-depl.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: main-deployment + labels: + app: main +spec: + replicas: 3 + selector: + matchLabels: + app: main + template: + metadata: + labels: + app: main + spec: + containers: + - name: main + image: 0xfe/main + imagePullPolicy: Never + ports: + - containerPort: 3000 +--- +apiVersion: v1 +kind: Service +metadata: + name: main-service +spec: + selector: + app: main + ports: + - name: http + protocol: TCP + port: 3000 + targetPort: 3000 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: main-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: main-service + port: + number: 3000 \ No newline at end of file diff --git a/minikube/main.go b/minikube/main.go new file mode 100644 index 0000000..39c2f19 --- /dev/null +++ b/minikube/main.go @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" + "html" + "log" + "net/http" +) + +const PORT = 3000 + +func main() { + log.Printf("Starting webserver on port %d...\n", PORT) + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) + }) + + http.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hi") + }) + + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", PORT), nil)) +} From 6c9455e456660a1246fa7fc8dfaa3133bdd8ae76 Mon Sep 17 00:00:00 2001 From: Mo Date: Fri, 11 Nov 2022 14:39:07 +0000 Subject: [PATCH 092/180] Working dice proto. --- minikube/.gitignore | 2 + minikube/README.md | 7 +++ minikube/dice/dice.proto | 34 +++++++++++ minikube/go.mod | 8 ++- minikube/go.sum | 119 +++++++++++++++++++++++++++++++++++++++ minikube/main.go | 7 ++- 6 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 minikube/.gitignore create mode 100644 minikube/dice/dice.proto diff --git a/minikube/.gitignore b/minikube/.gitignore new file mode 100644 index 0000000..71fc271 --- /dev/null +++ b/minikube/.gitignore @@ -0,0 +1,2 @@ +*.pb.go +main diff --git a/minikube/README.md b/minikube/README.md index 49ee483..73a9591 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -23,6 +23,13 @@ eval $(minikube -p minikube docker-env) docker build . -t 0xfe/main ``` +### Build protos + +``` +protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto + +``` + ### Run container on host ``` diff --git a/minikube/dice/dice.proto b/minikube/dice/dice.proto new file mode 100644 index 0000000..9294bb1 --- /dev/null +++ b/minikube/dice/dice.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +option go_package = "0xfe/experiments/minikube/dice"; + +enum Face { + FACE_HEADS = 0; + FACE_TAILS = 1; +} + +message DiceRoll { + int32 id = 1; + Face face = 2; +} + +message RollTable { + string roller_handle = 1; + repeated DiceRoll rolls = 2; +} + +message RollRequest { + string roller_handle = 1; +} + +message RollResponse {} + +message GetRollsRequest {} +message GetRollsResponse { + repeated RollTable rolltable = 1; +} + +service RollService { + rpc Roll(RollRequest) returns (RollResponse); + rpc GetRolls(GetRollsRequest) returns (stream GetRollsResponse); +} \ No newline at end of file diff --git a/minikube/go.mod b/minikube/go.mod index 97b86d8..cfb2112 100644 --- a/minikube/go.mod +++ b/minikube/go.mod @@ -1,5 +1,9 @@ -module muthanna.com/code +module 0xfe/experiments/minikube go 1.15 -require golang.org/x/tools v0.2.0 // indirect +require ( + golang.org/x/tools v0.2.0 // indirect + google.golang.org/grpc v1.50.1 // indirect + google.golang.org/protobuf v1.28.1 // indirect +) diff --git a/minikube/go.sum b/minikube/go.sum index d6ef4e2..a1ce9c9 100644 --- a/minikube/go.sum +++ b/minikube/go.sum @@ -1,18 +1,95 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -24,10 +101,52 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/minikube/main.go b/minikube/main.go index 39c2f19..281eaa5 100644 --- a/minikube/main.go +++ b/minikube/main.go @@ -1,6 +1,7 @@ package main import ( + "0xfe/experiments/minikube/dice" "fmt" "html" "log" @@ -11,12 +12,14 @@ const PORT = 3000 func main() { log.Printf("Starting webserver on port %d...\n", PORT) + face := dice.Face(dice.Face_FACE_HEADS) + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) }) - http.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hi") + http.HandleFunc("/roll", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Roll: %d", face) }) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", PORT), nil)) From e759d70bcf5e9568bb7c8cbbabc875f8f36c3353 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 12 Nov 2022 11:58:28 +0000 Subject: [PATCH 093/180] Added GRPC server. --- minikube/server/main.go | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 minikube/server/main.go diff --git a/minikube/server/main.go b/minikube/server/main.go new file mode 100644 index 0000000..6f56b66 --- /dev/null +++ b/minikube/server/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "0xfe/experiments/minikube/dice" + "context" + "fmt" + "log" + "net" + "sync" + + "google.golang.org/grpc" +) + +const PORT = 3001 + +type DiceServer struct { + dice.UnimplementedRollServiceServer + table map[string]*dice.RollTable + + mu *sync.Mutex +} + +func NewDiceServer() *DiceServer { + return &DiceServer{ + table: map[string]*dice.RollTable{}, + } +} + +func (s *DiceServer) Roll(ctx context.Context, req *dice.RollRequest) (*dice.RollResponse, error) { + handle := req.RollerHandle + + defer s.mu.Unlock() + s.mu.Lock() + if t, ok := s.table[handle]; ok { + t.Rolls = append(t.Rolls, &dice.DiceRoll{Id: 1, Face: dice.Face_FACE_HEADS}) + } else { + t := &dice.RollTable{ + RollerHandle: handle, + Rolls: []*dice.DiceRoll{ + {Id: 0, Face: dice.Face_FACE_TAILS}, + }, + } + + s.table[handle] = t + } + + response := &dice.RollResponse{} + return response, nil +} + +func main() { + log.Printf("Starting GRPC RollServer on port %d...\n", PORT) + + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", PORT)) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + + gsrv := grpc.NewServer() + diceServer := NewDiceServer() + dice.RegisterRollServiceServer(gsrv, diceServer) + if err := gsrv.Serve(lis); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} From 89999397e42165175cba93da4c4a02680382027b Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 12 Nov 2022 14:37:38 +0000 Subject: [PATCH 094/180] Use random dice rolls. --- minikube/README.md | 24 ++++++++++++++++++++++-- minikube/client/main.go | 12 ++++++++++++ minikube/server/main.go | 8 +++++++- 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 minikube/client/main.go diff --git a/minikube/README.md b/minikube/README.md index 73a9591..d54e251 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -9,8 +9,28 @@ eval $(minikube -p minikube docker-env) ## Run -``` -go run main +`` +# main +go run main.go + +# server +cd server +go run main.go + +# curl +$ grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 describe +Warning: The -d argument is not used with 'list' or 'describe' verb. +RollService is a service: +service RollService { + rpc GetRolls ( .GetRollsRequest ) returns ( stream .GetRollsResponse ); + rpc Roll ( .RollRequest ) returns ( .RollResponse ); +} +grpc.reflection.v1alpha.ServerReflection is a service: +service ServerReflection { + rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse ); +} + +grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 RollService/Roll ``` ### Build container image diff --git a/minikube/client/main.go b/minikube/client/main.go new file mode 100644 index 0000000..c594bf0 --- /dev/null +++ b/minikube/client/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +func main() { + rand.Seed(time.Now().UnixNano()) + fmt.Printf("hello world: %d\n", rand.Intn(2)) +} diff --git a/minikube/server/main.go b/minikube/server/main.go index 6f56b66..9976457 100644 --- a/minikube/server/main.go +++ b/minikube/server/main.go @@ -5,10 +5,13 @@ import ( "context" "fmt" "log" + "math/rand" "net" "sync" + "time" "google.golang.org/grpc" + "google.golang.org/grpc/reflection" ) const PORT = 3001 @@ -23,6 +26,7 @@ type DiceServer struct { func NewDiceServer() *DiceServer { return &DiceServer{ table: map[string]*dice.RollTable{}, + mu: &sync.Mutex{}, } } @@ -32,7 +36,7 @@ func (s *DiceServer) Roll(ctx context.Context, req *dice.RollRequest) (*dice.Rol defer s.mu.Unlock() s.mu.Lock() if t, ok := s.table[handle]; ok { - t.Rolls = append(t.Rolls, &dice.DiceRoll{Id: 1, Face: dice.Face_FACE_HEADS}) + t.Rolls = append(t.Rolls, &dice.DiceRoll{Id: 1, Face: dice.Face(rand.Intn(2))}) } else { t := &dice.RollTable{ RollerHandle: handle, @@ -49,6 +53,7 @@ func (s *DiceServer) Roll(ctx context.Context, req *dice.RollRequest) (*dice.Rol } func main() { + rand.Seed(time.Now().UnixNano()) log.Printf("Starting GRPC RollServer on port %d...\n", PORT) lis, err := net.Listen("tcp", fmt.Sprintf(":%d", PORT)) @@ -57,6 +62,7 @@ func main() { } gsrv := grpc.NewServer() + reflection.Register(gsrv) // for grpcurl diceServer := NewDiceServer() dice.RegisterRollServiceServer(gsrv, diceServer) if err := gsrv.Serve(lis); err != nil { From 70cb944076c0973588aec8ef0a5ce86f7074bcb6 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 12 Nov 2022 17:07:49 +0000 Subject: [PATCH 095/180] Working grpc client. --- minikube/Dockerfile | 2 +- minikube/client/main.go | 27 +++++++++++++++++++++++++++ minikube/server/main.go | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/minikube/Dockerfile b/minikube/Dockerfile index deaf115..c04d654 100644 --- a/minikube/Dockerfile +++ b/minikube/Dockerfile @@ -3,7 +3,7 @@ FROM golang:1.19 as builder # Create and change to the app directory. WORKDIR /app -# Retrieve application dependencies. +# Copy go.mod and go.sum, then retrieve application dependencies. # This allows the container build to reuse cached dependencies. COPY go.* ./ RUN go mod download diff --git a/minikube/client/main.go b/minikube/client/main.go index c594bf0..e81c40b 100644 --- a/minikube/client/main.go +++ b/minikube/client/main.go @@ -1,12 +1,39 @@ package main import ( + "0xfe/experiments/minikube/dice" + "context" "fmt" + "log" "math/rand" "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) func main() { rand.Seed(time.Now().UnixNano()) fmt.Printf("hello world: %d\n", rand.Intn(2)) + + var opts []grpc.DialOption + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.Dial("localhost:3001", opts...) + + if err != nil { + log.Fatalf("could not connect to grpc server: %e", err) + } + + defer conn.Close() + client := dice.NewRollServiceClient(conn) + + resp, err := client.Roll(context.Background(), &dice.RollRequest{ + RollerHandle: "foobar", + }) + + if err != nil { + log.Fatalf("error calling Roll: %e", err) + } + + log.Printf("got response: %v\n", resp) } diff --git a/minikube/server/main.go b/minikube/server/main.go index 9976457..85be909 100644 --- a/minikube/server/main.go +++ b/minikube/server/main.go @@ -25,7 +25,7 @@ type DiceServer struct { func NewDiceServer() *DiceServer { return &DiceServer{ - table: map[string]*dice.RollTable{}, + table: make(map[string]*dice.RollTable), mu: &sync.Mutex{}, } } From 0d7b67ea756a5b5448f193f05778562138b50f98 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 12 Nov 2022 17:48:45 +0000 Subject: [PATCH 096/180] Implemented streaming GetRolls RPC. --- minikube/README.md | 3 +-- minikube/client/main.go | 38 +++++++++++++++++++++++++++++++++----- minikube/dice/dice.proto | 7 +++---- minikube/server/main.go | 17 +++++++++++++++++ 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index d54e251..769350b 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -18,8 +18,7 @@ cd server go run main.go # curl -$ grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 describe -Warning: The -d argument is not used with 'list' or 'describe' verb. +$ grpcurl -plaintext localhost:3001 describe RollService is a service: service RollService { rpc GetRolls ( .GetRollsRequest ) returns ( stream .GetRollsResponse ); diff --git a/minikube/client/main.go b/minikube/client/main.go index e81c40b..84ec52b 100644 --- a/minikube/client/main.go +++ b/minikube/client/main.go @@ -4,6 +4,7 @@ import ( "0xfe/experiments/minikube/dice" "context" "fmt" + "io" "log" "math/rand" "time" @@ -26,14 +27,41 @@ func main() { defer conn.Close() client := dice.NewRollServiceClient(conn) + roll := func(handle string) { + _, err := client.Roll(context.Background(), &dice.RollRequest{ + RollerHandle: handle, + }) - resp, err := client.Roll(context.Background(), &dice.RollRequest{ - RollerHandle: "foobar", - }) + if err != nil { + log.Fatalf("error calling Roll: %e", err) + } + } + + roll("foobar") + roll("foobar") + roll("foobar") + roll("0xfe") + roll("0xfe") + getClient, err := client.GetRolls(context.Background(), &dice.GetRollsRequest{}) if err != nil { - log.Fatalf("error calling Roll: %e", err) + log.Fatalf("error calling GetRolls: %e", err) } - log.Printf("got response: %v\n", resp) + for { + var msg dice.RollTable + err := getClient.RecvMsg(&msg) + if err == io.EOF { + getClient.CloseSend() + log.Println("all done") + return + } + + if err != nil { + log.Fatalf("failed receiving message: %e", err) + } + + fmt.Printf("handle: %v\n", msg.RollerHandle) + fmt.Printf(" rolls: %v\n", msg.Rolls) + } } diff --git a/minikube/dice/dice.proto b/minikube/dice/dice.proto index 9294bb1..11cd1f4 100644 --- a/minikube/dice/dice.proto +++ b/minikube/dice/dice.proto @@ -24,11 +24,10 @@ message RollRequest { message RollResponse {} message GetRollsRequest {} -message GetRollsResponse { - repeated RollTable rolltable = 1; -} service RollService { rpc Roll(RollRequest) returns (RollResponse); - rpc GetRolls(GetRollsRequest) returns (stream GetRollsResponse); + + // Single request, streaming response + rpc GetRolls(GetRollsRequest) returns (stream RollTable); } \ No newline at end of file diff --git a/minikube/server/main.go b/minikube/server/main.go index 85be909..60966a0 100644 --- a/minikube/server/main.go +++ b/minikube/server/main.go @@ -4,6 +4,7 @@ import ( "0xfe/experiments/minikube/dice" "context" "fmt" + "io" "log" "math/rand" "net" @@ -32,6 +33,7 @@ func NewDiceServer() *DiceServer { func (s *DiceServer) Roll(ctx context.Context, req *dice.RollRequest) (*dice.RollResponse, error) { handle := req.RollerHandle + log.Printf("rolling for %s\n", handle) defer s.mu.Unlock() s.mu.Lock() @@ -52,6 +54,21 @@ func (s *DiceServer) Roll(ctx context.Context, req *dice.RollRequest) (*dice.Rol return response, nil } +func (s *DiceServer) GetRolls(req *dice.GetRollsRequest, stream dice.RollService_GetRollsServer) error { + for k, v := range s.table { + log.Printf("returning rolls for %s...\n", k) + err := stream.SendMsg(v) + if err == io.EOF { + return nil + } + + if err != nil { + return err + } + } + return nil +} + func main() { rand.Seed(time.Now().UnixNano()) log.Printf("Starting GRPC RollServer on port %d...\n", PORT) From 0a4e250f7b7f5b55c8a4e4cb6daa4974c3473f23 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 12 Nov 2022 23:03:07 +0000 Subject: [PATCH 097/180] Added server Dockerfile and deployment. --- minikube/README.md | 51 ++++++++++++++----- minikube/client/main.go | 23 +++++---- minikube/k8s/ingress.yaml | 24 +++++++++ .../main-depl copy.yaml} | 20 +------- minikube/k8s/server-depl.yaml | 35 +++++++++++++ minikube/server.Dockerfile | 27 ++++++++++ minikube/server/main.go | 24 ++++++--- 7 files changed, 155 insertions(+), 49 deletions(-) create mode 100644 minikube/k8s/ingress.yaml rename minikube/{main-depl.yaml => k8s/main-depl copy.yaml} (57%) create mode 100644 minikube/k8s/server-depl.yaml create mode 100644 minikube/server.Dockerfile diff --git a/minikube/README.md b/minikube/README.md index 769350b..d1026a3 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -9,7 +9,7 @@ eval $(minikube -p minikube docker-env) ## Run -`` +``` # main go run main.go @@ -30,18 +30,29 @@ service ServerReflection { } grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 RollService/Roll + +# client +cd client +go run main.go --target 3001 ``` -### Build container image +## Run in k8s / minikube + +Make sure deployment has "imagePullPolicy: Never". ``` -# Point docker to local minikube image repo -eval $(minikube -p minikube docker-env) +kubectl apply -f k8s/main-depl.yaml +kubectl apply -f k8s/server-depl.yaml +kubectl apply -f k8s/ingress.yaml -# builds and pushes to local repo -docker build . -t 0xfe/main +kubectl get pods +kubectl get ingress + +$ curl 192.168.49.2 ``` +## Build + ### Build protos ``` @@ -49,21 +60,37 @@ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=p ``` -### Run container on host +### Build container image ``` -docker run -p 3000:3000 0xfe/main +# If pushing to minikube, point docker to local minikube image repo +eval $(minikube -p minikube docker-env) + +# build protos +cd dice +protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto + +cd .. + +# builds and pushes to local repo +docker build . -f server.Dockerfile -t 0xfe/dice/server +docker build . -f Dockerfile -t 0xfe/dice/main ``` -### Run in k8s / minikube +### Run container on host -Make sure deployment has "imagePullPolicy: Never". +Run these in a separate shell that's connected to the local docker daemon, not the minkube one. ``` -kubectl apply -f main-depl.yaml -kubectl get pods +docker run -p 3000:3000 0xfe/main +docker run -p 3001:3001 0xfe/dice/server + +netstat -nap | grep LIST | grep tcp ``` +If you don't see ports on `netstat`, then unset DOCKER_* env variables. + +# ### Forward ports from outside world to ingress ``` diff --git a/minikube/client/main.go b/minikube/client/main.go index 84ec52b..33e37a0 100644 --- a/minikube/client/main.go +++ b/minikube/client/main.go @@ -3,26 +3,27 @@ package main import ( "0xfe/experiments/minikube/dice" "context" + "flag" "fmt" "io" "log" - "math/rand" - "time" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) +var flagAddress = flag.String("target", "localhost:3001", "server address:port") + func main() { - rand.Seed(time.Now().UnixNano()) - fmt.Printf("hello world: %d\n", rand.Intn(2)) + flag.Parse() + log.Printf("connecting to %s...\n", *flagAddress) var opts []grpc.DialOption opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) - conn, err := grpc.Dial("localhost:3001", opts...) + conn, err := grpc.Dial(*flagAddress, opts...) if err != nil { - log.Fatalf("could not connect to grpc server: %e", err) + log.Fatalf("could not connect to grpc server: %+v", err) } defer conn.Close() @@ -33,7 +34,7 @@ func main() { }) if err != nil { - log.Fatalf("error calling Roll: %e", err) + log.Fatalf("error calling Roll: %+v", err) } } @@ -45,7 +46,7 @@ func main() { getClient, err := client.GetRolls(context.Background(), &dice.GetRollsRequest{}) if err != nil { - log.Fatalf("error calling GetRolls: %e", err) + log.Fatalf("error calling GetRolls: %+v", err) } for { @@ -58,10 +59,12 @@ func main() { } if err != nil { - log.Fatalf("failed receiving message: %e", err) + log.Fatalf("failed receiving message: %+v", err) } fmt.Printf("handle: %v\n", msg.RollerHandle) - fmt.Printf(" rolls: %v\n", msg.Rolls) + for i, roll := range msg.Rolls { + fmt.Printf(" roll %d: %v (%d)\n", i+1, roll.Face, roll.Id) + } } } diff --git a/minikube/k8s/ingress.yaml b/minikube/k8s/ingress.yaml new file mode 100644 index 0000000..d381f70 --- /dev/null +++ b/minikube/k8s/ingress.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: main-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: main-service + port: + number: 3000 + - path: /server + pathType: Prefix + backend: + service: + name: server-service + port: + number: 3001 \ No newline at end of file diff --git a/minikube/main-depl.yaml b/minikube/k8s/main-depl copy.yaml similarity index 57% rename from minikube/main-depl.yaml rename to minikube/k8s/main-depl copy.yaml index c7310a9..731b4ae 100644 --- a/minikube/main-depl.yaml +++ b/minikube/k8s/main-depl copy.yaml @@ -32,22 +32,4 @@ spec: - name: http protocol: TCP port: 3000 - targetPort: 3000 ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: main-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: / -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: main-service - port: - number: 3000 \ No newline at end of file + targetPort: 3000 \ No newline at end of file diff --git a/minikube/k8s/server-depl.yaml b/minikube/k8s/server-depl.yaml new file mode 100644 index 0000000..55fbee1 --- /dev/null +++ b/minikube/k8s/server-depl.yaml @@ -0,0 +1,35 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: server-deployment + labels: + app: server +spec: + replicas: 3 + selector: + matchLabels: + app: server + template: + metadata: + labels: + app: server + spec: + containers: + - name: server + image: 0xfe/dice/server + imagePullPolicy: Never + ports: + - containerPort: 3001 +--- +apiVersion: v1 +kind: Service +metadata: + name: server-service +spec: + selector: + app: server + ports: + - name: http + protocol: TCP + port: 3001 + targetPort: 3001 \ No newline at end of file diff --git a/minikube/server.Dockerfile b/minikube/server.Dockerfile new file mode 100644 index 0000000..6ed1dcf --- /dev/null +++ b/minikube/server.Dockerfile @@ -0,0 +1,27 @@ +FROM golang:1.19 as builder + +# Create and change to the app directory. +WORKDIR /app + +# Copy go.mod and go.sum, then retrieve application dependencies. +# This allows the container build to reuse cached dependencies. +COPY go.* ./ +RUN go mod download + +# Copy local code to the container image. +COPY . ./ + +# Build the binary. +WORKDIR /app/server +RUN CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o main + +# Use the official Alpine image for a lean production container. +# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds +FROM alpine:latest +RUN apk add --no-cache ca-certificates + +# Copy the binary to the production image from the builder stage. +COPY --from=builder /app/server/main /main + +# Run the web service on container startup. +CMD ["/main"] \ No newline at end of file diff --git a/minikube/server/main.go b/minikube/server/main.go index 60966a0..47eec8d 100644 --- a/minikube/server/main.go +++ b/minikube/server/main.go @@ -3,6 +3,7 @@ package main import ( "0xfe/experiments/minikube/dice" "context" + "flag" "fmt" "io" "log" @@ -15,11 +16,12 @@ import ( "google.golang.org/grpc/reflection" ) -const PORT = 3001 +var flagPort = flag.String("port", "3001", "GRPC server port") type DiceServer struct { dice.UnimplementedRollServiceServer table map[string]*dice.RollTable + id int32 mu *sync.Mutex } @@ -33,17 +35,19 @@ func NewDiceServer() *DiceServer { func (s *DiceServer) Roll(ctx context.Context, req *dice.RollRequest) (*dice.RollResponse, error) { handle := req.RollerHandle - log.Printf("rolling for %s\n", handle) defer s.mu.Unlock() s.mu.Lock() + s.id++ + + log.Printf("rolling %d for %s\n", s.id, handle) if t, ok := s.table[handle]; ok { - t.Rolls = append(t.Rolls, &dice.DiceRoll{Id: 1, Face: dice.Face(rand.Intn(2))}) + t.Rolls = append(t.Rolls, &dice.DiceRoll{Id: s.id, Face: dice.Face(rand.Intn(2))}) } else { t := &dice.RollTable{ RollerHandle: handle, Rolls: []*dice.DiceRoll{ - {Id: 0, Face: dice.Face_FACE_TAILS}, + {Id: s.id, Face: dice.Face_FACE_TAILS}, }, } @@ -55,8 +59,10 @@ func (s *DiceServer) Roll(ctx context.Context, req *dice.RollRequest) (*dice.Rol } func (s *DiceServer) GetRolls(req *dice.GetRollsRequest, stream dice.RollService_GetRollsServer) error { - for k, v := range s.table { - log.Printf("returning rolls for %s...\n", k) + defer s.mu.Unlock() + s.mu.Lock() + log.Printf("returning rolls...\n") + for _, v := range s.table { err := stream.SendMsg(v) if err == io.EOF { return nil @@ -66,14 +72,16 @@ func (s *DiceServer) GetRolls(req *dice.GetRollsRequest, stream dice.RollService return err } } + return nil } func main() { + flag.Parse() rand.Seed(time.Now().UnixNano()) - log.Printf("Starting GRPC RollServer on port %d...\n", PORT) + log.Printf("Starting GRPC RollServer on port %s...\n", *flagPort) - lis, err := net.Listen("tcp", fmt.Sprintf(":%d", PORT)) + lis, err := net.Listen("tcp", fmt.Sprintf(":%s", *flagPort)) if err != nil { log.Fatalf("failed to listen: %v", err) } From f50b26756cf5867ffec7a2ca011fdbe188432db0 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 01:07:51 +0000 Subject: [PATCH 098/180] Make gRPC service headless for client-side load balancing. --- minikube/README.md | 9 +++++++++ minikube/k8s/server-depl.yaml | 1 + 2 files changed, 10 insertions(+) diff --git a/minikube/README.md b/minikube/README.md index d1026a3..8ac4d0b 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -51,6 +51,15 @@ kubectl get ingress $ curl 192.168.49.2 ``` +## Debug + +``` +# Run shell in container +$ k get pods +$ k exec -it podname -- /bin/ash +/ # nslookup main-service +``` + ## Build ### Build protos diff --git a/minikube/k8s/server-depl.yaml b/minikube/k8s/server-depl.yaml index 55fbee1..8b62736 100644 --- a/minikube/k8s/server-depl.yaml +++ b/minikube/k8s/server-depl.yaml @@ -26,6 +26,7 @@ kind: Service metadata: name: server-service spec: + clusterIP: None # headless service for gRPC load balancing selector: app: server ports: From e31bc896273493b7c409147e68f1aeb4e1dc867b Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 01:26:28 +0000 Subject: [PATCH 099/180] Add container debugging notes. --- minikube/README.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/minikube/README.md b/minikube/README.md index 8ac4d0b..37ac327 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -54,10 +54,36 @@ $ curl 192.168.49.2 ## Debug ``` -# Run shell in container +# Run shell in new container (first time) +$ k run temppod --image=radial/busyboxplus:curl -it + +# Same thing, but with debian instead +$ k run temppod --image=debian -it +temppod# cat /etc/debian_version +temppod# apt update +temppod# apt install curl +temppod# curl main-sevice:3000 + +# Run shell in temppod +$ k exec temppod -it -- /bin/ash + +# Delete temppod +$ k delete pod temppod + +# Run shell in existing pod $ k get pods $ k exec -it podname -- /bin/ash / # nslookup main-service + +# Run shell on node +$ k get node +$ kubectl debug node/minikube -it --image=ubuntu + +# Logs +$ k logs podname +$ k top pod +$ k top node + ``` ## Build From b939be2c984aad5ced2709d2b611da34b323db45 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 12:55:32 +0000 Subject: [PATCH 100/180] Moved client code to library. --- minikube/README.md | 1 - minikube/client/main.go | 98 +++++++++++++++++++++++++++-------------- 2 files changed, 65 insertions(+), 34 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index 37ac327..18b7103 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -83,7 +83,6 @@ $ kubectl debug node/minikube -it --image=ubuntu $ k logs podname $ k top pod $ k top node - ``` ## Build diff --git a/minikube/client/main.go b/minikube/client/main.go index 33e37a0..a2d72ed 100644 --- a/minikube/client/main.go +++ b/minikube/client/main.go @@ -14,56 +14,88 @@ import ( var flagAddress = flag.String("target", "localhost:3001", "server address:port") -func main() { - flag.Parse() - log.Printf("connecting to %s...\n", *flagAddress) +type Client struct { + target string + client dice.RollServiceClient + conn *grpc.ClientConn +} +func NewClient(target string) *Client { var opts []grpc.DialOption opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) - conn, err := grpc.Dial(*flagAddress, opts...) + conn, err := grpc.Dial(target, opts...) if err != nil { log.Fatalf("could not connect to grpc server: %+v", err) } - defer conn.Close() - client := dice.NewRollServiceClient(conn) - roll := func(handle string) { - _, err := client.Roll(context.Background(), &dice.RollRequest{ - RollerHandle: handle, - }) + return &Client{target, dice.NewRollServiceClient(conn), conn} +} - if err != nil { - log.Fatalf("error calling Roll: %+v", err) - } - } +func (c *Client) Close() { + c.conn.Close() +} - roll("foobar") - roll("foobar") - roll("foobar") - roll("0xfe") - roll("0xfe") +func (c *Client) Roll(handle string) { + _, err := c.client.Roll(context.Background(), &dice.RollRequest{ + RollerHandle: handle, + }) - getClient, err := client.GetRolls(context.Background(), &dice.GetRollsRequest{}) if err != nil { - log.Fatalf("error calling GetRolls: %+v", err) + log.Fatalf("error calling Roll: %+v", err) } +} - for { - var msg dice.RollTable - err := getClient.RecvMsg(&msg) - if err == io.EOF { - getClient.CloseSend() - log.Println("all done") - return - } +func (c *Client) GetRolls() (chan *dice.RollTable, error) { + getClient, err := c.client.GetRolls(context.Background(), &dice.GetRollsRequest{}) + if err != nil { + return nil, fmt.Errorf("error calling GetRolls: %w", err) + } + + ch := make(chan *dice.RollTable) - if err != nil { - log.Fatalf("failed receiving message: %+v", err) + go func() { + for { + var msg dice.RollTable + err := getClient.RecvMsg(&msg) + if err == io.EOF { + getClient.CloseSend() + close(ch) + return + } + + if err != nil { + log.Fatalf("failed receiving message: %+v", err) + } + + ch <- &msg } + }() + + return ch, nil +} + +func main() { + flag.Parse() + log.Printf("connecting to %s...\n", *flagAddress) + + client := NewClient(*flagAddress) + defer client.Close() + + client.Roll("foobar") + client.Roll("foobar") + client.Roll("foobar") + client.Roll("0xfe") + client.Roll("0xfe") + + ch, err := client.GetRolls() + if err != nil { + log.Fatalf("failed: %+v", err) + } - fmt.Printf("handle: %v\n", msg.RollerHandle) - for i, roll := range msg.Rolls { + for rt := range ch { + fmt.Printf("handle: %v\n", rt.RollerHandle) + for i, roll := range rt.Rolls { fmt.Printf(" roll %d: %v (%d)\n", i+1, roll.Face, roll.Id) } } From 2893612dd8f63ec96d11e73fac2bcf3676f20664 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 12:57:59 +0000 Subject: [PATCH 101/180] Moved client tool command to cmd/ --- minikube/client/cmd/main.go | 36 +++++++++++++ minikube/client/main.go | 102 ------------------------------------ 2 files changed, 36 insertions(+), 102 deletions(-) create mode 100644 minikube/client/cmd/main.go delete mode 100644 minikube/client/main.go diff --git a/minikube/client/cmd/main.go b/minikube/client/cmd/main.go new file mode 100644 index 0000000..e72b313 --- /dev/null +++ b/minikube/client/cmd/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "0xfe/experiments/minikube/client" + "flag" + "fmt" + "log" +) + +var flagAddress = flag.String("target", "localhost:3001", "server address:port") + +func main() { + flag.Parse() + log.Printf("connecting to %s...\n", *flagAddress) + + client := client.NewClient(*flagAddress) + defer client.Close() + + client.Roll("foobar") + client.Roll("foobar") + client.Roll("foobar") + client.Roll("0xfe") + client.Roll("0xfe") + + ch, err := client.GetRolls() + if err != nil { + log.Fatalf("failed: %+v", err) + } + + for rt := range ch { + fmt.Printf("handle: %v\n", rt.RollerHandle) + for i, roll := range rt.Rolls { + fmt.Printf(" roll %d: %v (%d)\n", i+1, roll.Face, roll.Id) + } + } +} diff --git a/minikube/client/main.go b/minikube/client/main.go deleted file mode 100644 index a2d72ed..0000000 --- a/minikube/client/main.go +++ /dev/null @@ -1,102 +0,0 @@ -package main - -import ( - "0xfe/experiments/minikube/dice" - "context" - "flag" - "fmt" - "io" - "log" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" -) - -var flagAddress = flag.String("target", "localhost:3001", "server address:port") - -type Client struct { - target string - client dice.RollServiceClient - conn *grpc.ClientConn -} - -func NewClient(target string) *Client { - var opts []grpc.DialOption - opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) - conn, err := grpc.Dial(target, opts...) - - if err != nil { - log.Fatalf("could not connect to grpc server: %+v", err) - } - - return &Client{target, dice.NewRollServiceClient(conn), conn} -} - -func (c *Client) Close() { - c.conn.Close() -} - -func (c *Client) Roll(handle string) { - _, err := c.client.Roll(context.Background(), &dice.RollRequest{ - RollerHandle: handle, - }) - - if err != nil { - log.Fatalf("error calling Roll: %+v", err) - } -} - -func (c *Client) GetRolls() (chan *dice.RollTable, error) { - getClient, err := c.client.GetRolls(context.Background(), &dice.GetRollsRequest{}) - if err != nil { - return nil, fmt.Errorf("error calling GetRolls: %w", err) - } - - ch := make(chan *dice.RollTable) - - go func() { - for { - var msg dice.RollTable - err := getClient.RecvMsg(&msg) - if err == io.EOF { - getClient.CloseSend() - close(ch) - return - } - - if err != nil { - log.Fatalf("failed receiving message: %+v", err) - } - - ch <- &msg - } - }() - - return ch, nil -} - -func main() { - flag.Parse() - log.Printf("connecting to %s...\n", *flagAddress) - - client := NewClient(*flagAddress) - defer client.Close() - - client.Roll("foobar") - client.Roll("foobar") - client.Roll("foobar") - client.Roll("0xfe") - client.Roll("0xfe") - - ch, err := client.GetRolls() - if err != nil { - log.Fatalf("failed: %+v", err) - } - - for rt := range ch { - fmt.Printf("handle: %v\n", rt.RollerHandle) - for i, roll := range rt.Rolls { - fmt.Printf(" roll %d: %v (%d)\n", i+1, roll.Face, roll.Id) - } - } -} From 4884ff9a546e03da8ecaa362b836f4aba253a00a Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 13:21:39 +0000 Subject: [PATCH 102/180] Added client library (missed in last commit.) --- minikube/README.md | 66 ++++++++++++++++++--------------- minikube/client/client.go | 73 +++++++++++++++++++++++++++++++++++++ minikube/client/cmd/main.go | 6 +-- minikube/main.go | 36 +++++++++++++----- 4 files changed, 140 insertions(+), 41 deletions(-) create mode 100644 minikube/client/client.go diff --git a/minikube/README.md b/minikube/README.md index 18b7103..38eb456 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -1,43 +1,41 @@ # HOWTO -## Setup +## Quick Run ``` -minikube start -eval $(minikube -p minikube docker-env) -``` - -## Run - -``` -# main -go run main.go +# Build protobuf stubs (once only, or when you change the proto files) +$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto # server cd server go run main.go -# curl -$ grpcurl -plaintext localhost:3001 describe -RollService is a service: -service RollService { - rpc GetRolls ( .GetRollsRequest ) returns ( stream .GetRollsResponse ); - rpc Roll ( .RollRequest ) returns ( .RollResponse ); -} -grpc.reflection.v1alpha.ServerReflection is a service: -service ServerReflection { - rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse ); -} - -grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 RollService/Roll - # client -cd client +cd client/cmd go run main.go --target 3001 + +# webserver +cd {project root} +go run main.go +curl localhost:3000/roll +curl localhost:3000/getrolls + +# grpcurl +$ grpcurl -plaintext localhost:3001 describe +$ grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 RollService/Roll ``` ## Run in k8s / minikube +### Start Minikube + +``` +minikube start +eval $(minikube -p minikube docker-env) +``` + +### Create deployments and ingress + Make sure deployment has "imagePullPolicy: Never". ``` @@ -46,6 +44,8 @@ kubectl apply -f k8s/server-depl.yaml kubectl apply -f k8s/ingress.yaml kubectl get pods + +# get ingress IP address kubectl get ingress $ curl 192.168.49.2 @@ -89,17 +89,19 @@ $ k top node ### Build protos +If you change the proto file, or this is your first build, then generate the protobuf stubs. + ``` -protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto +$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto +$ go run ... ``` ### Build container image -``` -# If pushing to minikube, point docker to local minikube image repo -eval $(minikube -p minikube docker-env) +Minikube runs its own dockerd and container registry. If you're building to run without minikube then: +``` # build protos cd dice protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto @@ -111,6 +113,12 @@ docker build . -f server.Dockerfile -t 0xfe/dice/server docker build . -f Dockerfile -t 0xfe/dice/main ``` +If pushing to minikube, set the `DOCKER_*` env variables to point to the minikube docker, then build the images again as above. + +``` +eval $(minikube -p minikube docker-env) +``` + ### Run container on host Run these in a separate shell that's connected to the local docker daemon, not the minkube one. diff --git a/minikube/client/client.go b/minikube/client/client.go new file mode 100644 index 0000000..fa3f8bb --- /dev/null +++ b/minikube/client/client.go @@ -0,0 +1,73 @@ +package client + +import ( + "0xfe/experiments/minikube/dice" + "context" + "fmt" + "io" + "log" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +type Client struct { + target string + client dice.RollServiceClient + conn *grpc.ClientConn +} + +func NewClient(target string) *Client { + var opts []grpc.DialOption + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.Dial(target, opts...) + + if err != nil { + log.Fatalf("could not connect to grpc server: %+v", err) + } + + return &Client{target, dice.NewRollServiceClient(conn), conn} +} + +func (c *Client) Close() { + c.conn.Close() +} + +func (c *Client) Roll(handle string) { + _, err := c.client.Roll(context.Background(), &dice.RollRequest{ + RollerHandle: handle, + }) + + if err != nil { + log.Fatalf("error calling Roll: %+v", err) + } +} + +func (c *Client) GetRolls() (chan *dice.RollTable, error) { + getClient, err := c.client.GetRolls(context.Background(), &dice.GetRollsRequest{}) + if err != nil { + return nil, fmt.Errorf("error calling GetRolls: %w", err) + } + + ch := make(chan *dice.RollTable) + + go func() { + for { + var msg dice.RollTable + err := getClient.RecvMsg(&msg) + if err == io.EOF { + getClient.CloseSend() + close(ch) + return + } + + if err != nil { + log.Fatalf("failed receiving message: %+v", err) + } + + ch <- &msg + } + }() + + return ch, nil +} diff --git a/minikube/client/cmd/main.go b/minikube/client/cmd/main.go index e72b313..ab93d0e 100644 --- a/minikube/client/cmd/main.go +++ b/minikube/client/cmd/main.go @@ -7,13 +7,13 @@ import ( "log" ) -var flagAddress = flag.String("target", "localhost:3001", "server address:port") +var flagTarget = flag.String("target", "localhost:3001", "server address:port") func main() { flag.Parse() - log.Printf("connecting to %s...\n", *flagAddress) + log.Printf("connecting to %s...\n", *flagTarget) - client := client.NewClient(*flagAddress) + client := client.NewClient(*flagTarget) defer client.Close() client.Roll("foobar") diff --git a/minikube/main.go b/minikube/main.go index 281eaa5..04dbfc5 100644 --- a/minikube/main.go +++ b/minikube/main.go @@ -1,26 +1,44 @@ package main import ( - "0xfe/experiments/minikube/dice" + "0xfe/experiments/minikube/client" + "flag" "fmt" - "html" "log" "net/http" ) -const PORT = 3000 +var flagPort = flag.Int("port", 3000, "server address:port") +var flagTarget = flag.String("target", "localhost:3001", "server address:port") func main() { - log.Printf("Starting webserver on port %d...\n", PORT) - face := dice.Face(dice.Face_FACE_HEADS) + flag.Parse() + log.Printf("connecting to dice gRPC server at %s...\n", *flagTarget) - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) + client := client.NewClient(*flagTarget) + defer client.Close() + + http.HandleFunc("/getrolls", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + ch, err := client.GetRolls() + if err != nil { + log.Fatalf("failed: %+v", err) + } + + for rt := range ch { + fmt.Fprintf(w, "handle: %v\n", rt.RollerHandle) + for i, roll := range rt.Rolls { + fmt.Fprintf(w, " roll %d: %v (%d)\n", i+1, roll.Face, roll.Id) + } + } }) http.HandleFunc("/roll", func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Roll: %d", face) + w.WriteHeader(http.StatusOK) + client.Roll("foobar") + fmt.Fprintf(w, "Rolled\n") }) - log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", PORT), nil)) + log.Printf("starting webserver on port %d...\n", *flagPort) + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *flagPort), nil)) } From 7de5eb596c6cad9e1b1aa6004020fccf24d96f72 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 13:27:04 +0000 Subject: [PATCH 103/180] Added more docs. --- minikube/README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/minikube/README.md b/minikube/README.md index 38eb456..652f543 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -1,4 +1,20 @@ -# HOWTO +# Dice Roll Experiment + +This repo implements an end-to-end web and commandline app with a gRPC backend running on k8s. Uses: + +- Go 1.19 +- gRPC / Protobuf +- Docker +- Minikube +- nginx Ingress +- iptables rules for exposing minikube bridge network to the outside world + +Components: + +- `server/` - GRPC server binary. Built with `server.Dockerfile`. +- `client/` - GRPC client library. + - `client/cmd` - Commandline tool that uses the client library to talk to the server +- `main.go` - Web server that talks to the gRPC server. Exposes `/roll` and `/getrolls` ## Quick Run From ff6c52cd1e38945ed7d3fc50325f2a2a2a36bbac Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 13:35:16 +0000 Subject: [PATCH 104/180] Added more docs. --- minikube/README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index 652f543..3f6a0ee 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -18,6 +18,8 @@ Components: ## Quick Run +Make sure you have the gRPC/protobuf dependencies. See the "build" section below. + ``` # Build protobuf stubs (once only, or when you change the proto files) $ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto @@ -103,14 +105,29 @@ $ k top node ## Build -### Build protos +### Install Protobuf and gRPC dependencies If you change the proto file, or this is your first build, then generate the protobuf stubs. ``` +# Install dependencies +$ apt install -y protobuf-compiler +$ protoc --version # Ensure compiler version is 3+ + +# Install proto and grpc for Go +$ go get -u google.golang.org/protobuf/cmd/protoc-gen-go +$ go install google.golang.org/protobuf/cmd/protoc-gen-go +$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest +$ go get google.golang.org/grpc + +# grpcurl utility +$ go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest + +# Build protos $ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto -$ go run ... +# Run server +$ go run server/main.go ``` ### Build container image From 6aaa1c0f9c141e91c20f859c41b2a020cfde154e Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 13:37:34 +0000 Subject: [PATCH 105/180] Renamed depl file. --- minikube/README.md | 4 ++-- minikube/k8s/{main-depl copy.yaml => main-depl.yaml} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename minikube/k8s/{main-depl copy.yaml => main-depl.yaml} (100%) diff --git a/minikube/README.md b/minikube/README.md index 3f6a0ee..67ed419 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -1,6 +1,6 @@ -# Dice Roll Experiment +# Minikube Experiment -This repo implements an end-to-end web and commandline app with a gRPC backend running on k8s. Uses: +This repo implements an end-to-end web and commandline "diceroll app" with a gRPC backend running on k8s. Uses: - Go 1.19 - gRPC / Protobuf diff --git a/minikube/k8s/main-depl copy.yaml b/minikube/k8s/main-depl.yaml similarity index 100% rename from minikube/k8s/main-depl copy.yaml rename to minikube/k8s/main-depl.yaml From a0c9ba674b747ecdbe94903a970e77bd75bc54a8 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 17:10:14 +0000 Subject: [PATCH 106/180] Update webserver Dockerfile and deployment. --- minikube/.gitignore | 1 - minikube/Dockerfile | 6 + minikube/README.md | 2 +- minikube/dice/dice.pb.go | 455 ++++++++++++++++++++++++++++++++++ minikube/dice/dice_grpc.pb.go | 169 +++++++++++++ minikube/k8s/main-depl.yaml | 5 +- minikube/main.go | 10 +- minikube/server/main.go | 4 +- 8 files changed, 645 insertions(+), 7 deletions(-) create mode 100644 minikube/dice/dice.pb.go create mode 100644 minikube/dice/dice_grpc.pb.go diff --git a/minikube/.gitignore b/minikube/.gitignore index 71fc271..ba2906d 100644 --- a/minikube/.gitignore +++ b/minikube/.gitignore @@ -1,2 +1 @@ -*.pb.go main diff --git a/minikube/Dockerfile b/minikube/Dockerfile index c04d654..fb0156f 100644 --- a/minikube/Dockerfile +++ b/minikube/Dockerfile @@ -22,5 +22,11 @@ RUN apk add --no-cache ca-certificates # Copy the binary to the production image from the builder stage. COPY --from=builder /app/main /main +# Defaults +ARG DICE_GRPC_TARGET="server-service:3001" + +# Env overrides +ENV DICE_GRPC_TARGET=${DICE_GRPC_TARGET} + # Run the web service on container startup. CMD ["/main"] \ No newline at end of file diff --git a/minikube/README.md b/minikube/README.md index 67ed419..6b46857 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -157,8 +157,8 @@ eval $(minikube -p minikube docker-env) Run these in a separate shell that's connected to the local docker daemon, not the minkube one. ``` -docker run -p 3000:3000 0xfe/main docker run -p 3001:3001 0xfe/dice/server +docker run -e DICE_GRPC_TARGET=localhost:3001 -p 3000:3000 0xfe/dice/main netstat -nap | grep LIST | grep tcp ``` diff --git a/minikube/dice/dice.pb.go b/minikube/dice/dice.pb.go new file mode 100644 index 0000000..e45e8ed --- /dev/null +++ b/minikube/dice/dice.pb.go @@ -0,0 +1,455 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.12.4 +// source: dice.proto + +package dice + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Face int32 + +const ( + Face_FACE_HEADS Face = 0 + Face_FACE_TAILS Face = 1 +) + +// Enum value maps for Face. +var ( + Face_name = map[int32]string{ + 0: "FACE_HEADS", + 1: "FACE_TAILS", + } + Face_value = map[string]int32{ + "FACE_HEADS": 0, + "FACE_TAILS": 1, + } +) + +func (x Face) Enum() *Face { + p := new(Face) + *p = x + return p +} + +func (x Face) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Face) Descriptor() protoreflect.EnumDescriptor { + return file_dice_proto_enumTypes[0].Descriptor() +} + +func (Face) Type() protoreflect.EnumType { + return &file_dice_proto_enumTypes[0] +} + +func (x Face) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Face.Descriptor instead. +func (Face) EnumDescriptor() ([]byte, []int) { + return file_dice_proto_rawDescGZIP(), []int{0} +} + +type DiceRoll struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Face Face `protobuf:"varint,2,opt,name=face,proto3,enum=Face" json:"face,omitempty"` +} + +func (x *DiceRoll) Reset() { + *x = DiceRoll{} + if protoimpl.UnsafeEnabled { + mi := &file_dice_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DiceRoll) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiceRoll) ProtoMessage() {} + +func (x *DiceRoll) ProtoReflect() protoreflect.Message { + mi := &file_dice_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DiceRoll.ProtoReflect.Descriptor instead. +func (*DiceRoll) Descriptor() ([]byte, []int) { + return file_dice_proto_rawDescGZIP(), []int{0} +} + +func (x *DiceRoll) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *DiceRoll) GetFace() Face { + if x != nil { + return x.Face + } + return Face_FACE_HEADS +} + +type RollTable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RollerHandle string `protobuf:"bytes,1,opt,name=roller_handle,json=rollerHandle,proto3" json:"roller_handle,omitempty"` + Rolls []*DiceRoll `protobuf:"bytes,2,rep,name=rolls,proto3" json:"rolls,omitempty"` +} + +func (x *RollTable) Reset() { + *x = RollTable{} + if protoimpl.UnsafeEnabled { + mi := &file_dice_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RollTable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RollTable) ProtoMessage() {} + +func (x *RollTable) ProtoReflect() protoreflect.Message { + mi := &file_dice_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RollTable.ProtoReflect.Descriptor instead. +func (*RollTable) Descriptor() ([]byte, []int) { + return file_dice_proto_rawDescGZIP(), []int{1} +} + +func (x *RollTable) GetRollerHandle() string { + if x != nil { + return x.RollerHandle + } + return "" +} + +func (x *RollTable) GetRolls() []*DiceRoll { + if x != nil { + return x.Rolls + } + return nil +} + +type RollRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RollerHandle string `protobuf:"bytes,1,opt,name=roller_handle,json=rollerHandle,proto3" json:"roller_handle,omitempty"` +} + +func (x *RollRequest) Reset() { + *x = RollRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dice_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RollRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RollRequest) ProtoMessage() {} + +func (x *RollRequest) ProtoReflect() protoreflect.Message { + mi := &file_dice_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RollRequest.ProtoReflect.Descriptor instead. +func (*RollRequest) Descriptor() ([]byte, []int) { + return file_dice_proto_rawDescGZIP(), []int{2} +} + +func (x *RollRequest) GetRollerHandle() string { + if x != nil { + return x.RollerHandle + } + return "" +} + +type RollResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RollResponse) Reset() { + *x = RollResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_dice_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RollResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RollResponse) ProtoMessage() {} + +func (x *RollResponse) ProtoReflect() protoreflect.Message { + mi := &file_dice_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RollResponse.ProtoReflect.Descriptor instead. +func (*RollResponse) Descriptor() ([]byte, []int) { + return file_dice_proto_rawDescGZIP(), []int{3} +} + +type GetRollsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetRollsRequest) Reset() { + *x = GetRollsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_dice_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRollsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRollsRequest) ProtoMessage() {} + +func (x *GetRollsRequest) ProtoReflect() protoreflect.Message { + mi := &file_dice_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRollsRequest.ProtoReflect.Descriptor instead. +func (*GetRollsRequest) Descriptor() ([]byte, []int) { + return file_dice_proto_rawDescGZIP(), []int{4} +} + +var File_dice_proto protoreflect.FileDescriptor + +var file_dice_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x64, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x35, 0x0a, 0x08, + 0x44, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x66, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x05, 0x2e, 0x46, 0x61, 0x63, 0x65, 0x52, 0x04, 0x66, + 0x61, 0x63, 0x65, 0x22, 0x51, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x48, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x44, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x6c, 0x52, + 0x05, 0x72, 0x6f, 0x6c, 0x6c, 0x73, 0x22, 0x32, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x0e, 0x0a, 0x0c, 0x52, 0x6f, + 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x26, 0x0a, + 0x04, 0x46, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x48, 0x45, + 0x41, 0x44, 0x53, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x41, + 0x49, 0x4c, 0x53, 0x10, 0x01, 0x32, 0x5e, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x6c, 0x12, 0x0c, 0x2e, 0x52, + 0x6f, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x52, 0x6f, 0x6c, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x6c, 0x73, 0x12, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x30, 0x01, 0x42, 0x20, 0x5a, 0x1e, 0x30, 0x78, 0x66, 0x65, 0x2f, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x69, 0x6e, 0x69, 0x6b, 0x75, + 0x62, 0x65, 0x2f, 0x64, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_dice_proto_rawDescOnce sync.Once + file_dice_proto_rawDescData = file_dice_proto_rawDesc +) + +func file_dice_proto_rawDescGZIP() []byte { + file_dice_proto_rawDescOnce.Do(func() { + file_dice_proto_rawDescData = protoimpl.X.CompressGZIP(file_dice_proto_rawDescData) + }) + return file_dice_proto_rawDescData +} + +var file_dice_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_dice_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_dice_proto_goTypes = []interface{}{ + (Face)(0), // 0: Face + (*DiceRoll)(nil), // 1: DiceRoll + (*RollTable)(nil), // 2: RollTable + (*RollRequest)(nil), // 3: RollRequest + (*RollResponse)(nil), // 4: RollResponse + (*GetRollsRequest)(nil), // 5: GetRollsRequest +} +var file_dice_proto_depIdxs = []int32{ + 0, // 0: DiceRoll.face:type_name -> Face + 1, // 1: RollTable.rolls:type_name -> DiceRoll + 3, // 2: RollService.Roll:input_type -> RollRequest + 5, // 3: RollService.GetRolls:input_type -> GetRollsRequest + 4, // 4: RollService.Roll:output_type -> RollResponse + 2, // 5: RollService.GetRolls:output_type -> RollTable + 4, // [4:6] is the sub-list for method output_type + 2, // [2:4] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_dice_proto_init() } +func file_dice_proto_init() { + if File_dice_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_dice_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DiceRoll); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dice_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RollTable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dice_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RollRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dice_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RollResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_dice_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRollsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_dice_proto_rawDesc, + NumEnums: 1, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_dice_proto_goTypes, + DependencyIndexes: file_dice_proto_depIdxs, + EnumInfos: file_dice_proto_enumTypes, + MessageInfos: file_dice_proto_msgTypes, + }.Build() + File_dice_proto = out.File + file_dice_proto_rawDesc = nil + file_dice_proto_goTypes = nil + file_dice_proto_depIdxs = nil +} diff --git a/minikube/dice/dice_grpc.pb.go b/minikube/dice/dice_grpc.pb.go new file mode 100644 index 0000000..1ae8055 --- /dev/null +++ b/minikube/dice/dice_grpc.pb.go @@ -0,0 +1,169 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.12.4 +// source: dice.proto + +package dice + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// RollServiceClient is the client API for RollService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type RollServiceClient interface { + Roll(ctx context.Context, in *RollRequest, opts ...grpc.CallOption) (*RollResponse, error) + GetRolls(ctx context.Context, in *GetRollsRequest, opts ...grpc.CallOption) (RollService_GetRollsClient, error) +} + +type rollServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewRollServiceClient(cc grpc.ClientConnInterface) RollServiceClient { + return &rollServiceClient{cc} +} + +func (c *rollServiceClient) Roll(ctx context.Context, in *RollRequest, opts ...grpc.CallOption) (*RollResponse, error) { + out := new(RollResponse) + err := c.cc.Invoke(ctx, "/RollService/Roll", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *rollServiceClient) GetRolls(ctx context.Context, in *GetRollsRequest, opts ...grpc.CallOption) (RollService_GetRollsClient, error) { + stream, err := c.cc.NewStream(ctx, &RollService_ServiceDesc.Streams[0], "/RollService/GetRolls", opts...) + if err != nil { + return nil, err + } + x := &rollServiceGetRollsClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type RollService_GetRollsClient interface { + Recv() (*RollTable, error) + grpc.ClientStream +} + +type rollServiceGetRollsClient struct { + grpc.ClientStream +} + +func (x *rollServiceGetRollsClient) Recv() (*RollTable, error) { + m := new(RollTable) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// RollServiceServer is the server API for RollService service. +// All implementations must embed UnimplementedRollServiceServer +// for forward compatibility +type RollServiceServer interface { + Roll(context.Context, *RollRequest) (*RollResponse, error) + GetRolls(*GetRollsRequest, RollService_GetRollsServer) error + mustEmbedUnimplementedRollServiceServer() +} + +// UnimplementedRollServiceServer must be embedded to have forward compatible implementations. +type UnimplementedRollServiceServer struct { +} + +func (UnimplementedRollServiceServer) Roll(context.Context, *RollRequest) (*RollResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Roll not implemented") +} +func (UnimplementedRollServiceServer) GetRolls(*GetRollsRequest, RollService_GetRollsServer) error { + return status.Errorf(codes.Unimplemented, "method GetRolls not implemented") +} +func (UnimplementedRollServiceServer) mustEmbedUnimplementedRollServiceServer() {} + +// UnsafeRollServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RollServiceServer will +// result in compilation errors. +type UnsafeRollServiceServer interface { + mustEmbedUnimplementedRollServiceServer() +} + +func RegisterRollServiceServer(s grpc.ServiceRegistrar, srv RollServiceServer) { + s.RegisterService(&RollService_ServiceDesc, srv) +} + +func _RollService_Roll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RollRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RollServiceServer).Roll(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/RollService/Roll", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RollServiceServer).Roll(ctx, req.(*RollRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RollService_GetRolls_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(GetRollsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(RollServiceServer).GetRolls(m, &rollServiceGetRollsServer{stream}) +} + +type RollService_GetRollsServer interface { + Send(*RollTable) error + grpc.ServerStream +} + +type rollServiceGetRollsServer struct { + grpc.ServerStream +} + +func (x *rollServiceGetRollsServer) Send(m *RollTable) error { + return x.ServerStream.SendMsg(m) +} + +// RollService_ServiceDesc is the grpc.ServiceDesc for RollService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RollService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "RollService", + HandlerType: (*RollServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Roll", + Handler: _RollService_Roll_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "GetRolls", + Handler: _RollService_GetRolls_Handler, + ServerStreams: true, + }, + }, + Metadata: "dice.proto", +} diff --git a/minikube/k8s/main-depl.yaml b/minikube/k8s/main-depl.yaml index 731b4ae..2691272 100644 --- a/minikube/k8s/main-depl.yaml +++ b/minikube/k8s/main-depl.yaml @@ -16,8 +16,11 @@ spec: spec: containers: - name: main - image: 0xfe/main + image: 0xfe/dice/main imagePullPolicy: Never + env: + - name: DICE_GRPC_TARGET + value: "server-service:3001" ports: - containerPort: 3000 --- diff --git a/minikube/main.go b/minikube/main.go index 04dbfc5..49b7a68 100644 --- a/minikube/main.go +++ b/minikube/main.go @@ -6,6 +6,7 @@ import ( "fmt" "log" "net/http" + "os" ) var flagPort = flag.Int("port", 3000, "server address:port") @@ -13,9 +14,14 @@ var flagTarget = flag.String("target", "localhost:3001", "server address:port") func main() { flag.Parse() - log.Printf("connecting to dice gRPC server at %s...\n", *flagTarget) + target := os.Getenv("DICE_GRPC_TARGET") + if target == "" { + target = *flagTarget + } - client := client.NewClient(*flagTarget) + log.Printf("connecting to dice gRPC server at %s...\n", target) + + client := client.NewClient(target) defer client.Close() http.HandleFunc("/getrolls", func(w http.ResponseWriter, r *http.Request) { diff --git a/minikube/server/main.go b/minikube/server/main.go index 47eec8d..32496d6 100644 --- a/minikube/server/main.go +++ b/minikube/server/main.go @@ -23,13 +23,13 @@ type DiceServer struct { table map[string]*dice.RollTable id int32 - mu *sync.Mutex + // protects table + mu sync.Mutex } func NewDiceServer() *DiceServer { return &DiceServer{ table: make(map[string]*dice.RollTable), - mu: &sync.Mutex{}, } } From 640aa469b1f24f8e7fb26fe43130f6fa905774cf Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 17:11:14 +0000 Subject: [PATCH 107/180] Updated readme. --- minikube/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index 6b46857..c353158 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -18,12 +18,7 @@ Components: ## Quick Run -Make sure you have the gRPC/protobuf dependencies. See the "build" section below. - ``` -# Build protobuf stubs (once only, or when you change the proto files) -$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto - # server cd server go run main.go From 49ef2a1afac1dc99a6617a2c36ff5d3538993427 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 22:29:04 +0000 Subject: [PATCH 108/180] Add working envoy deployment and gRPC configuration. --- minikube/.gitignore | 1 + minikube/README.md | 11 ++++++- minikube/k8s/config/envoy.yaml | 56 ++++++++++++++++++++++++++++++++++ minikube/k8s/envoy-depl.yaml | 40 ++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 minikube/k8s/config/envoy.yaml create mode 100644 minikube/k8s/envoy-depl.yaml diff --git a/minikube/.gitignore b/minikube/.gitignore index ba2906d..9822416 100644 --- a/minikube/.gitignore +++ b/minikube/.gitignore @@ -1 +1,2 @@ main +tmp diff --git a/minikube/README.md b/minikube/README.md index c353158..26e0e29 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -56,17 +56,26 @@ kubectl apply -f k8s/main-depl.yaml kubectl apply -f k8s/server-depl.yaml kubectl apply -f k8s/ingress.yaml +k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml +k describe configmap envoy-conf + kubectl get pods # get ingress IP address kubectl get ingress -$ curl 192.168.49.2 +$ curl 192.168.49.2/roll + +# note: the backend is loadbalanced, so the response depends on which backend is hit +$ curl 192.168.49.2/getrolls ``` ## Debug ``` +# Restart deployment +kubectl rollout restart deployment my-deployment + # Run shell in new container (first time) $ k run temppod --image=radial/busyboxplus:curl -it diff --git a/minikube/k8s/config/envoy.yaml b/minikube/k8s/config/envoy.yaml new file mode 100644 index 0000000..85ec93f --- /dev/null +++ b/minikube/k8s/config/envoy.yaml @@ -0,0 +1,56 @@ +static_resources: + listeners: + - name: listener_0 + address: + socket_address: + address: 0.0.0.0 + port_value: 8443 + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + access_log: + - name: envoy.access_loggers.stdout + typed_config: + "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog + codec_type: AUTO + stat_prefix: ingress_https + route_config: + name: local_route + virtual_hosts: + - name: https + domains: + - "*" + routes: + - match: + prefix: "/" + route: + cluster: server-grpc + max_grpc_timeout: 2s + http_filters: + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + clusters: + - name: server-grpc + connect_timeout: 0.5s + type: STRICT_DNS + dns_lookup_family: V4_ONLY + lb_policy: ROUND_ROBIN + http2_protocol_options: {} + load_assignment: + cluster_name: server-grpc + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: server-service + port_value: 12345 +admin: + access_log_path: /dev/stdout + address: + socket_address: + address: 127.0.0.1 + port_value: 8090 \ No newline at end of file diff --git a/minikube/k8s/envoy-depl.yaml b/minikube/k8s/envoy-depl.yaml new file mode 100644 index 0000000..8dc4e69 --- /dev/null +++ b/minikube/k8s/envoy-depl.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: envoy-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: envoy + template: + metadata: + labels: + app: envoy + spec: + containers: + - name: envoy + image: envoyproxy/envoy-dev + ports: + - name: https + containerPort: 8443 + volumeMounts: + - name: config + mountPath: /etc/envoy + volumes: + - name: config + configMap: + name: envoy-conf +--- +apiVersion: v1 +kind: Service +metadata: + name: envoy +spec: + selector: + app: envoy + ports: + - name: https + protocol: TCP + port: 8443 + targetPort: 8443 \ No newline at end of file From a38183b21a113e50c5995ead032dc05d1e08374f Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 23:18:14 +0000 Subject: [PATCH 109/180] Working gRPC through envoy! --- minikube/k8s/config/envoy.yaml | 2 +- minikube/k8s/main-depl.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/minikube/k8s/config/envoy.yaml b/minikube/k8s/config/envoy.yaml index 85ec93f..b04f520 100644 --- a/minikube/k8s/config/envoy.yaml +++ b/minikube/k8s/config/envoy.yaml @@ -47,7 +47,7 @@ static_resources: address: socket_address: address: server-service - port_value: 12345 + port_value: 3001 admin: access_log_path: /dev/stdout address: diff --git a/minikube/k8s/main-depl.yaml b/minikube/k8s/main-depl.yaml index 2691272..028ecbf 100644 --- a/minikube/k8s/main-depl.yaml +++ b/minikube/k8s/main-depl.yaml @@ -20,7 +20,7 @@ spec: imagePullPolicy: Never env: - name: DICE_GRPC_TARGET - value: "server-service:3001" + value: "envoy:8443" ports: - containerPort: 3000 --- From ccdd5bc537d95e1872f278a8ec3c93ed474dc806 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 13 Nov 2022 23:21:13 +0000 Subject: [PATCH 110/180] Update README with envoy notes. --- minikube/README.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index 26e0e29..0ac3c95 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -7,6 +7,7 @@ This repo implements an end-to-end web and commandline "diceroll app" with a gRP - Docker - Minikube - nginx Ingress +- Envoy for gRPC LB - iptables rules for exposing minikube bridge network to the outside world Components: @@ -52,18 +53,23 @@ eval $(minikube -p minikube docker-env) Make sure deployment has "imagePullPolicy: Never". ``` +# Push envoy configs +k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml +k describe configmap envoy-conf + +# Start pods kubectl apply -f k8s/main-depl.yaml kubectl apply -f k8s/server-depl.yaml +kubectl apply -f k8s/envoy-depl.yaml kubectl apply -f k8s/ingress.yaml -k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml -k describe configmap envoy-conf - +# Watch pods kubectl get pods -# get ingress IP address +# Get ingress IP address kubectl get ingress +# Test $ curl 192.168.49.2/roll # note: the backend is loadbalanced, so the response depends on which backend is hit @@ -74,7 +80,12 @@ $ curl 192.168.49.2/getrolls ``` # Restart deployment -kubectl rollout restart deployment my-deployment +kubectl rollout restart deployment envoy-deployment + +# Change configmap +k delete configmap envoy-conf +k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml +kubectl rollout restart deployment envoy-deployment # Run shell in new container (first time) $ k run temppod --image=radial/busyboxplus:curl -it From 4e14e7352b7de4d0b94d97264b33342895bab037 Mon Sep 17 00:00:00 2001 From: Mo Date: Mon, 14 Nov 2022 13:04:40 +0000 Subject: [PATCH 111/180] Use CFSSL to generate TLS certs for ingress. --- minikube/README.md | 37 +- minikube/go.mod | 37 +- minikube/go.sum | 1871 +++++++++++++++++++++++++++++ minikube/tls/.gitignore | 2 + minikube/tls/README.md | 84 ++ minikube/tls/ca.json | 16 + minikube/tls/cfssl.json | 54 + minikube/tls/ingress_host.json | 21 + minikube/tls/intermediate-ca.json | 19 + 9 files changed, 2105 insertions(+), 36 deletions(-) create mode 100644 minikube/tls/.gitignore create mode 100644 minikube/tls/README.md create mode 100644 minikube/tls/ca.json create mode 100644 minikube/tls/cfssl.json create mode 100644 minikube/tls/ingress_host.json create mode 100644 minikube/tls/intermediate-ca.json diff --git a/minikube/README.md b/minikube/README.md index 0ac3c95..fa9a3f6 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -180,7 +180,8 @@ netstat -nap | grep LIST | grep tcp If you don't see ports on `netstat`, then unset DOCKER_* env variables. -# +## Networking + ### Forward ports from outside world to ingress ``` @@ -214,38 +215,4 @@ sudo iptables -L -t nat --line # delete rule 1 in chain OUTPUT sudo iptables -D OUTPUT 1 -``` - -# OLD STUFF - -``` - -###sudo iptables -t nat -A POSTROUTING -j MASQUERADE - -?? -sudo iptables -t nat -I PREROUTING -p tcp -i ens4 --dport 80 -j DNAT --to 192.168.49.2 -sudo iptables -t nat -I POSTROUTING -p tcp -o ens4 --dport 80 -d 192.168.49.2 -j SNAT --to 10.240.0.3 - - -### more specific, but does not work -sudo iptables -t nat -A PREROUTING -p tcp -d 10.240.0.3 --dport 80 -j DNAT --to-destination 192.168.49.2:80 -sudo iptables -t nat -A PREROUTING -p tcp -d 34.74.108.195 --dport 80 -jDNAT --to-destination 192.168.49.2:80 - -sudo iptables -A FORWARD -i ens4 -o br-f998b9bf1ee5 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -sudo iptables -A FORWARD -i ens4 -o br-f998b9bf1ee5 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -sudo iptables -A FORWARD -i br-f998b9bf1ee5 -o ens4 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - -# if filtered -sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT -sudo iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT -sudo iptables -I FORWARD -p tcp -d 192.168.49.2 --dport 80 -j ACCEPT -sudo iptables -I FORWARD -p tcp -d 10.240.0.3 --dport 80 -j ACCEPT - -iptables -t nat -A POSTROUTING -o ens4 -p tcp -d 192.168.49.2 --dport 80 -j RETURN - -sudo tcpdump -i ens4 port 80 - -iptables -t nat -A PREROUTING -p tcp -m tcp -i ens0 --dport 80 -j REDIRECT --to-ports 8080 - - ``` \ No newline at end of file diff --git a/minikube/go.mod b/minikube/go.mod index cfb2112..c75d949 100644 --- a/minikube/go.mod +++ b/minikube/go.mod @@ -3,7 +3,42 @@ module 0xfe/experiments/minikube go 1.15 require ( - golang.org/x/tools v0.2.0 // indirect + github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect + github.com/cloudflare/cfssl v1.6.3 // indirect + github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect + github.com/cncf/xds/go v0.0.0-20220520190051-1e77728a1eaa // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/envoyproxy/go-control-plane v0.10.3 // indirect + github.com/envoyproxy/protoc-gen-validate v0.9.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/google/certificate-transparency-go v1.1.4 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/jhump/protoreflect v1.14.0 // indirect + github.com/jmhodges/clock v1.2.0 // indirect + github.com/jmoiron/sqlx v1.3.5 // indirect + github.com/kisielk/sqlstruct v0.0.0-20210630145711-dae28ed37023 // indirect + github.com/lib/pq v1.10.7 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/rivo/uniseg v0.4.2 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/cobra v1.6.1 // indirect + github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 // indirect + github.com/urfave/cli v1.22.10 // indirect + github.com/weppos/publicsuffix-go v0.20.0 // indirect + github.com/zmap/zcrypto v0.0.0-20220803033029-557f3e4940be // indirect + github.com/zmap/zlint/v3 v3.4.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/zap v1.23.0 // indirect + golang.org/x/crypto v0.2.0 // indirect + golang.org/x/oauth2 v0.2.0 // indirect + golang.org/x/time v0.2.0 // indirect + golang.org/x/tools v0.3.0 // indirect + google.golang.org/genproto v0.0.0-20221111202108-142d8a6fa32e // indirect google.golang.org/grpc v1.50.1 // indirect google.golang.org/protobuf v1.28.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/minikube/go.sum b/minikube/go.sum index a1ce9c9..79d07c5 100644 --- a/minikube/go.sum +++ b/minikube/go.sum @@ -1,29 +1,651 @@ +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U= +bitbucket.org/liamstask/goose v0.0.0-20150115234039-8488cc47d90c/go.mod h1:hSVuE3qU7grINVSwrmzHfpg9k87ALBk+XaualNyUzI4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.17.0/go.mod h1:pUlbH9kNOnp6ayShsqKLB6w49z14ILAaq0hrjh93Ajw= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.5.0/go.mod h1:RGUNM0FFAVkYA94BLTxoXBgfIyY1Riq67TwaBXH0lwc= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.11.0-beta.schemas/go.mod h1:llNLsvx+RnsZJoY481TzC1XcdB2hWdR6gSWM5O4vgfs= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.17.0/go.mod h1:+17t2ixFwRG4lWRwE+5kipDR9Ef07Jkmc8z0IbMDKUs= +cloud.google.com/go/spanner v1.36.0/go.mod h1:RKVKnqXxTMDuBPAsjxohvcSTH6qiRB6E0oMljFIKPr0= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.15.0/go.mod h1:mjjQMoxxyGH7Jr8K5qrx6N2O0AHsczI61sMNn03GIZI= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/exporter/stackdriver v0.13.12/go.mod h1:mmxnWlrvrFdpiOHOhxBaVi1rkc0WOqhgfknj4Yg0SeQ= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/beam v2.28.0+incompatible/go.mod h1:/8NX3Qi8vGstDLLaeaU7+lzVEu/ACaQhYjeefzQ0y1o= +github.com/apache/beam/sdks/v2 v2.0.0-20211012030016-ef4364519c94/go.mod h1:/kOom7hCyHVzAC/Z7HbZywkZZv6ywF+wb4CvgDVdcB8= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/backoff v0.0.0-20161212185259-647f3cdfc87a/go.mod h1:rzgs2ZOiguV6/NpiDgADjRLPNyZlApIWxKpkT+X8SdY= +github.com/cloudflare/cfssl v1.6.3 h1:hDhRaGQN55nh0510/7A5QBN3xLoDz/M7nQX80icXvzs= +github.com/cloudflare/cfssl v1.6.3/go.mod h1:Kq0iHKY8sm2klDeQ2Ci/FI+6QdBGuyPWodgTJFLrXIw= +github.com/cloudflare/redoctober v0.0.0-20201013214028-99c99a8e7544/go.mod h1:6Se34jNoqrd8bTxrmJB2Bg2aoZ2CdSXonils9NsiNgo= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210322005330-6414d713912e/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220520190051-1e77728a1eaa h1:B/lvg4tQ5hfFZd4V2hcSfFVfUvAK6GSFKxIIzwnkv8g= +github.com/cncf/xds/go v0.0.0-20220520190051-1e77728a1eaa/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3 h1:xdCVXxEe0Y3FQith+0cj2irwZudqGYvecuLB1HtdexY= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.1/go.mod h1:txg5va2Qkip90uYoSKH+nkAAmXrb2j3iq4FLwdrCbXQ= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.0 h1:wyv+mWIshClA4g6hTlKD9xb6fiNAnDu3+8qYf7KSuSE= +github.com/envoyproxy/protoc-gen-validate v0.9.0/go.mod h1:aUb/JIPT9p8VQ1hMxCrB3/NZSvKoF7fPIE1ULgCIVz0= +github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullstorydev/grpcurl v1.8.0/go.mod h1:Mn2jWbdMrQGJQ8UD62uNyMumT2acsZUCkZIqFxsQf1o= +github.com/fullstorydev/grpcurl v1.8.1/go.mod h1:3BWhvHZwNO7iLXaQlojdg5NA6SxUDePli4ecpK1N7gw= +github.com/fullstorydev/grpcurl v1.8.7 h1:xJWosq3BQovQ4QrdPO72OrPiWuGgEsxY8ldYsJbPrqI= +github.com/fullstorydev/grpcurl v1.8.7/go.mod h1:pVtM4qe3CMoLaIzYS8uvTuDj2jVYmXqMUkZeijnXp/E= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -33,103 +655,1300 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.2-0.20210422104406-9f33727a7a18/go.mod h1:6CKh9dscIRoqc2kC6YUFICHZMT9NrClyPrRVFrdw1QQ= +github.com/google/certificate-transparency-go v1.1.2-0.20210511102531-373a877eec92/go.mod h1:kXWPsHVPSKVuxPPG69BRtumCbAW537FydV/GH89oBhM= +github.com/google/certificate-transparency-go v1.1.4 h1:hCyXHDbtqlr/lMXU0D4WgbalXL0Zk4dSWWMbPV8VrqY= +github.com/google/certificate-transparency-go v1.1.4/go.mod h1:D6lvbfwckhNrbM9WVl1EVeMOyzC19mpIjMOI4nxBHtQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-licenses v0.0.0-20210329231322-ce1d9163b77d/go.mod h1:+TYOmkVoJOpwnS0wfdsJCV9CoD5nJYsHoFk/0CrTK4M= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/licenseclassifier v0.0.0-20210325184830-bb04aff29e72/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/trillian v1.3.14-0.20210409160123-c5ea3abd4a41/go.mod h1:1dPv0CUjNQVFEDuAUFhZql16pw/VlPgaX8qj+g5pVzQ= +github.com/google/trillian v1.3.14-0.20210428093031-b4ddea2e86b1/go.mod h1:FdIJX+NoDk/dIN2ZxTyz5nAJWgf+NSSSriPAMThChTY= +github.com/google/trillian v1.5.1-0.20220819043421-0a389c4bb8d9/go.mod h1:vywkS3p2SgNmPL7oAWqU5PiiknzRMp+ol3a19jfY2PQ= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/goreleaser/goreleaser v0.134.0/go.mod h1:ZT6Y2rSYa6NxQzIsdfWWNWAlYGXGbreo66NmE+3X3WQ= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jhump/protoreflect v1.14.0 h1:MBbQK392K3u8NTLbKOCIi3XdI+y+c6yt5oMq0X3xviw= +github.com/jhump/protoreflect v1.14.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo= +github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= +github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= +github.com/jmoiron/sqlx v1.3.3/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= +github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= +github.com/kisielk/sqlstruct v0.0.0-20210630145711-dae28ed37023 h1:/pb3UJ+3ZtSEUKWnufwsoVF7f0AX5ytPULbTwHMgbq4= +github.com/kisielk/sqlstruct v0.0.0-20210630145711-dae28ed37023/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= +github.com/kisom/goutils v1.4.3/go.mod h1:Lp5qrquG7yhYnWzZCI/68Pa/GpFynw//od6EkGnWpac= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/go-gypsy v1.0.0/go.mod h1:chkXM0zjdpXOiqkCW1XcCHDfjfk14PH2KKkQWxfJUcU= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/lyft/protoc-gen-star v0.5.1/go.mod h1:9toiA3cC7z5uVbODF7kEQ91Xn7XNFkVUl+SrEe+ZORU= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nightlyone/lockfile v1.0.0/go.mod h1:rywoIealpdNse2r832aiD9jRk8ErCatROs6LzC841CI= +github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.24.0/go.mod h1:H6QK/N6XVT42whUeIdI3dp36w49c+/iMDk7UAI2qm7Q= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/prometheus v2.5.0+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= +github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5-0.20210205191134-5ec6847320e5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/transparency-dev/merkle v0.0.1/go.mod h1:B8FIw5LTq6DaULoHsVFRzYIUDkl8yuSwCdZnOZGKL/A= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.7/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.10 h1:p8Fspmz3iTctJstry1PYS3HVdllxnEzTEsgIgtxTrCk= +github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/weppos/publicsuffix-go v0.12.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= +github.com/weppos/publicsuffix-go v0.13.1-0.20210123135404-5fd73613514e/go.mod h1:HYux0V0Zi04bHNwOHy4cXJVz/TQjYonnF6aoYhj+3QE= +github.com/weppos/publicsuffix-go v0.15.1-0.20210511084619-b1f36a2d6c0b/go.mod h1:HYux0V0Zi04bHNwOHy4cXJVz/TQjYonnF6aoYhj+3QE= +github.com/weppos/publicsuffix-go v0.15.1-0.20220329081811-9a40b608a236/go.mod h1:HYux0V0Zi04bHNwOHy4cXJVz/TQjYonnF6aoYhj+3QE= +github.com/weppos/publicsuffix-go v0.15.1-0.20220724114530-e087fba66a37/go.mod h1:5ZC/Uv3fIEUE0eP6o9+Yg4+5+W8V0/BieMi05feGXVA= +github.com/weppos/publicsuffix-go v0.20.0 h1:59ypvSUbW3Dunc6zVm+v+MmXf2Q6cGiNDkxgRIzEnaA= +github.com/weppos/publicsuffix-go v0.20.0/go.mod h1:5ZC/Uv3fIEUE0eP6o9+Yg4+5+W8V0/BieMi05feGXVA= +github.com/weppos/publicsuffix-go/publicsuffix/generator v0.0.0-20220704091424-e0182326a282/go.mod h1:GHfoeIdZLdZmLjMlzBftbTDntahTttUMWjxZwQJhULE= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= +github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is= +github.com/zmap/zcrypto v0.0.0-20210123152837-9cf5beac6d91/go.mod h1:R/deQh6+tSWlgI9tb4jNmXxn8nSCabl5ZQsBX9//I/E= +github.com/zmap/zcrypto v0.0.0-20210511125630-18f1e0152cfc/go.mod h1:FM4U1E3NzlNMRnSUTU3P1UdukWhYGifqEsjk9fn7BCk= +github.com/zmap/zcrypto v0.0.0-20220402174210-599ec18ecbac/go.mod h1:egdRkzUylATvPkWMpebZbXhv0FMEMJGX/ur0D3Csk2s= +github.com/zmap/zcrypto v0.0.0-20220803033029-557f3e4940be h1:M5QjuCbUeNZsup53dlJkI/cx6pVdnDOPzyy+XppoowY= +github.com/zmap/zcrypto v0.0.0-20220803033029-557f3e4940be/go.mod h1:bRZdjnJaHWVXKEwrfAZMd0gfRjZGNhTbZwzp07s0Abw= +github.com/zmap/zlint/v3 v3.1.0/go.mod h1:L7t8s3sEKkb0A2BxGy1IWrxt1ZATa1R4QfJZaQOD3zU= +github.com/zmap/zlint/v3 v3.4.0 h1:Xs/lrMJY74MpJx/jSx2oVvZBrqlyUyFaLLBRyf68cqg= +github.com/zmap/zlint/v3 v3.4.0/go.mod h1:WgepL2QqxyMHnrOWJ54NqrgfMtOyuXr52wEE0tcfo9k= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.0-alpha.0/go.mod h1:mPcW6aZJukV6Aa81LSKpBjQXTWlXB5r74ymPoSWa3Sw= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0= +go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.0-alpha.0/go.mod h1:kdV+xzCJ3luEBSIeQyB/OEKkWKd8Zkux4sbDeANrosU= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v2 v2.305.5 h1:DktRP60//JJpnPC0VBymAN/7V71GHMdjDCBt4ZPXDjI= +go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= +go.etcd.io/etcd/client/v3 v3.5.0-alpha.0/go.mod h1:wKt7jgDgf/OfKiYmCq5WFGxOFAkVMLxiiXgLDFhECr8= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI= +go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= +go.etcd.io/etcd/etcdctl/v3 v3.5.0-alpha.0/go.mod h1:YPwSaBciV5G6Gpt435AasAG3ROetZsKNUzibRa/++oo= +go.etcd.io/etcd/etcdctl/v3 v3.5.4/go.mod h1:SMZep1Aj7sUmMSBCHTjkZL/Yw36Vx5Ux61fKbopbb5U= +go.etcd.io/etcd/etcdctl/v3 v3.5.5 h1:2A+/xUck9vBtimGaU8SQh62wCuvuIuREHSGBXBEY6QE= +go.etcd.io/etcd/etcdctl/v3 v3.5.5/go.mod h1:pNM9+Qv1dTxMUAxxk7hhCuciKjuX34iS1BKJDCDjmYI= +go.etcd.io/etcd/etcdutl/v3 v3.5.4/go.mod h1:eK9eZfI/BxDQCztpuaJ1E/ufYpMw2Y16dPX1azGWrBU= +go.etcd.io/etcd/etcdutl/v3 v3.5.5/go.mod h1:7DFbgeccvoOhQLbX7bI4eep9+t8PSKBFheTB7TVf04s= +go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0/go.mod h1:tV31atvwzcybuqejDoY3oaNRTtlD2l/Ot78Pc9w7DMY= +go.etcd.io/etcd/pkg/v3 v3.5.4/go.mod h1:OI+TtO+Aa3nhQSppMbwE4ld3uF1/fqqwbpfndbbrEe0= +go.etcd.io/etcd/pkg/v3 v3.5.5 h1:Ablg7T7OkR+AeeeU32kdVhw/AGDsitkKPl7aW73ssjU= +go.etcd.io/etcd/pkg/v3 v3.5.5/go.mod h1:6ksYFxttiUGzC2uxyqiyOEvhAiD0tuIqSZkX3TyPdaE= +go.etcd.io/etcd/raft/v3 v3.5.0-alpha.0/go.mod h1:FAwse6Zlm5v4tEWZaTjmNhe17Int4Oxbu7+2r0DiD3w= +go.etcd.io/etcd/raft/v3 v3.5.4/go.mod h1:SCuunjYvZFC0fBX0vxMSPjuZmpcSk+XaAcMrD6Do03w= +go.etcd.io/etcd/raft/v3 v3.5.5 h1:Ibz6XyZ60OYyRopu73lLM/P+qco3YtlZMOhnXNS051I= +go.etcd.io/etcd/raft/v3 v3.5.5/go.mod h1:76TA48q03g1y1VpTue92jZLr9lIHKUNcYdZOOGyx8rI= +go.etcd.io/etcd/server/v3 v3.5.0-alpha.0/go.mod h1:tsKetYpt980ZTpzl/gb+UOJj9RkIyCb1u4wjzMg90BQ= +go.etcd.io/etcd/server/v3 v3.5.4/go.mod h1:S5/YTU15KxymM5l3T6b09sNOHPXqGYIZStpuuGbb65c= +go.etcd.io/etcd/server/v3 v3.5.5 h1:jNjYm/9s+f9A9r6+SC4RvNaz6AqixpOvhrFdT0PvIj0= +go.etcd.io/etcd/server/v3 v3.5.5/go.mod h1:rZ95vDw/jrvsbj9XpTqPrTAB9/kzchVdhRirySPkUBc= +go.etcd.io/etcd/tests/v3 v3.5.0-alpha.0/go.mod h1:HnrHxjyCuZ8YDt8PYVyQQ5d1ZQfzJVEtQWllr5Vp/30= +go.etcd.io/etcd/tests/v3 v3.5.4/go.mod h1:ymig8LjkI1zqAxxMsl+nntzG21dND2hh0UQXl9BaJP8= +go.etcd.io/etcd/tests/v3 v3.5.5 h1:QMfo2twT9Erol77/aypdJGN1vtuQ4VNSGnb5cRiIRo8= +go.etcd.io/etcd/tests/v3 v3.5.5/go.mod h1:WUfOEAmIWBoqOtLmHeCp4WbGw3Q0sRK9ECO24zL1/g8= +go.etcd.io/etcd/v3 v3.5.0-alpha.0/go.mod h1:JZ79d3LV6NUfPjUxXrpiFAYcjhT+06qqw+i28snx8To= +go.etcd.io/etcd/v3 v3.5.4/go.mod h1:c6jK4IfuWwJU26FD9SeI4cAtvlfu9Iacaxu0vRses1k= +go.etcd.io/etcd/v3 v3.5.5 h1:Dd0pMrzlu2T0FsxDSomE4+8PNxpNJFLKP/cMrZiK/9s= +go.etcd.io/etcd/v3 v3.5.5/go.mod h1:LLAaIJ/5esg1ip96fRglrSGlWWGaCo1Hal3CulymK14= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib v1.6.0/go.mod h1:FlyPNX9s4U6MCsWEc5YAK4KzKNHFDsjrDUZijJiXvy8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= +go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220824171710-5757bc0c5503/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.2.0 h1:BRXPfhNivWL5Yq0BGQ39a2sW6t44aODpfxkWjYdzewE= +golang.org/x/crypto v0.2.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.2.0 h1:GtQkldQ9m7yvzCL1V+LrYow3Khe0eJH0w7RbX/VbaIU= +golang.org/x/oauth2 v0.2.0/go.mod h1:Cwn6afJ8jrQwYMxQDTpISoXmXW9I6qF6vDeuuoX3Ibs= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.2.0 h1:52I/1L54xyEQAYdtcSuxtiT84KGYTBGXwayxmIpNJhE= +golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201014170642-d1624618ad65/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.86.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210325141258-5636347f2b14/go.mod h1:f2Bd7+2PlaVKmvKQ52aspJZXIDaRQBVdOOBfJ5i8OEs= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210331142528-b7513248f0ba/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210406143921-e86de6bf7a46/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210510173355-fb37daa5cd7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220706185917-7780775163c4/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221111202108-142d8a6fa32e h1:azcyH5lGzGy7pkLCbhPe0KkKxsM7c6UA/FZIXImKE7M= +google.golang.org/genproto v0.0.0-20221111202108-142d8a6fa32e/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -138,15 +1957,67 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.4/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/minikube/tls/.gitignore b/minikube/tls/.gitignore new file mode 100644 index 0000000..e67a75e --- /dev/null +++ b/minikube/tls/.gitignore @@ -0,0 +1,2 @@ +*.pem +*.csr diff --git a/minikube/tls/README.md b/minikube/tls/README.md new file mode 100644 index 0000000..3b94dbc --- /dev/null +++ b/minikube/tls/README.md @@ -0,0 +1,84 @@ +# Setup TLS certs + +Using `cfssl` from https://github.com/cloudflare/cfssl. + +Instructions: https://rob-blackbourn.medium.com/how-to-use-cfssl-to-create-self-signed-certificates-d55f76ba5781 + +## Installation + +Install cfssl. + +``` +sudo apt install build-essential manpages-dev +go install github.com/cloudflare/cfssl/cmd/cfssl +go install github.com/cloudflare/cfssl/cmd/cfssljson +``` + +### Quick Gen Certs + +Edit `ingress_host.json` and setup host details, then run: + +``` +cfssl gencert -initca ca.json | cfssljson -bare ca +cfssl gencert -initca intermediate-ca.json | cfssljson -bare intermediate_ca +cfssl sign -ca ca.pem -ca-key ca-key.pem -config cfssl.json -profile intermediate_ca intermediate_ca.csr | cfssljson -bare intermediate_ca +cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=server ingress_host.json | cfssljson -bare ingress-host-server +``` + +## Create Certificates + +### Create Root CA + +Edit `ca.json` and run: + +``` +# generates ca.csr, ca.pem and ca-key.pem +cfssl gencert -initca ca.json | cfssljson -bare ca +``` + +- `ca.csr` - cert signing request +- `ca.pem` - ca cert +- `ca-key.pem` - ca private key (note file perms: private) + +### Create Profile Configuration + +The profile specifies general attributes for different types of certs, e.g., profiles for intermediate CAs or host certs. Edit `cfssl.json` to modify the profile. + +#### Profiles + +- `intermediate_ca` -- has `is_ca` constraint enabled. +- `server` -- has `server auth` but no `client auth`. +- `client` -- has `client auth` but no `server auth`. +- `peer` -- has `server auth` *and* `client auth`. + +### Create Intermediate CA + +Create the intermediate CA's certs and sign with root CA. Edit `intermediate-ca.json` and run: + +``` +# Create intermediate CA +cfssl gencert -initca intermediate-ca.json | cfssljson -bare intermediate_ca + +# Sign the intermediate CA's CSR with the root CA's key using the intermediate_ca profile +cfssl sign -ca ca.pem -ca-key ca-key.pem -config cfssl.json -profile intermediate_ca intermediate_ca.csr | cfssljson -bare intermediate_ca +``` + +- `intermediate_ca.csr` - cert signing request +- `intermediate_ca.pem` - ca cert +- `intermediate_ca-key.pem` - ca private key (note file perms: private) + +### Create Host Certs + +Use `k get ingress` to get ingress IP address, then edit `ingress_host.json`. Typically we require only server certificates. + +``` +# Generate server certs +cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=server ingress_host.json | cfssljson -bare ingress-host-server + +# Generate client certificate (optional) +cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=client ingress_host.json | cfssljson -bare ingress-host-client + +# Generate peer certificate (optional) +cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=peer ingress_host.json | cfssljson -bare ingress-host-peer +``` + diff --git a/minikube/tls/ca.json b/minikube/tls/ca.json new file mode 100644 index 0000000..ba59c78 --- /dev/null +++ b/minikube/tls/ca.json @@ -0,0 +1,16 @@ +{ + "CN": "Dice Kube Root CA", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CA", + "L": "Waterloo", + "O": "Dice Kube", + "OU": "Dice Kube Root CA", + "ST": "Canada" + } + ] +} \ No newline at end of file diff --git a/minikube/tls/cfssl.json b/minikube/tls/cfssl.json new file mode 100644 index 0000000..173c3bf --- /dev/null +++ b/minikube/tls/cfssl.json @@ -0,0 +1,54 @@ +{ + "signing": { + "default": { + "expiry": "8760h" + }, + "profiles": { + "intermediate_ca": { + "usages": [ + "signing", + "digital signature", + "key encipherment", + "cert sign", + "crl sign", + "server auth", + "client auth" + ], + "expiry": "8760h", + "ca_constraint": { + "is_ca": true, + "max_path_len": 0, + "max_path_len_zero": true + } + }, + "peer": { + "usages": [ + "signing", + "digital signature", + "key encipherment", + "client auth", + "server auth" + ], + "expiry": "8760h" + }, + "server": { + "usages": [ + "signing", + "digital signing", + "key encipherment", + "server auth" + ], + "expiry": "8760h" + }, + "client": { + "usages": [ + "signing", + "digital signature", + "key encipherment", + "client auth" + ], + "expiry": "8760h" + } + } + } +} \ No newline at end of file diff --git a/minikube/tls/ingress_host.json b/minikube/tls/ingress_host.json new file mode 100644 index 0000000..77ef959 --- /dev/null +++ b/minikube/tls/ingress_host.json @@ -0,0 +1,21 @@ +{ + "CN": "dev", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "GB", + "L": "London", + "O": "Custom Widgets", + "OU": "Custom Widgets Hosts", + "ST": "England" + } + ], + "hosts": [ + "dev", + "192.168.49.2", + "dev.muthanna.com" + ] +} \ No newline at end of file diff --git a/minikube/tls/intermediate-ca.json b/minikube/tls/intermediate-ca.json new file mode 100644 index 0000000..5398f18 --- /dev/null +++ b/minikube/tls/intermediate-ca.json @@ -0,0 +1,19 @@ +{ + "CN": "Dice Kube Intermediate CA", + "key": { + "algo": "rsa", + "size": 2048 + }, + "names": [ + { + "C": "CA", + "L": "Waterloo", + "O": "Dice Kube", + "OU": "Dice Kube Intermediate CA", + "ST": "Canada" + } + ], + "ca": { + "expiry": "42720h" + } +} \ No newline at end of file From a638321bc40489af44519eab820339bcfa833b4d Mon Sep 17 00:00:00 2001 From: Mo Date: Mon, 14 Nov 2022 13:22:49 +0000 Subject: [PATCH 112/180] Create cert bundles for ingress installation. --- minikube/tls/README.md | 11 ++++++++++- minikube/tls/ingress_host.json | 10 +++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/minikube/tls/README.md b/minikube/tls/README.md index 3b94dbc..1e75595 100644 --- a/minikube/tls/README.md +++ b/minikube/tls/README.md @@ -9,7 +9,7 @@ Instructions: https://rob-blackbourn.medium.com/how-to-use-cfssl-to-create-self- Install cfssl. ``` -sudo apt install build-essential manpages-dev +sudo apt install build-essential manpages-dev jq go install github.com/cloudflare/cfssl/cmd/cfssl go install github.com/cloudflare/cfssl/cmd/cfssljson ``` @@ -82,3 +82,12 @@ cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cf cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=peer ingress_host.json | cfssljson -bare ingress-host-peer ``` +### Bundle certs for installation + +Generate the bundle for the webserver. + +``` +cfssl bundle -ca-bundle ca.pem -int-bundle intermediate_ca.pem -cert ingress-host-server.pem | jq .bundle -r >ingress-host-bundle.pem +``` + +Use the bundle file `ingress-host-bundle.pem` and the key `ingress-host-server-key.pem` to install into webserver or ingress. \ No newline at end of file diff --git a/minikube/tls/ingress_host.json b/minikube/tls/ingress_host.json index 77ef959..d0c8946 100644 --- a/minikube/tls/ingress_host.json +++ b/minikube/tls/ingress_host.json @@ -6,11 +6,11 @@ }, "names": [ { - "C": "GB", - "L": "London", - "O": "Custom Widgets", - "OU": "Custom Widgets Hosts", - "ST": "England" + "C": "CA", + "L": "Waterloo", + "O": "Dice Kube", + "OU": "Dice Kube Ingress", + "ST": "Canada" } ], "hosts": [ From 3a6ac9f22899b18b01366a2abb9575f2b905944c Mon Sep 17 00:00:00 2001 From: Mo Date: Mon, 14 Nov 2022 13:28:36 +0000 Subject: [PATCH 113/180] Distribute root cert to browser. --- minikube/tls/README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/minikube/tls/README.md b/minikube/tls/README.md index 1e75595..6ff8fa4 100644 --- a/minikube/tls/README.md +++ b/minikube/tls/README.md @@ -84,10 +84,22 @@ cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cf ### Bundle certs for installation -Generate the bundle for the webserver. +Generate the bundle for the webserver. The bundle consists of the entire chain of certs (excluding the root CA cert). In this case, there should be two certs in the bundle (intermediate, host.) The root cert must be manually installed in the client/browser (see below.) ``` cfssl bundle -ca-bundle ca.pem -int-bundle intermediate_ca.pem -cert ingress-host-server.pem | jq .bundle -r >ingress-host-bundle.pem ``` -Use the bundle file `ingress-host-bundle.pem` and the key `ingress-host-server-key.pem` to install into webserver or ingress. \ No newline at end of file +Another way to create the bundle: + +``` +cat certificates/my-webserver.pem intermediate/intermediate-ca.pem > certificates/my-webserver-fullchain.pem +``` + +Use the bundle file `ingress-host-bundle.pem` and the key `ingress-host-server-key.pem` to install into webserver or ingress. + +### Setup private CA as a trusted authority in client/browser + +Still getting warnings about this page not being secure and NET::ERR_CERT_AUTHORITY_INVALID? There’s one important piece of the puzzle missing: + +Import `ca.pem` as a trusted Certificated Authority in your OS/browser! This needs to be done for every device that should trust certificates issued by the root CA and intermediaries. \ No newline at end of file From 5f6dd69c38fa7c087fed98970dee3c1448f72453 Mon Sep 17 00:00:00 2001 From: Mo Date: Mon, 14 Nov 2022 21:41:12 +0000 Subject: [PATCH 114/180] Updated TLS configs. --- minikube/README.md | 12 ++++++++++-- minikube/tls/README.md | 13 ++++++++++++- minikube/tls/ingress_host.json | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index fa9a3f6..d7c77d0 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -8,12 +8,16 @@ This repo implements an end-to-end web and commandline "diceroll app" with a gRP - Minikube - nginx Ingress - Envoy for gRPC LB +- cfssl for CA cert management - iptables rules for exposing minikube bridge network to the outside world Components: -- `server/` - GRPC server binary. Built with `server.Dockerfile`. -- `client/` - GRPC client library. +- `tls/` - Configs to generate TLS certs for root and intermediate CAs, and ingress +- `k8s/` - Kuberenetes configs (deployments, ingress, envoy) += `dice/` - Protobuf schemas for Dice server +- `server/` - gRPC server binary. Built with `server.Dockerfile`. +- `client/` - gRPC client library. - `client/cmd` - Commandline tool that uses the client library to talk to the server - `main.go` - Web server that talks to the gRPC server. Exposes `/roll` and `/getrolls` @@ -182,6 +186,10 @@ If you don't see ports on `netstat`, then unset DOCKER_* env variables. ## Networking +### Setup TLS certs + +See [tls/README.md](https://github.com/0xfe/experiments/tree/master/minikube/tls/README.md) for details. + ### Forward ports from outside world to ingress ``` diff --git a/minikube/tls/README.md b/minikube/tls/README.md index 6ff8fa4..f2bf73e 100644 --- a/minikube/tls/README.md +++ b/minikube/tls/README.md @@ -4,6 +4,8 @@ Using `cfssl` from https://github.com/cloudflare/cfssl. Instructions: https://rob-blackbourn.medium.com/how-to-use-cfssl-to-create-self-signed-certificates-d55f76ba5781 +Consider using [mkcert](https://github.com/FiloSottile/mkcert) for quick cert hacking. + ## Installation Install cfssl. @@ -102,4 +104,13 @@ Use the bundle file `ingress-host-bundle.pem` and the key `ingress-host-server-k Still getting warnings about this page not being secure and NET::ERR_CERT_AUTHORITY_INVALID? There’s one important piece of the puzzle missing: -Import `ca.pem` as a trusted Certificated Authority in your OS/browser! This needs to be done for every device that should trust certificates issued by the root CA and intermediaries. \ No newline at end of file +Import `ca.pem` as a trusted Certificated Authority in your OS/browser! This needs to be done for every device that should trust certificates issued by the root CA and intermediaries. + +For quick hacking you can use: https://github.com/FiloSottile/mkcert + + +### Install into k8s (not finished) + +``` +$ kubectl -n kube-system create secret tls ingress-host --key ingress-host-key.pem --cert ingress-host-bundle.pem +``` \ No newline at end of file diff --git a/minikube/tls/ingress_host.json b/minikube/tls/ingress_host.json index d0c8946..2c2bf51 100644 --- a/minikube/tls/ingress_host.json +++ b/minikube/tls/ingress_host.json @@ -15,6 +15,7 @@ ], "hosts": [ "dev", + "dev.c.symbolic-axe-717.internal", "192.168.49.2", "dev.muthanna.com" ] From 95d4f8a737f2f341d724b699c217a43f8fad243b Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 19 Nov 2022 12:24:41 +0000 Subject: [PATCH 115/180] Added more docs. --- minikube/README.md | 2 +- minikube/k8s/main-depl.yaml | 2 +- minikube/k8s/server-depl.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index d7c77d0..32b55e3 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -70,7 +70,7 @@ kubectl apply -f k8s/ingress.yaml # Watch pods kubectl get pods -# Get ingress IP address +# Get ingress IP address (takes about a minute) kubectl get ingress # Test diff --git a/minikube/k8s/main-depl.yaml b/minikube/k8s/main-depl.yaml index 028ecbf..ca36a5d 100644 --- a/minikube/k8s/main-depl.yaml +++ b/minikube/k8s/main-depl.yaml @@ -35,4 +35,4 @@ spec: - name: http protocol: TCP port: 3000 - targetPort: 3000 \ No newline at end of file + targetPort: 3000 diff --git a/minikube/k8s/server-depl.yaml b/minikube/k8s/server-depl.yaml index 8b62736..0106953 100644 --- a/minikube/k8s/server-depl.yaml +++ b/minikube/k8s/server-depl.yaml @@ -33,4 +33,4 @@ spec: - name: http protocol: TCP port: 3001 - targetPort: 3001 \ No newline at end of file + targetPort: 3001 From d985e4a608901c6d9a916314aa136cee620f31c3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 21 Nov 2022 20:42:47 -0500 Subject: [PATCH 116/180] Instructions to push to Artifact Registry. --- minikube/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/minikube/README.md b/minikube/README.md index 32b55e3..efd7dba 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -163,6 +163,12 @@ cd .. # builds and pushes to local repo docker build . -f server.Dockerfile -t 0xfe/dice/server docker build . -f Dockerfile -t 0xfe/dice/main + +# push to Google artifact registry + +$ gcloud auth configure-docker northamerica-northeast2-docker.pkg.dev +$ docker build . -f server.Dockerfile -t 0xfe/dice/server -t northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server +$ docker push northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server ``` If pushing to minikube, set the `DOCKER_*` env variables to point to the minikube docker, then build the images again as above. @@ -223,4 +229,4 @@ sudo iptables -L -t nat --line # delete rule 1 in chain OUTPUT sudo iptables -D OUTPUT 1 -``` \ No newline at end of file +``` From ec0dcc6c492e77be10e098562031ecf5f400cdfd Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 22 Nov 2022 09:39:53 -0500 Subject: [PATCH 117/180] Added arm64 Dockerfile for k3s running on Raspberry Pi. --- minikube/README.md | 8 ++++++-- minikube/k8s/server-depl-pi.yaml | 35 ++++++++++++++++++++++++++++++++ minikube/server.arm64.Dockerfile | 27 ++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 minikube/k8s/server-depl-pi.yaml create mode 100644 minikube/server.arm64.Dockerfile diff --git a/minikube/README.md b/minikube/README.md index efd7dba..b4ef351 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -163,12 +163,16 @@ cd .. # builds and pushes to local repo docker build . -f server.Dockerfile -t 0xfe/dice/server docker build . -f Dockerfile -t 0xfe/dice/main +``` + +### Build container images for pikube (arm64) and push to GAR +``` # push to Google artifact registry $ gcloud auth configure-docker northamerica-northeast2-docker.pkg.dev -$ docker build . -f server.Dockerfile -t 0xfe/dice/server -t northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server -$ docker push northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server +$ docker build . -f server.arm64.Dockerfile -t northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64 +$ docker push northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64 ``` If pushing to minikube, set the `DOCKER_*` env variables to point to the minikube docker, then build the images again as above. diff --git a/minikube/k8s/server-depl-pi.yaml b/minikube/k8s/server-depl-pi.yaml new file mode 100644 index 0000000..2c9c684 --- /dev/null +++ b/minikube/k8s/server-depl-pi.yaml @@ -0,0 +1,35 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: server-deployment + labels: + app: server +spec: + replicas: 3 + selector: + matchLabels: + app: server + template: + metadata: + labels: + app: server + spec: + containers: + - name: server + image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64:latest + ports: + - containerPort: 3001 +--- +apiVersion: v1 +kind: Service +metadata: + name: server-service +spec: + clusterIP: None # headless service for gRPC load balancing + selector: + app: server + ports: + - name: http + protocol: TCP + port: 3001 + targetPort: 3001 diff --git a/minikube/server.arm64.Dockerfile b/minikube/server.arm64.Dockerfile new file mode 100644 index 0000000..a416d1c --- /dev/null +++ b/minikube/server.arm64.Dockerfile @@ -0,0 +1,27 @@ +FROM golang:1.19 as builder + +# Create and change to the app directory. +WORKDIR /app + +# Copy go.mod and go.sum, then retrieve application dependencies. +# This allows the container build to reuse cached dependencies. +COPY go.* ./ +RUN go mod download + +# Copy local code to the container image. +COPY . ./ + +# Build the binary. +WORKDIR /app/server +RUN GOARCH=arm64 CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o main + +# Use the official Alpine image for a lean production container. +# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds +FROM alpine:latest +RUN apk add --no-cache ca-certificates + +# Copy the binary to the production image from the builder stage. +COPY --from=builder /app/server/main /main + +# Run the web service on container startup. +CMD ["/main"] From 1921b4277542a4254c61918228abdaf083356a6c Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 22 Nov 2022 19:24:21 -0500 Subject: [PATCH 118/180] Working main and envoy in pikube. --- minikube/README.md | 6 ++++ minikube/k8s/main-depl-pi.yaml | 37 ++++++++++++++++++++++++ minikube/{Dockerfile => main.Dockerfile} | 0 minikube/main.arm64.Dockerfile | 32 ++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 minikube/k8s/main-depl-pi.yaml rename minikube/{Dockerfile => main.Dockerfile} (100%) create mode 100644 minikube/main.arm64.Dockerfile diff --git a/minikube/README.md b/minikube/README.md index b4ef351..05913b6 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -70,6 +70,9 @@ kubectl apply -f k8s/ingress.yaml # Watch pods kubectl get pods +k get svc +k get endpoints + # Get ingress IP address (takes about a minute) kubectl get ingress @@ -173,6 +176,9 @@ docker build . -f Dockerfile -t 0xfe/dice/main $ gcloud auth configure-docker northamerica-northeast2-docker.pkg.dev $ docker build . -f server.arm64.Dockerfile -t northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64 $ docker push northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64 + +$ docker build . -f main.arm64.Dockerfile -t northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64 +$ docker push northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64 ``` If pushing to minikube, set the `DOCKER_*` env variables to point to the minikube docker, then build the images again as above. diff --git a/minikube/k8s/main-depl-pi.yaml b/minikube/k8s/main-depl-pi.yaml new file mode 100644 index 0000000..04db0e4 --- /dev/null +++ b/minikube/k8s/main-depl-pi.yaml @@ -0,0 +1,37 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: main-deployment + labels: + app: main +spec: + replicas: 3 + selector: + matchLabels: + app: main + template: + metadata: + labels: + app: main + spec: + containers: + - name: main + image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64:latest + env: + - name: DICE_GRPC_TARGET + value: "envoy:8443" + ports: + - containerPort: 3000 +--- +apiVersion: v1 +kind: Service +metadata: + name: main-service +spec: + selector: + app: main + ports: + - name: http + protocol: TCP + port: 3000 + targetPort: 3000 diff --git a/minikube/Dockerfile b/minikube/main.Dockerfile similarity index 100% rename from minikube/Dockerfile rename to minikube/main.Dockerfile diff --git a/minikube/main.arm64.Dockerfile b/minikube/main.arm64.Dockerfile new file mode 100644 index 0000000..8608c37 --- /dev/null +++ b/minikube/main.arm64.Dockerfile @@ -0,0 +1,32 @@ +FROM golang:1.19 as builder + +# Create and change to the app directory. +WORKDIR /app + +# Copy go.mod and go.sum, then retrieve application dependencies. +# This allows the container build to reuse cached dependencies. +COPY go.* ./ +RUN go mod download + +# Copy local code to the container image. +COPY . ./ + +# Build the binary. +RUN CGO_ENABLED=0 GOARCH=arm64 GOOS=linux go build -mod=readonly -v -o main + +# Use the official Alpine image for a lean production container. +# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds +FROM alpine:latest +RUN apk add --no-cache ca-certificates + +# Copy the binary to the production image from the builder stage. +COPY --from=builder /app/main /main + +# Defaults +ARG DICE_GRPC_TARGET="server-service:3001" + +# Env overrides +ENV DICE_GRPC_TARGET=${DICE_GRPC_TARGET} + +# Run the web service on container startup. +CMD ["/main"] \ No newline at end of file From ca898063b632f77ccf7c69e7500c40d7191f3ea2 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Tue, 22 Nov 2022 19:27:21 -0500 Subject: [PATCH 119/180] Updated README with pikube instructions. --- minikube/README.md | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index 05913b6..4b69424 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -54,14 +54,14 @@ eval $(minikube -p minikube docker-env) ### Create deployments and ingress -Make sure deployment has "imagePullPolicy: Never". +For Minikube, make sure deployment has "imagePullPolicy: Never". ``` # Push envoy configs k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml k describe configmap envoy-conf -# Start pods +# Start pods in kubectl apply -f k8s/main-depl.yaml kubectl apply -f k8s/server-depl.yaml kubectl apply -f k8s/envoy-depl.yaml @@ -83,9 +83,34 @@ $ curl 192.168.49.2/roll $ curl 192.168.49.2/getrolls ``` +### Create deployments in k3s on pikube + +Same as above, but for pi cluster. + +``` +# Push envoy configs +k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml + +# Start deployments +kubectl apply -f k8s/main-depl-pi.yaml +kubectl apply -f k8s/server-depl-pi.yaml +kubectl apply -f k8s/envoy-depl.yaml + +# Test it in a new temp container +k run temppod --image=debian -it +apt update && apt install net-tools curl iproute2 +curl main-sevice:3000/roll +``` + ## Debug ``` +# run a fresh debian image inside the network +$ k run temppod --image=debian -it +temppod# cat /etc/debian_version +temppod# apt update && apt install net-tools curl iproute2 +temppod# curl main-sevice:3000/roll + # Restart deployment kubectl rollout restart deployment envoy-deployment @@ -97,12 +122,8 @@ kubectl rollout restart deployment envoy-deployment # Run shell in new container (first time) $ k run temppod --image=radial/busyboxplus:curl -it -# Same thing, but with debian instead -$ k run temppod --image=debian -it -temppod# cat /etc/debian_version -temppod# apt update -temppod# apt install curl -temppod# curl main-sevice:3000 +# Reattach to temppod +$ k attach temppod -it # Run shell in temppod $ k exec temppod -it -- /bin/ash From 5dce829dba36a2b7aa446310b67a29863c828e7f Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 24 Nov 2022 10:27:18 -0500 Subject: [PATCH 120/180] Verify that ingress config works on k3s. --- minikube/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/minikube/README.md b/minikube/README.md index 4b69424..894d0cf 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -95,6 +95,11 @@ k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml kubectl apply -f k8s/main-depl-pi.yaml kubectl apply -f k8s/server-depl-pi.yaml kubectl apply -f k8s/envoy-depl.yaml +kubectl apply -f k8s/ingress.yaml + +# Test (notice how ingress exposes port 80 on all Pi hosts) +k get ingress +curl 192.168.16.223/roll # Test it in a new temp container k run temppod --image=debian -it From 49978e31f6b125d50a3e6157451ed8dde372227d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 24 Nov 2022 10:32:30 -0500 Subject: [PATCH 121/180] Added more networking notes. --- minikube/README.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index 894d0cf..b33b9c8 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -52,11 +52,14 @@ minikube start eval $(minikube -p minikube docker-env) ``` -### Create deployments and ingress +### Depoly on minikube For Minikube, make sure deployment has "imagePullPolicy: Never". ``` +# Once: enable nginx ingress controller +minikube addons enable ingress + # Push envoy configs k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml k describe configmap envoy-conf @@ -81,11 +84,20 @@ $ curl 192.168.49.2/roll # note: the backend is loadbalanced, so the response depends on which backend is hit $ curl 192.168.49.2/getrolls + +# To expose ports on the host (so you can connect from outside the machine), see the IPTables instructions below. ``` -### Create deployments in k3s on pikube +### Deploy on k3s (in pikube) -Same as above, but for pi cluster. +Same as above, but for pi cluster. Key differences here: + +- images are hosted on Google Artifact Registry + + `ImagePullPolicy` is not `never` here. +- ingress controller is Traefik (unlike nginx above) +- pikube is a cluster or Raspberry Pis, so images must be target arm64 +- ingress exposes ports on the nodes (like a real k8s cluster) + + Minikube builds a separate internal network, so you need IP forwarding setup ``` # Push envoy configs @@ -99,7 +111,8 @@ kubectl apply -f k8s/ingress.yaml # Test (notice how ingress exposes port 80 on all Pi hosts) k get ingress -curl 192.168.16.223/roll +curl pi0/roll +curl pi1/roll # Test it in a new temp container k run temppod --image=debian -it @@ -234,6 +247,8 @@ See [tls/README.md](https://github.com/0xfe/experiments/tree/master/minikube/tls ### Forward ports from outside world to ingress +This is needed on minikube since it builds a separate internal network that isn't exposed on the host. For pikube, no need to do this (like a real k8s cluster.) + ``` ip -4 addr show scope global From 7f0f532dac65f9c108bac4d3403acb5b76b88ad3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 24 Nov 2022 10:35:19 -0500 Subject: [PATCH 122/180] Separated minikube and k3s requirements. --- minikube/README.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/minikube/README.md b/minikube/README.md index b33b9c8..dd723e5 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -1,17 +1,27 @@ -# Minikube Experiment +# minikube / k3s experiment This repo implements an end-to-end web and commandline "diceroll app" with a gRPC backend running on k8s. Uses: +### Shared - Go 1.19 - gRPC / Protobuf -- Docker -- Minikube -- nginx Ingress - Envoy for gRPC LB - cfssl for CA cert management + +### Minikube +- Minikube +- Docker +- nginx Ingress (on minikube) - iptables rules for exposing minikube bridge network to the outside world -Components: +### k3s +- k3s +- containerd (on k3s, no Docker) + + but images built with Docker +- Google Artifact Registry +- Traefik Ingress (on pikube) + +### Subdirectories - `tls/` - Configs to generate TLS certs for root and intermediate CAs, and ingress - `k8s/` - Kuberenetes configs (deployments, ingress, envoy) From fa4c413f8b2d6663ca0d06978a27e114bae220d9 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 25 Nov 2022 09:51:53 -0500 Subject: [PATCH 123/180] Create helm chart for dice. No ingress. --- minikube/README.md | 20 ++++++ minikube/helm/dice/.helmignore | 23 +++++++ minikube/helm/dice/Chart.yaml | 24 +++++++ .../helm/dice/templates/envoy-configmap.yaml | 62 +++++++++++++++++++ minikube/helm/dice/templates/envoy-depl.yaml | 43 +++++++++++++ minikube/helm/dice/templates/main-depl.yaml | 38 ++++++++++++ minikube/helm/dice/templates/server-depl.yaml | 36 +++++++++++ minikube/helm/dice/values.yaml | 15 +++++ minikube/helm/k3s.yaml | 15 +++++ minikube/helm/minikube.yaml | 15 +++++ 10 files changed, 291 insertions(+) create mode 100644 minikube/helm/dice/.helmignore create mode 100644 minikube/helm/dice/Chart.yaml create mode 100644 minikube/helm/dice/templates/envoy-configmap.yaml create mode 100644 minikube/helm/dice/templates/envoy-depl.yaml create mode 100644 minikube/helm/dice/templates/main-depl.yaml create mode 100644 minikube/helm/dice/templates/server-depl.yaml create mode 100644 minikube/helm/dice/values.yaml create mode 100644 minikube/helm/k3s.yaml create mode 100644 minikube/helm/minikube.yaml diff --git a/minikube/README.md b/minikube/README.md index dd723e5..3149b58 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -53,6 +53,23 @@ $ grpcurl -plaintext localhost:3001 describe $ grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 RollService/Roll ``` +### Quick Run with Helm + +Check `values.yaml` in `helm/dice`. + +``` +# Start on pikube +helm install dice helm/dice -f helm/k3s.yaml + +# Start on minikube +helm install dice helm/dice -f helm/k3s.yaml +k get pods + +helm list +helm status dice +helm uninstall dice +``` + ## Run in k8s / minikube ### Start Minikube @@ -172,6 +189,9 @@ $ kubectl debug node/minikube -it --image=ubuntu $ k logs podname $ k top pod $ k top node + +# see k3s logs +sudo journalctl -u k3s.service ``` ## Build diff --git a/minikube/helm/dice/.helmignore b/minikube/helm/dice/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/minikube/helm/dice/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/minikube/helm/dice/Chart.yaml b/minikube/helm/dice/Chart.yaml new file mode 100644 index 0000000..e3e120d --- /dev/null +++ b/minikube/helm/dice/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: dice +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.16.0" diff --git a/minikube/helm/dice/templates/envoy-configmap.yaml b/minikube/helm/dice/templates/envoy-configmap.yaml new file mode 100644 index 0000000..1ea088c --- /dev/null +++ b/minikube/helm/dice/templates/envoy-configmap.yaml @@ -0,0 +1,62 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.app_prefix }}-envoy-conf +data: + envoy.yaml: | + static_resources: + listeners: + - name: listener_0 + address: + socket_address: + address: 0.0.0.0 + port_value: 8443 + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + access_log: + - name: envoy.access_loggers.stdout + typed_config: + "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog + codec_type: AUTO + stat_prefix: ingress_https + route_config: + name: local_route + virtual_hosts: + - name: https + domains: + - "*" + routes: + - match: + prefix: "/" + route: + cluster: server-grpc + max_grpc_timeout: 2s + http_filters: + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + clusters: + - name: server-grpc + connect_timeout: 0.5s + type: STRICT_DNS + dns_lookup_family: V4_ONLY + lb_policy: ROUND_ROBIN + http2_protocol_options: {} + load_assignment: + cluster_name: server-grpc + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: {{ .Values.app_prefix }}-server-service + port_value: {{ .Values.server.port }} + admin: + access_log_path: /dev/stdout + address: + socket_address: + address: 127.0.0.1 + port_value: 8090 \ No newline at end of file diff --git a/minikube/helm/dice/templates/envoy-depl.yaml b/minikube/helm/dice/templates/envoy-depl.yaml new file mode 100644 index 0000000..5f7febb --- /dev/null +++ b/minikube/helm/dice/templates/envoy-depl.yaml @@ -0,0 +1,43 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.app_prefix }}-envoy-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Values.app_prefix }}-envoy + template: + metadata: + labels: + app: {{ .Values.app_prefix }}-envoy + spec: + containers: + - name: {{ .Values.app_prefix }}-envoy + image: envoyproxy/envoy-dev + ports: + - name: https + containerPort: 8443 + volumeMounts: + - name: config + mountPath: /etc/envoy + volumes: + - name: config + configMap: + name: {{ .Values.app_prefix }}-envoy-conf + items: + - key: envoy.yaml + path: envoy.yaml +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.app_prefix }}-envoy +spec: + selector: + app: {{ .Values.app_prefix }}-envoy + ports: + - name: https + protocol: TCP + port: 8443 + targetPort: 8443 \ No newline at end of file diff --git a/minikube/helm/dice/templates/main-depl.yaml b/minikube/helm/dice/templates/main-depl.yaml new file mode 100644 index 0000000..213edd3 --- /dev/null +++ b/minikube/helm/dice/templates/main-depl.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.app_prefix }}-main-deployment + labels: + app: {{ .Values.app_prefix }}-main +spec: + replicas: 3 + selector: + matchLabels: + app: {{ .Values.app_prefix }}-main + template: + metadata: + labels: + app: {{ .Values.app_prefix }}-main + spec: + containers: + - name: {{ .Values.app_prefix }}-main + image: {{ .Values.main.image }} + imagePullPolicy: {{ .Values.main.pullPolicy }} + env: + - name: DICE_GRPC_TARGET + value: "envoy:8443" + ports: + - containerPort: {{ .Values.main.port }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.app_prefix }}-main-service +spec: + selector: + app: {{ .Values.app_prefix }}-main + ports: + - name: http + protocol: TCP + port: {{ .Values.main.port }} + targetPort: {{ .Values.main.port }} diff --git a/minikube/helm/dice/templates/server-depl.yaml b/minikube/helm/dice/templates/server-depl.yaml new file mode 100644 index 0000000..77e72bc --- /dev/null +++ b/minikube/helm/dice/templates/server-depl.yaml @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.app_prefix }}-server-deployment + labels: + app: {{ .Values.app_prefix }}-server +spec: + replicas: 3 + selector: + matchLabels: + app: {{ .Values.app_prefix }}-server + template: + metadata: + labels: + app: {{ .Values.app_prefix }}-server + spec: + containers: + - name: {{ .Values.app_prefix }}-server + image: {{ .Values.server.image }} + imagePullPolicy: {{ .Values.server.pullPolicy }} + ports: + - containerPort: {{ .Values.server.port }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.app_prefix }}-server-service +spec: + clusterIP: None # headless service for gRPC load balancing + selector: + app: {{ .Values.app_prefix }}-server + ports: + - name: http + protocol: TCP + port: {{ .Values.server.port }} + targetPort: {{ .Values.server.port }} diff --git a/minikube/helm/dice/values.yaml b/minikube/helm/dice/values.yaml new file mode 100644 index 0000000..213d0df --- /dev/null +++ b/minikube/helm/dice/values.yaml @@ -0,0 +1,15 @@ +# Default values for dice. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +app_prefix: helm + +main: + image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64:latest + pullPolicy: Always + port: 3000 + +server: + image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64:latest + pullPolicy: Always + port: 3001 diff --git a/minikube/helm/k3s.yaml b/minikube/helm/k3s.yaml new file mode 100644 index 0000000..213d0df --- /dev/null +++ b/minikube/helm/k3s.yaml @@ -0,0 +1,15 @@ +# Default values for dice. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +app_prefix: helm + +main: + image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64:latest + pullPolicy: Always + port: 3000 + +server: + image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64:latest + pullPolicy: Always + port: 3001 diff --git a/minikube/helm/minikube.yaml b/minikube/helm/minikube.yaml new file mode 100644 index 0000000..bb36890 --- /dev/null +++ b/minikube/helm/minikube.yaml @@ -0,0 +1,15 @@ +# Default values for dice. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +app_prefix: helm + +main: + image: 0xfe/dice/main + pullPolicy: Never + port: 3000 + +server: + image: 0xfe/dice/server + pullPolicy: Never + port: 3001 From 5bbbab7a70fd80ced14574a55c81fc867a78c019 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 25 Nov 2022 11:04:00 -0500 Subject: [PATCH 124/180] Remove k8s -- now fully working with helm. --- minikube/README.md | 83 +++++++++----------------------- minikube/helm/dice/values.yaml | 3 +- minikube/k8s/config/envoy.yaml | 56 --------------------- minikube/k8s/envoy-depl.yaml | 40 --------------- minikube/k8s/ingress.yaml | 24 --------- minikube/k8s/main-depl-pi.yaml | 37 -------------- minikube/k8s/main-depl.yaml | 38 --------------- minikube/k8s/server-depl-pi.yaml | 35 -------------- minikube/k8s/server-depl.yaml | 36 -------------- 9 files changed, 26 insertions(+), 326 deletions(-) delete mode 100644 minikube/k8s/config/envoy.yaml delete mode 100644 minikube/k8s/envoy-depl.yaml delete mode 100644 minikube/k8s/ingress.yaml delete mode 100644 minikube/k8s/main-depl-pi.yaml delete mode 100644 minikube/k8s/main-depl.yaml delete mode 100644 minikube/k8s/server-depl-pi.yaml delete mode 100644 minikube/k8s/server-depl.yaml diff --git a/minikube/README.md b/minikube/README.md index 3149b58..4e16d92 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -7,6 +7,7 @@ This repo implements an end-to-end web and commandline "diceroll app" with a gRP - gRPC / Protobuf - Envoy for gRPC LB - cfssl for CA cert management +- Helm for templatized k8s configs ### Minikube - Minikube @@ -24,12 +25,13 @@ This repo implements an end-to-end web and commandline "diceroll app" with a gRP ### Subdirectories - `tls/` - Configs to generate TLS certs for root and intermediate CAs, and ingress -- `k8s/` - Kuberenetes configs (deployments, ingress, envoy) +- `helm/` - Helm templates for kuberenetes configs (deployments, ingress, envoy) = `dice/` - Protobuf schemas for Dice server - `server/` - gRPC server binary. Built with `server.Dockerfile`. - `client/` - gRPC client library. - `client/cmd` - Commandline tool that uses the client library to talk to the server - `main.go` - Web server that talks to the gRPC server. Exposes `/roll` and `/getrolls` +- `k8s/` (deprecated) - Kuberenetes configs (deployments, ingress, envoy) ## Quick Run @@ -55,53 +57,41 @@ $ grpcurl -plaintext -d '{"roller_handle": "0xfe"}' localhost:3001 RollService/R ### Quick Run with Helm -Check `values.yaml` in `helm/dice`. +Check `values.yaml` in `helm/dice` -- make sure your ingress hostnames are resolvable. + +#### On k3s ``` # Start on pikube helm install dice helm/dice -f helm/k3s.yaml -# Start on minikube -helm install dice helm/dice -f helm/k3s.yaml -k get pods +# Test +# k get ingress +$ curl pi0.dice.pikube/roll +$ curl pi1.dice.pikube/roll +# Status / uninstall helm list helm status dice helm uninstall dice -``` -## Run in k8s / minikube +# Test it in a new temp container +k run temppod --image=debian -it +apt update && apt install net-tools curl iproute2 +curl main-sevice:3000/roll +``` -### Start Minikube +#### On minkube ``` +# Make sure minikube is running (once only) minikube start eval $(minikube -p minikube docker-env) -``` - -### Depoly on minikube - -For Minikube, make sure deployment has "imagePullPolicy: Never". - -``` -# Once: enable nginx ingress controller minikube addons enable ingress -# Push envoy configs -k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml -k describe configmap envoy-conf - -# Start pods in -kubectl apply -f k8s/main-depl.yaml -kubectl apply -f k8s/server-depl.yaml -kubectl apply -f k8s/envoy-depl.yaml -kubectl apply -f k8s/ingress.yaml - -# Watch pods -kubectl get pods - -k get svc -k get endpoints +# Start on minikube (make sure you've built and pushed the container images first) +helm install dice helm/dice -f helm/minikube.yaml +k get pods # Get ingress IP address (takes about a minute) kubectl get ingress @@ -111,42 +101,17 @@ $ curl 192.168.49.2/roll # note: the backend is loadbalanced, so the response depends on which backend is hit $ curl 192.168.49.2/getrolls - -# To expose ports on the host (so you can connect from outside the machine), see the IPTables instructions below. ``` -### Deploy on k3s (in pikube) +### k3s vs minikube -Same as above, but for pi cluster. Key differences here: - -- images are hosted on Google Artifact Registry +- k3s images are hosted on Google Artifact Registry (minikube images are on local docker) + `ImagePullPolicy` is not `never` here. -- ingress controller is Traefik (unlike nginx above) +- k3s ingress controller is Traefik (unlike nginx for minikube) - pikube is a cluster or Raspberry Pis, so images must be target arm64 - ingress exposes ports on the nodes (like a real k8s cluster) + Minikube builds a separate internal network, so you need IP forwarding setup -``` -# Push envoy configs -k create configmap envoy-conf --from-file=./k8s/config/envoy.yaml - -# Start deployments -kubectl apply -f k8s/main-depl-pi.yaml -kubectl apply -f k8s/server-depl-pi.yaml -kubectl apply -f k8s/envoy-depl.yaml -kubectl apply -f k8s/ingress.yaml - -# Test (notice how ingress exposes port 80 on all Pi hosts) -k get ingress -curl pi0/roll -curl pi1/roll - -# Test it in a new temp container -k run temppod --image=debian -it -apt update && apt install net-tools curl iproute2 -curl main-sevice:3000/roll -``` - ## Debug ``` diff --git a/minikube/helm/dice/values.yaml b/minikube/helm/dice/values.yaml index 213d0df..a8c6ced 100644 --- a/minikube/helm/dice/values.yaml +++ b/minikube/helm/dice/values.yaml @@ -3,6 +3,7 @@ # Declare variables to be passed into your templates. app_prefix: helm +ingressHost: "*.dice.pikube" main: image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64:latest @@ -12,4 +13,4 @@ main: server: image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64:latest pullPolicy: Always - port: 3001 + port: 3001 \ No newline at end of file diff --git a/minikube/k8s/config/envoy.yaml b/minikube/k8s/config/envoy.yaml deleted file mode 100644 index b04f520..0000000 --- a/minikube/k8s/config/envoy.yaml +++ /dev/null @@ -1,56 +0,0 @@ -static_resources: - listeners: - - name: listener_0 - address: - socket_address: - address: 0.0.0.0 - port_value: 8443 - filter_chains: - - filters: - - name: envoy.filters.network.http_connection_manager - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager - access_log: - - name: envoy.access_loggers.stdout - typed_config: - "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog - codec_type: AUTO - stat_prefix: ingress_https - route_config: - name: local_route - virtual_hosts: - - name: https - domains: - - "*" - routes: - - match: - prefix: "/" - route: - cluster: server-grpc - max_grpc_timeout: 2s - http_filters: - - name: envoy.filters.http.router - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router - clusters: - - name: server-grpc - connect_timeout: 0.5s - type: STRICT_DNS - dns_lookup_family: V4_ONLY - lb_policy: ROUND_ROBIN - http2_protocol_options: {} - load_assignment: - cluster_name: server-grpc - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: server-service - port_value: 3001 -admin: - access_log_path: /dev/stdout - address: - socket_address: - address: 127.0.0.1 - port_value: 8090 \ No newline at end of file diff --git a/minikube/k8s/envoy-depl.yaml b/minikube/k8s/envoy-depl.yaml deleted file mode 100644 index 8dc4e69..0000000 --- a/minikube/k8s/envoy-depl.yaml +++ /dev/null @@ -1,40 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: envoy-deployment -spec: - replicas: 1 - selector: - matchLabels: - app: envoy - template: - metadata: - labels: - app: envoy - spec: - containers: - - name: envoy - image: envoyproxy/envoy-dev - ports: - - name: https - containerPort: 8443 - volumeMounts: - - name: config - mountPath: /etc/envoy - volumes: - - name: config - configMap: - name: envoy-conf ---- -apiVersion: v1 -kind: Service -metadata: - name: envoy -spec: - selector: - app: envoy - ports: - - name: https - protocol: TCP - port: 8443 - targetPort: 8443 \ No newline at end of file diff --git a/minikube/k8s/ingress.yaml b/minikube/k8s/ingress.yaml deleted file mode 100644 index d381f70..0000000 --- a/minikube/k8s/ingress.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: main-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: / -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: main-service - port: - number: 3000 - - path: /server - pathType: Prefix - backend: - service: - name: server-service - port: - number: 3001 \ No newline at end of file diff --git a/minikube/k8s/main-depl-pi.yaml b/minikube/k8s/main-depl-pi.yaml deleted file mode 100644 index 04db0e4..0000000 --- a/minikube/k8s/main-depl-pi.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: main-deployment - labels: - app: main -spec: - replicas: 3 - selector: - matchLabels: - app: main - template: - metadata: - labels: - app: main - spec: - containers: - - name: main - image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64:latest - env: - - name: DICE_GRPC_TARGET - value: "envoy:8443" - ports: - - containerPort: 3000 ---- -apiVersion: v1 -kind: Service -metadata: - name: main-service -spec: - selector: - app: main - ports: - - name: http - protocol: TCP - port: 3000 - targetPort: 3000 diff --git a/minikube/k8s/main-depl.yaml b/minikube/k8s/main-depl.yaml deleted file mode 100644 index ca36a5d..0000000 --- a/minikube/k8s/main-depl.yaml +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: main-deployment - labels: - app: main -spec: - replicas: 3 - selector: - matchLabels: - app: main - template: - metadata: - labels: - app: main - spec: - containers: - - name: main - image: 0xfe/dice/main - imagePullPolicy: Never - env: - - name: DICE_GRPC_TARGET - value: "envoy:8443" - ports: - - containerPort: 3000 ---- -apiVersion: v1 -kind: Service -metadata: - name: main-service -spec: - selector: - app: main - ports: - - name: http - protocol: TCP - port: 3000 - targetPort: 3000 diff --git a/minikube/k8s/server-depl-pi.yaml b/minikube/k8s/server-depl-pi.yaml deleted file mode 100644 index 2c9c684..0000000 --- a/minikube/k8s/server-depl-pi.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: server-deployment - labels: - app: server -spec: - replicas: 3 - selector: - matchLabels: - app: server - template: - metadata: - labels: - app: server - spec: - containers: - - name: server - image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/server.arm64:latest - ports: - - containerPort: 3001 ---- -apiVersion: v1 -kind: Service -metadata: - name: server-service -spec: - clusterIP: None # headless service for gRPC load balancing - selector: - app: server - ports: - - name: http - protocol: TCP - port: 3001 - targetPort: 3001 diff --git a/minikube/k8s/server-depl.yaml b/minikube/k8s/server-depl.yaml deleted file mode 100644 index 0106953..0000000 --- a/minikube/k8s/server-depl.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: server-deployment - labels: - app: server -spec: - replicas: 3 - selector: - matchLabels: - app: server - template: - metadata: - labels: - app: server - spec: - containers: - - name: server - image: 0xfe/dice/server - imagePullPolicy: Never - ports: - - containerPort: 3001 ---- -apiVersion: v1 -kind: Service -metadata: - name: server-service -spec: - clusterIP: None # headless service for gRPC load balancing - selector: - app: server - ports: - - name: http - protocol: TCP - port: 3001 - targetPort: 3001 From f2f66316b29ec01ba9b31521cb6627fe2f1223b3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 25 Nov 2022 11:12:49 -0500 Subject: [PATCH 125/180] Fixed incorrect DICE_GRPC_TARGET. Added ingress config. --- minikube/helm/dice/templates/ingress.yaml | 25 +++++++++++++++++++++ minikube/helm/dice/templates/main-depl.yaml | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 minikube/helm/dice/templates/ingress.yaml diff --git a/minikube/helm/dice/templates/ingress.yaml b/minikube/helm/dice/templates/ingress.yaml new file mode 100644 index 0000000..f477e58 --- /dev/null +++ b/minikube/helm/dice/templates/ingress.yaml @@ -0,0 +1,25 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ .Values.app_prefix }}-main-ingress + annotations: + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + rules: + - host: "{{ .Values.ingressHost }}" + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{ .Values.app_prefix }}-main-service + port: + number: {{ .Values.main.port }} + - path: /server + pathType: Prefix + backend: + service: + name: {{ .Values.app_prefix }}-server-service + port: + number: {{ .Values.server.port }} \ No newline at end of file diff --git a/minikube/helm/dice/templates/main-depl.yaml b/minikube/helm/dice/templates/main-depl.yaml index 213edd3..6e09642 100644 --- a/minikube/helm/dice/templates/main-depl.yaml +++ b/minikube/helm/dice/templates/main-depl.yaml @@ -20,7 +20,7 @@ spec: imagePullPolicy: {{ .Values.main.pullPolicy }} env: - name: DICE_GRPC_TARGET - value: "envoy:8443" + value: "{{ .Values.app_prefix }}-envoy:8443" ports: - containerPort: {{ .Values.main.port }} --- From 1d2662cc5bdcd4491145782298c54c69b35a393f Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 3 Dec 2022 22:00:49 -0500 Subject: [PATCH 126/180] Add persistent volume from NFS server. --- minikube/README.md | 82 ++++++++++++++++-------- minikube/helm/dice/Chart.yaml | 2 +- minikube/helm/dice/templates/nfs-pv.yaml | 18 ++++++ minikube/helm/dice/values.yaml | 2 + 4 files changed, 77 insertions(+), 27 deletions(-) create mode 100644 minikube/helm/dice/templates/nfs-pv.yaml diff --git a/minikube/README.md b/minikube/README.md index 4e16d92..3a36fa4 100644 --- a/minikube/README.md +++ b/minikube/README.md @@ -8,6 +8,7 @@ This repo implements an end-to-end web and commandline "diceroll app" with a gRP - Envoy for gRPC LB - cfssl for CA cert management - Helm for templatized k8s configs +- NFS for persistent volumes (mounted on external server) ### Minikube - Minikube @@ -103,6 +104,16 @@ $ curl 192.168.49.2/roll $ curl 192.168.49.2/getrolls ``` +### Updating k8s configs in helm charts + +- Add or change configs in `helm/dice/templates` +- Update the version in `helm/dice/Chart.yaml`. +- Then run: + +``` +$ helm upgrade dice helm/dice -f helm/k3s.yaml +``` + ### k3s vs minikube - k3s images are hosted on Google Artifact Registry (minikube images are on local docker) @@ -158,34 +169,8 @@ $ k top node # see k3s logs sudo journalctl -u k3s.service ``` - ## Build -### Install Protobuf and gRPC dependencies - -If you change the proto file, or this is your first build, then generate the protobuf stubs. - -``` -# Install dependencies -$ apt install -y protobuf-compiler -$ protoc --version # Ensure compiler version is 3+ - -# Install proto and grpc for Go -$ go get -u google.golang.org/protobuf/cmd/protoc-gen-go -$ go install google.golang.org/protobuf/cmd/protoc-gen-go -$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest -$ go get google.golang.org/grpc - -# grpcurl utility -$ go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest - -# Build protos -$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto - -# Run server -$ go run server/main.go -``` - ### Build container image Minikube runs its own dockerd and container registry. If you're building to run without minikube then: @@ -234,12 +219,57 @@ netstat -nap | grep LIST | grep tcp If you don't see ports on `netstat`, then unset DOCKER_* env variables. +### Install Protobuf and gRPC dependencies + +If you change the proto file, or this is your first build, then generate the protobuf stubs. + +``` +# Install dependencies +$ apt install -y protobuf-compiler +$ protoc --version # Ensure compiler version is 3+ + +# Install proto and grpc for Go +$ go get -u google.golang.org/protobuf/cmd/protoc-gen-go +$ go install google.golang.org/protobuf/cmd/protoc-gen-go +$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest +$ go get google.golang.org/grpc + +# grpcurl utility +$ go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest + +# Build protos +$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative dice.proto + +# Run server +$ go run server/main.go +``` + ## Networking ### Setup TLS certs See [tls/README.md](https://github.com/0xfe/experiments/tree/master/minikube/tls/README.md) for details. +### Setup NFS server on nuc + +``` +$ sudo apt install nfs-kernel-server +$ sudo mkdir -p /opt/nfs_share +$ sudo chown -R nobody:nogroup /opt/nfs_share/ +$ sudo chmod 777 /mnt/nfs_share/ + +$ sudo vi /etc/exports +/opt/nfs_share 192.168.16.1/24(rw,sync,no_subtree_check) + +$ sudo exportfs -a +$ sudo systemctl restart nfs-kernel-server + +# Allow access to all pis from NFS server +for host in pi0 pi1 pi2 pi3; do sudo ufw allow from `dig $host +short` to any port nfs; done +``` + + + ### Forward ports from outside world to ingress This is needed on minikube since it builds a separate internal network that isn't exposed on the host. For pikube, no need to do this (like a real k8s cluster.) diff --git a/minikube/helm/dice/Chart.yaml b/minikube/helm/dice/Chart.yaml index e3e120d..1e8c123 100644 --- a/minikube/helm/dice/Chart.yaml +++ b/minikube/helm/dice/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 +version: 0.1.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/minikube/helm/dice/templates/nfs-pv.yaml b/minikube/helm/dice/templates/nfs-pv.yaml new file mode 100644 index 0000000..afcce67 --- /dev/null +++ b/minikube/helm/dice/templates/nfs-pv.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ .Values.app_prefix }}-nfs1 +spec: + capacity: + storage: 10Gi + accessModes: + - ReadWriteMany + nfs: + server: {{ .Values.nfs_server }} + path: {{ .Values.nfs_path }} + volumeMode: Filesystem + persistentVolumeReclaimPolicy: Retain + storageClassName: nfs + mountOptions: + - hard + - nfsvers=4.2 \ No newline at end of file diff --git a/minikube/helm/dice/values.yaml b/minikube/helm/dice/values.yaml index a8c6ced..7fe2352 100644 --- a/minikube/helm/dice/values.yaml +++ b/minikube/helm/dice/values.yaml @@ -4,6 +4,8 @@ app_prefix: helm ingressHost: "*.dice.pikube" +nfs_server: nuc +nfs_path: "/opt/nfs_share" main: image: northamerica-northeast2-docker.pkg.dev/pikube-369400/k3s/dice/main.arm64:latest From 4534986f245927f1fefe72229ce40f98ef0ad450 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 18 Dec 2022 09:37:23 -0500 Subject: [PATCH 127/180] Added rust gitignore. --- rust/.gitignore | 1 + rust/echo/src/main.rs | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 rust/.gitignore diff --git a/rust/.gitignore b/rust/.gitignore new file mode 100644 index 0000000..2f7896d --- /dev/null +++ b/rust/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/rust/echo/src/main.rs b/rust/echo/src/main.rs index 1b08216..eac8bf2 100644 --- a/rust/echo/src/main.rs +++ b/rust/echo/src/main.rs @@ -1,3 +1,5 @@ +use std::net::SocketAddr; + use tokio::{ io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::TcpListener, @@ -10,7 +12,7 @@ async fn main() { let listener = TcpListener::bind("127.0.0.1:4040").await.unwrap(); - let (tx, _rx) = broadcast::channel::(10); + let (tx, _rx) = broadcast::channel(10); loop { let (mut socket, addr) = listener.accept().await.unwrap(); @@ -31,15 +33,17 @@ async fn main() { break; } - tx.send(line.clone()).unwrap(); + tx.send((addr, line.clone())).unwrap(); line.clear(); } _ = rx.recv() => { - let msg = rx.recv().await.unwrap(); + let (other_addr, msg) = rx.recv().await.unwrap(); println!("Received: {:?}", msg); - writer.write_all(line.as_bytes()).await.unwrap(); + if addr != other_addr { + writer.write_all(line.as_bytes()).await.unwrap(); + } } } } From fcf329b8ffc8faff0c2df41a79b1993759f35419 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 30 Jan 2023 10:29:55 -0500 Subject: [PATCH 128/180] First checkin of EMDR. --- emdr/.gitignore | 2 + emdr/README.md | 7 + emdr/index.html | 14 + emdr/package-lock.json | 6838 ++++++++++++++++++++++++++++++++++++++++ emdr/package.json | 22 + emdr/src/index.ts | 37 + emdr/tsconfig.json | 7 + emdr/webpack.config.js | 32 + rust/hello/src/args.rs | 2 + 9 files changed, 6961 insertions(+) create mode 100644 emdr/.gitignore create mode 100644 emdr/README.md create mode 100644 emdr/index.html create mode 100644 emdr/package-lock.json create mode 100644 emdr/package.json create mode 100644 emdr/src/index.ts create mode 100644 emdr/tsconfig.json create mode 100644 emdr/webpack.config.js diff --git a/emdr/.gitignore b/emdr/.gitignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/emdr/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/emdr/README.md b/emdr/README.md new file mode 100644 index 0000000..f71225b --- /dev/null +++ b/emdr/README.md @@ -0,0 +1,7 @@ +# EMDR Remote + +## Run + +``` +npm run develop +``` diff --git a/emdr/index.html b/emdr/index.html new file mode 100644 index 0000000..bcc796d --- /dev/null +++ b/emdr/index.html @@ -0,0 +1,14 @@ + + + + + +
+
+

Hello world

+ + +
+
+ + \ No newline at end of file diff --git a/emdr/package-lock.json b/emdr/package-lock.json new file mode 100644 index 0000000..58ef42a --- /dev/null +++ b/emdr/package-lock.json @@ -0,0 +1,6838 @@ +{ + "name": "emdr", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "emdr", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "html-webpack-plugin": "^5.5.0", + "ts-loader": "^9.4.2", + "typescript": "^4.9.4", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", + "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001449", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz", + "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz", + "integrity": "sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, + "dependencies": { + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", + "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", + "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", + "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "caniuse-lite": { + "version": "1.0.30001449", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz", + "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz", + "integrity": "sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + }, + "webpack-cli": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", + "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.1", + "colorette": "^2.0.14", + "commander": "^9.4.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/emdr/package.json b/emdr/package.json new file mode 100644 index 0000000..462634e --- /dev/null +++ b/emdr/package.json @@ -0,0 +1,22 @@ +{ + "name": "emdr", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "develop": "webpack-dev-server --mode development", + "build": "webpack --mode production" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "html-webpack-plugin": "^5.5.0", + "ts-loader": "^9.4.2", + "typescript": "^4.9.4", + "webpack": "^5.75.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" + } +} diff --git a/emdr/src/index.ts b/emdr/src/index.ts new file mode 100644 index 0000000..524afd2 --- /dev/null +++ b/emdr/src/index.ts @@ -0,0 +1,37 @@ +function drawCircle() { + const svgns = "http://www.w3.org/2000/svg"; + const container = document.getElementById( 'cont' ); + let circle = document.createElementNS(svgns, 'circle'); + circle.setAttribute("id", "circle1"); + circle.setAttributeNS(null, 'cx', "300"); + circle.setAttributeNS(null, 'cy', "300"); + circle.setAttributeNS(null, 'r', "50"); + circle.setAttributeNS(null, 'style', 'fill: none; stroke: blue; stroke-width: 1px;' ); + container.appendChild(circle); +} + +function animate() { + let cx = 10; + let step = 2; + + const circle = document.getElementById('circle1'); + + setInterval(function () { + circle.setAttributeNS(null, 'cx', cx.toString()) + + cx += step; + if (cx > 800) { + step = -2; + } else if (cx < 20) { + step = 2; + } + }, 20); +} + +function main() { + console.log("Hello world!") + drawCircle(); + animate(); +} + +main(); \ No newline at end of file diff --git a/emdr/tsconfig.json b/emdr/tsconfig.json new file mode 100644 index 0000000..4222d68 --- /dev/null +++ b/emdr/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "noImplicitAny": true, + "target": "ES5", + "module": "ES2015" + } +} \ No newline at end of file diff --git a/emdr/webpack.config.js b/emdr/webpack.config.js new file mode 100644 index 0000000..202a023 --- /dev/null +++ b/emdr/webpack.config.js @@ -0,0 +1,32 @@ +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const path = require('path'); + +module.exports = { + entry: './src/index.ts', + module: { + rules: [ + { + test: /\.ts?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, + output: { + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + }, + devServer: { + static: path.join(__dirname, "dist"), + compress: true, + port: 4000, + }, + plugins: [ + new HtmlWebpackPlugin({ + title: 'Remote EMDR', + template: 'index.html' }) + ], +}; \ No newline at end of file diff --git a/rust/hello/src/args.rs b/rust/hello/src/args.rs index 8acefdf..2ba9ac1 100644 --- a/rust/hello/src/args.rs +++ b/rust/hello/src/args.rs @@ -19,4 +19,6 @@ pub fn run() { let boo = mo.clone(); println!("boo {:?}", boo); + + println!("{}, {}", boo.i, boo.f); } \ No newline at end of file From 2f48442774dd929f6f5acd60443a8e0c95fa8633 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 30 Jan 2023 18:33:37 -0500 Subject: [PATCH 129/180] Start stop and change speed. --- emdr/index.html | 11 ++++++++--- emdr/src/index.ts | 41 ++++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/emdr/index.html b/emdr/index.html index bcc796d..311d86a 100644 --- a/emdr/index.html +++ b/emdr/index.html @@ -5,10 +5,15 @@
-

Hello world

- +

Remote EMDR

+
-
+ + + \ No newline at end of file diff --git a/emdr/src/index.ts b/emdr/src/index.ts index 524afd2..30ea162 100644 --- a/emdr/src/index.ts +++ b/emdr/src/index.ts @@ -1,37 +1,52 @@ function drawCircle() { const svgns = "http://www.w3.org/2000/svg"; const container = document.getElementById( 'cont' ); + console.log("cont:", container.getBoundingClientRect()); let circle = document.createElementNS(svgns, 'circle'); circle.setAttribute("id", "circle1"); circle.setAttributeNS(null, 'cx', "300"); circle.setAttributeNS(null, 'cy', "300"); - circle.setAttributeNS(null, 'r', "50"); - circle.setAttributeNS(null, 'style', 'fill: none; stroke: blue; stroke-width: 1px;' ); + circle.setAttributeNS(null, 'r', "30"); + circle.setAttributeNS(null, 'style', 'fill: red; stroke: gray; stroke-width: 2px;' ); container.appendChild(circle); } -function animate() { - let cx = 10; - let step = 2; +function animate(speed: number): NodeJS.Timer { + let cx = 300; + let step = speed; + const container = document.getElementById( 'cont' ); + const width = container.getBoundingClientRect().width; const circle = document.getElementById('circle1'); - setInterval(function () { + const timer = setInterval(function () { circle.setAttributeNS(null, 'cx', cx.toString()) cx += step; - if (cx > 800) { - step = -2; - } else if (cx < 20) { - step = 2; + if (cx > width - 100) { + step = -speed; + } else if (cx < 100) { + step = speed; } - }, 20); + }, 5); + + return timer; } function main() { - console.log("Hello world!") + const step = 10; drawCircle(); - animate(); + let timer = animate(step); + + const startstop = document.getElementById("startstop"); + startstop.addEventListener("click", function(event) { + if (timer) { + clearInterval(timer); + timer = null; + } else { + timer = animate(step); + } + }); } main(); \ No newline at end of file From cb3af179c63ef1f1c188bd46d1aab42ee8b8ac90 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 2 Feb 2023 22:21:19 -0500 Subject: [PATCH 130/180] Encapsulated Circle and Bouncer in classes. --- emdr/src/index.ts | 129 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 89 insertions(+), 40 deletions(-) diff --git a/emdr/src/index.ts b/emdr/src/index.ts index 30ea162..3028cb8 100644 --- a/emdr/src/index.ts +++ b/emdr/src/index.ts @@ -1,52 +1,101 @@ -function drawCircle() { - const svgns = "http://www.w3.org/2000/svg"; - const container = document.getElementById( 'cont' ); - console.log("cont:", container.getBoundingClientRect()); - let circle = document.createElementNS(svgns, 'circle'); - circle.setAttribute("id", "circle1"); - circle.setAttributeNS(null, 'cx', "300"); - circle.setAttributeNS(null, 'cy', "300"); - circle.setAttributeNS(null, 'r', "30"); - circle.setAttributeNS(null, 'style', 'fill: red; stroke: gray; stroke-width: 2px;' ); - container.appendChild(circle); +class Circle { + x: number; + y: number; + radius: number; + style: string; + el: SVGElement; + + constructor(x:number, y:number, radius: number) { + this.x = x; + this.y = y; + this.radius = radius; + this.style = 'fill: red; stroke: gray; stroke-width: 2px;'; + } + + setStyle(style: string) { + this.style = style; + } + + createElement(containerEl: string) { + const svgns = "http://www.w3.org/2000/svg"; + this.el = document.createElementNS(svgns, 'circle'); + let container = document.getElementById(containerEl); + this.el.setAttribute("id", "circle1"); + this.el.setAttributeNS(null, 'cx', this.x.toString()); + this.el.setAttributeNS(null, 'cy', this.y.toString()); + this.el.setAttributeNS(null, 'r', this.radius.toString()); + this.el.setAttributeNS(null, 'style', this.style); + container.appendChild(this.el); + return this; + } + + moveTo(x: number, y: number) { + this.x = x; + this.y = y; + this.el.setAttributeNS(null, 'cx', x.toString()); + this.el.setAttributeNS(null, 'cy', y.toString()); + } } -function animate(speed: number): NodeJS.Timer { - let cx = 300; - let step = speed; - const container = document.getElementById( 'cont' ); - const width = container.getBoundingClientRect().width; +class Bouncer { + circle: Circle; + x: number; + minX: number; + maxX: number; + speed: number; + timer: NodeJS.Timer; + running: boolean; - const circle = document.getElementById('circle1'); + constructor(circle: Circle) { + this.circle = circle; + this.x = circle.x; + this.minX = circle.x; + this.maxX = circle.x + 20; + this.speed = 20; + this.running = false; + } - const timer = setInterval(function () { - circle.setAttributeNS(null, 'cx', cx.toString()) + setBounds(minX: number, maxX: number) { + this.minX = minX; + this.maxX = maxX; + } + + start() { + let step = this.speed; + const that = this; + const interval_ms = 5; + this.timer = setInterval(function() { + that.circle.moveTo(that.x, that.circle.y); + that.x += step; + if (that.x > that.maxX) { + step = -that.speed; + } else if (that.x < that.minX) { + step = that.speed; + } + }, interval_ms); + this.running = true; + } - cx += step; - if (cx > width - 100) { - step = -speed; - } else if (cx < 100) { - step = speed; - } - }, 5); + stop() { + clearInterval(this.timer); + this.running = false; + } - return timer; + toggle() { + this.running ? this.stop() : this.start(); + } } function main() { - const step = 10; - drawCircle(); - let timer = animate(step); - - const startstop = document.getElementById("startstop"); - startstop.addEventListener("click", function(event) { - if (timer) { - clearInterval(timer); - timer = null; - } else { - timer = animate(step); - } - }); + const container = document.getElementById( 'cont' ); + const width = container.getBoundingClientRect().width; + const bouncer = new Bouncer(new Circle(300, 300, 30).createElement("cont")); + bouncer.setBounds(100, width - 100); + + const startstop = document.getElementById("startstop"); + startstop.addEventListener("click", function(event) { + bouncer.toggle(); + }); } main(); \ No newline at end of file From c23df267ed11896df3a65de4620adeea27d38bc3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 3 Feb 2023 08:01:27 -0500 Subject: [PATCH 131/180] Separated classes into their own files. --- emdr/src/bouncer.ts | 50 +++++++++++++++++++++++++ emdr/src/circle.ts | 38 +++++++++++++++++++ emdr/src/index.ts | 89 +-------------------------------------------- 3 files changed, 90 insertions(+), 87 deletions(-) create mode 100644 emdr/src/bouncer.ts create mode 100644 emdr/src/circle.ts diff --git a/emdr/src/bouncer.ts b/emdr/src/bouncer.ts new file mode 100644 index 0000000..f7f2a17 --- /dev/null +++ b/emdr/src/bouncer.ts @@ -0,0 +1,50 @@ +import Circle from './circle'; + +export default class Bouncer { + circle: Circle; + x: number; + minX: number; + maxX: number; + speed: number; + timer: NodeJS.Timer; + running: boolean; + + constructor(circle: Circle) { + this.circle = circle; + this.x = circle.x; + this.minX = circle.x; + this.maxX = circle.x + 20; + this.speed = 10; + this.running = false; + } + + setBounds(minX: number, maxX: number) { + this.minX = minX; + this.maxX = maxX; + } + + start() { + let step = this.speed; + const that = this; + const interval_ms = 5; + this.timer = setInterval(function() { + that.circle.moveTo(that.x, that.circle.y); + that.x += step; + if (that.x > that.maxX) { + step = -that.speed; + } else if (that.x < that.minX) { + step = that.speed; + } + }, interval_ms); + this.running = true; + } + + stop() { + clearInterval(this.timer); + this.running = false; + } + + toggle() { + this.running ? this.stop() : this.start(); + } +} \ No newline at end of file diff --git a/emdr/src/circle.ts b/emdr/src/circle.ts new file mode 100644 index 0000000..4fb1dfb --- /dev/null +++ b/emdr/src/circle.ts @@ -0,0 +1,38 @@ +export default class Circle { + x: number; + y: number; + radius: number; + style: string; + el: SVGElement; + + constructor(x:number, y:number, radius: number) { + this.x = x; + this.y = y; + this.radius = radius; + this.style = 'fill: red; stroke: gray; stroke-width: 2px;'; + } + + setStyle(style: string) { + this.style = style; + } + + createElement(containerEl: string) { + const svgns = "http://www.w3.org/2000/svg"; + this.el = document.createElementNS(svgns, 'circle'); + let container = document.getElementById(containerEl); + this.el.setAttribute("id", "circle1"); + this.el.setAttributeNS(null, 'cx', this.x.toString()); + this.el.setAttributeNS(null, 'cy', this.y.toString()); + this.el.setAttributeNS(null, 'r', this.radius.toString()); + this.el.setAttributeNS(null, 'style', this.style); + container.appendChild(this.el); + return this; + } + + moveTo(x: number, y: number) { + this.x = x; + this.y = y; + this.el.setAttributeNS(null, 'cx', x.toString()); + this.el.setAttributeNS(null, 'cy', y.toString()); + } +} diff --git a/emdr/src/index.ts b/emdr/src/index.ts index 3028cb8..582b7b1 100644 --- a/emdr/src/index.ts +++ b/emdr/src/index.ts @@ -1,90 +1,5 @@ -class Circle { - x: number; - y: number; - radius: number; - style: string; - el: SVGElement; - - constructor(x:number, y:number, radius: number) { - this.x = x; - this.y = y; - this.radius = radius; - this.style = 'fill: red; stroke: gray; stroke-width: 2px;'; - } - - setStyle(style: string) { - this.style = style; - } - - createElement(containerEl: string) { - const svgns = "http://www.w3.org/2000/svg"; - this.el = document.createElementNS(svgns, 'circle'); - let container = document.getElementById(containerEl); - this.el.setAttribute("id", "circle1"); - this.el.setAttributeNS(null, 'cx', this.x.toString()); - this.el.setAttributeNS(null, 'cy', this.y.toString()); - this.el.setAttributeNS(null, 'r', this.radius.toString()); - this.el.setAttributeNS(null, 'style', this.style); - container.appendChild(this.el); - return this; - } - - moveTo(x: number, y: number) { - this.x = x; - this.y = y; - this.el.setAttributeNS(null, 'cx', x.toString()); - this.el.setAttributeNS(null, 'cy', y.toString()); - } -} - -class Bouncer { - circle: Circle; - x: number; - minX: number; - maxX: number; - speed: number; - timer: NodeJS.Timer; - running: boolean; - - constructor(circle: Circle) { - this.circle = circle; - this.x = circle.x; - this.minX = circle.x; - this.maxX = circle.x + 20; - this.speed = 20; - this.running = false; - } - - setBounds(minX: number, maxX: number) { - this.minX = minX; - this.maxX = maxX; - } - - start() { - let step = this.speed; - const that = this; - const interval_ms = 5; - this.timer = setInterval(function() { - that.circle.moveTo(that.x, that.circle.y); - that.x += step; - if (that.x > that.maxX) { - step = -that.speed; - } else if (that.x < that.minX) { - step = that.speed; - } - }, interval_ms); - this.running = true; - } - - stop() { - clearInterval(this.timer); - this.running = false; - } - - toggle() { - this.running ? this.stop() : this.start(); - } -} +import Circle from './circle'; +import Bouncer from './bouncer'; function main() { const container = document.getElementById( 'cont' ); From 38ef5fe530b8cf9017516def48eb649109a010e5 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 3 Feb 2023 16:14:24 -0500 Subject: [PATCH 132/180] Added CSS, some code cleanup. --- emdr/.eslintrc | 18 + emdr/index.html | 19 +- emdr/package-lock.json | 2562 +++++++++++++++++++++++++++++++++++-- emdr/package.json | 6 + emdr/src/bouncer.ts | 26 +- emdr/src/circle.ts | 2 +- emdr/src/index.ts | 18 +- emdr/src/static/index.css | 107 ++ emdr/webpack.config.js | 7 +- 9 files changed, 2615 insertions(+), 150 deletions(-) create mode 100644 emdr/.eslintrc create mode 100644 emdr/src/static/index.css diff --git a/emdr/.eslintrc b/emdr/.eslintrc new file mode 100644 index 0000000..924f042 --- /dev/null +++ b/emdr/.eslintrc @@ -0,0 +1,18 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint", + "prettier" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "rules": { + "no-console": 1, // Means warning + "prettier/prettier": 2 // Means error + } +} \ No newline at end of file diff --git a/emdr/index.html b/emdr/index.html index 311d86a..bb67158 100644 --- a/emdr/index.html +++ b/emdr/index.html @@ -1,19 +1,22 @@ + -
-
+
+

Remote EMDR

- + -
-
+
- \ No newline at end of file diff --git a/emdr/package-lock.json b/emdr/package-lock.json index 58ef42a..89af310 100644 --- a/emdr/package-lock.json +++ b/emdr/package-lock.json @@ -9,7 +9,13 @@ "version": "1.0.0", "license": "ISC", "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/parser": "^5.50.0", + "css-loader": "^6.7.3", + "eslint": "^8.33.0", "html-webpack-plugin": "^5.5.0", + "prettier": "^2.8.3", + "style-loader": "^3.3.1", "ts-loader": "^9.4.2", "typescript": "^4.9.4", "webpack": "^5.75.0", @@ -26,6 +32,108 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -90,6 +198,41 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -228,6 +371,12 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", @@ -262,7 +411,287 @@ "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dev": true, "dependencies": { - "@types/node": "*" + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", + "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/type-utils": "5.50.0", + "@typescript-eslint/utils": "5.50.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", + "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", + "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/utils": "5.50.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", + "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.50.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@webassemblyjs/ast": { @@ -501,6 +930,15 @@ "acorn": "^8" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -614,12 +1052,27 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -770,6 +1223,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -1011,6 +1473,32 @@ "node": ">= 8" } }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -1039,6 +1527,18 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1048,6 +1548,12 @@ "ms": "2.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -1094,6 +1600,18 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -1112,6 +1630,18 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -1262,6 +1792,74 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -1275,6 +1873,198 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -1305,6 +2095,15 @@ "node": ">=4.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1406,12 +2205,34 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -1421,6 +2242,15 @@ "node": ">= 4.9.1" } }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -1433,6 +2263,18 @@ "node": ">=0.8.0" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1469,13 +2311,32 @@ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -1610,12 +2471,53 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -1871,6 +2773,52 @@ "node": ">=0.10.0" } }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -1890,6 +2838,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1993,6 +2950,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -2091,6 +3057,28 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -2103,6 +3091,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2112,6 +3106,19 @@ "node": ">=0.10.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2139,6 +3146,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -2193,6 +3206,15 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2294,6 +3316,30 @@ "multicast-dns": "cli.js" } }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2444,6 +3490,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -2503,6 +3566,18 @@ "tslib": "^2.0.3" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2561,6 +3636,15 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -2591,6 +3675,132 @@ "node": ">=8" } }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", + "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -2653,6 +3863,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2733,6 +3963,18 @@ "node": ">= 10.13.0" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -2817,6 +4059,16 @@ "node": ">= 4" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2832,6 +4084,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3085,6 +4360,15 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -3105,6 +4389,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -3230,6 +4523,34 @@ "node": ">=6" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3315,6 +4636,12 @@ } } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -3367,6 +4694,51 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -3849,6 +5221,15 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3881,6 +5262,18 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -3890,6 +5283,80 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -3945,6 +5412,32 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -4044,80 +5537,253 @@ "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", + "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/type-utils": "5.50.0", + "@typescript-eslint/utils": "5.50.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", + "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" } }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "@typescript-eslint/type-utils": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", + "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", "dev": true, "requires": { - "@types/express": "*" + "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/utils": "5.50.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "@typescript-eslint/types": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "dev": true, "requires": { - "@types/mime": "*", - "@types/node": "*" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "@typescript-eslint/utils": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", + "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "dev": true, "requires": { - "@types/node": "*" + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" } }, - "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "@typescript-eslint/visitor-keys": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "requires": { - "@types/node": "*" + "@typescript-eslint/types": "5.50.0", + "eslint-visitor-keys": "^3.3.0" } }, "@webassemblyjs/ast": { @@ -4322,6 +5988,13 @@ "dev": true, "requires": {} }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4401,12 +6074,24 @@ "picomatch": "^2.0.4" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4524,6 +6209,12 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", @@ -4707,6 +6398,22 @@ "which": "^2.0.1" } }, + "css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + } + }, "css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -4726,6 +6433,12 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4735,6 +6448,12 @@ "ms": "2.0.0" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -4768,6 +6487,15 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -4783,6 +6511,15 @@ "@leichtgewicht/ip-codec": "^2.0.1" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -4835,76 +6572,259 @@ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" } }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "esrecurse": { @@ -4930,6 +6850,12 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -5018,18 +6944,46 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -5039,6 +6993,15 @@ "websocket-driver": ">=0.5.1" } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5073,6 +7036,22 @@ "path-exists": "^4.0.0" } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -5162,12 +7141,41 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -5363,6 +7371,37 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -5373,6 +7412,12 @@ "resolve-cwd": "^3.0.0" } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5446,6 +7491,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -5516,6 +7567,21 @@ } } }, + "js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -5528,12 +7594,28 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -5555,6 +7637,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -5600,6 +7688,12 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -5674,6 +7768,24 @@ "thunky": "^1.0.2" } }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -5788,6 +7900,20 @@ "is-wsl": "^2.2.0" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -5832,6 +7958,15 @@ "tslib": "^2.0.3" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -5878,6 +8013,12 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -5899,6 +8040,81 @@ "find-up": "^4.0.0" } }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz", + "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==", + "dev": true + }, "pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -5948,6 +8164,12 @@ "side-channel": "^1.0.4" } }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -6012,6 +8234,12 @@ "resolve": "^1.20.0" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -6075,6 +8303,12 @@ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6084,6 +8318,15 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -6281,6 +8524,12 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -6298,6 +8547,12 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -6399,6 +8654,19 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "requires": {} + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6445,6 +8713,12 @@ "terser": "^5.14.1" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -6484,6 +8758,38 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -6815,6 +9121,12 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6833,6 +9145,12 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/emdr/package.json b/emdr/package.json index 462634e..986c0e3 100644 --- a/emdr/package.json +++ b/emdr/package.json @@ -12,7 +12,13 @@ "author": "", "license": "ISC", "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/parser": "^5.50.0", + "css-loader": "^6.7.3", + "eslint": "^8.33.0", "html-webpack-plugin": "^5.5.0", + "prettier": "^2.8.3", + "style-loader": "^3.3.1", "ts-loader": "^9.4.2", "typescript": "^4.9.4", "webpack": "^5.75.0", diff --git a/emdr/src/bouncer.ts b/emdr/src/bouncer.ts index f7f2a17..e48a92d 100644 --- a/emdr/src/bouncer.ts +++ b/emdr/src/bouncer.ts @@ -23,23 +23,31 @@ export default class Bouncer { this.maxX = maxX; } + setSpeed(speed: number) { + this.speed = speed; + } + start() { - let step = this.speed; - const that = this; + if (this.running) return; + + let direction = 1; const interval_ms = 5; - this.timer = setInterval(function() { - that.circle.moveTo(that.x, that.circle.y); - that.x += step; - if (that.x > that.maxX) { - step = -that.speed; - } else if (that.x < that.minX) { - step = that.speed; + + this.timer = setInterval(() => { + this.circle.moveTo(this.x, this.circle.y); + this.x += this.speed * direction; + if (this.x > this.maxX) { + direction = -1; + } else if (this.x < this.minX) { + direction = 1; } }, interval_ms); this.running = true; } stop() { + if (!this.running) return; + clearInterval(this.timer); this.running = false; } diff --git a/emdr/src/circle.ts b/emdr/src/circle.ts index 4fb1dfb..710d171 100644 --- a/emdr/src/circle.ts +++ b/emdr/src/circle.ts @@ -19,7 +19,7 @@ export default class Circle { createElement(containerEl: string) { const svgns = "http://www.w3.org/2000/svg"; this.el = document.createElementNS(svgns, 'circle'); - let container = document.getElementById(containerEl); + const container = document.getElementById(containerEl); this.el.setAttribute("id", "circle1"); this.el.setAttributeNS(null, 'cx', this.x.toString()); this.el.setAttributeNS(null, 'cy', this.y.toString()); diff --git a/emdr/src/index.ts b/emdr/src/index.ts index 582b7b1..8b48eff 100644 --- a/emdr/src/index.ts +++ b/emdr/src/index.ts @@ -1,15 +1,23 @@ import Circle from './circle'; import Bouncer from './bouncer'; +import './static/index.css' + function main() { - const container = document.getElementById( 'cont' ); - const width = container.getBoundingClientRect().width; - const bouncer = new Bouncer(new Circle(300, 300, 30).createElement("cont")); + const circlebox = document.getElementById( 'circlebox' ); + const width = circlebox.getBoundingClientRect().width; + const bouncer = new Bouncer(new Circle(300, 300, 30).createElement("circlebox")); bouncer.setBounds(100, width - 100); - const startstop = document.getElementById("startstop"); - startstop.addEventListener("click", function(event) { + const startstopEl = document.getElementById("startstop") as HTMLButtonElement; + startstopEl.addEventListener("click", function() { bouncer.toggle(); + startstopEl.innerHTML = bouncer.running ? "Stop" : "Start"; + }); + + const speedEl = document.getElementById("speed") as HTMLInputElement; + speedEl.addEventListener('change', function() { + bouncer.setSpeed(Number(speedEl.value)); }); } diff --git a/emdr/src/static/index.css b/emdr/src/static/index.css new file mode 100644 index 0000000..9eb0b0b --- /dev/null +++ b/emdr/src/static/index.css @@ -0,0 +1,107 @@ +* { + margin: 0; + padding: 0; +} + +/* CSS custom properties: https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties */ +:root { + --panel-bgcolor: rgb(206, 182, 221); + --page-bgcolor: 'whitesmoke'; +} + + +html { + font-family: sans-serif; + font-size: 16px; + color: rgb(93, 56, 97); + background: var(--page-bgcolor); +} + +button, +input, +select, +textarea { + font-family : inherit; + font-size : 100%; + box-sizing: border-box; +} + +body { + margin: auto; +} + +a { + text-decoration: none; + color: #173F5f; +} + +h3 { + color: rgb(151, 90, 158); +} + +input, button { + background: var(--panel-bgcolor); + color: rgb(93, 56, 97); + font-size: 1.5rem; + padding: 0.6rem; + border: 0.2rem solid rgb(197, 141, 233); + border-radius: 0.2rem; + transition-duration: 0.3s; +} + +input:invalid { + background: rgb(153, 106, 106); + color: gainsboro; +} + +button:hover { + background: rgb(197, 141, 233); +} + +button:disabled { + background: rgb(226, 225, 225); + border: 0.2rem solid gray; + color: gray; +} + +.container { + width: 100%; + padding: 2em; +} + +.footer { + padding-top: 2em; + padding-bottom: 1em; + width: 100%; + margin: auto; + text-align: center; + font-size: 1em; +} + +.menu { + margin: auto; + text-align: center; + padding: 1em; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.center { + width: 100%; + text-align: center; + display: inline-block; +} + +.back-button, .connect-button { + font-size: 1rem; +} + +.panel { + background: white; + padding: 1rem; + border-radius: 0.5rem; + box-shadow: 0.1em 0.1em 0.4em 0.1em #ccc; + opacity: 0.8; +} \ No newline at end of file diff --git a/emdr/webpack.config.js b/emdr/webpack.config.js index 202a023..3ac9f40 100644 --- a/emdr/webpack.config.js +++ b/emdr/webpack.config.js @@ -5,11 +5,8 @@ module.exports = { entry: './src/index.ts', module: { rules: [ - { - test: /\.ts?$/, - use: 'ts-loader', - exclude: /node_modules/, - }, + { test: /\.ts?$/, use: 'ts-loader', exclude: /node_modules/, }, + { test: /\.css$/, use: ['style-loader', 'css-loader'] }, ], }, resolve: { From fde3463fbd457c9527dcc3c41054435be9d05f86 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 9 Feb 2023 09:11:54 -0500 Subject: [PATCH 133/180] Added rust iterators experiment. --- emdr/index.html | 5 +- emdr/package-lock.json | 109 ++++++++++++++++++++++++++++--- emdr/package.json | 4 ++ emdr/src/api.ts | 127 ++++++++++++++++++++++++++++++++++++ emdr/src/circle.ts | 22 ++++--- emdr/src/logger.ts | 33 ++++++++++ rust/hello/src/iterators.rs | 38 +++++++++++ rust/hello/src/main.rs | 2 + 8 files changed, 321 insertions(+), 19 deletions(-) create mode 100644 emdr/src/api.ts create mode 100644 emdr/src/logger.ts create mode 100644 rust/hello/src/iterators.rs diff --git a/emdr/index.html b/emdr/index.html index bb67158..4cf008b 100644 --- a/emdr/index.html +++ b/emdr/index.html @@ -12,9 +12,12 @@

Remote EMDR

diff --git a/emdr/package-lock.json b/emdr/package-lock.json index 89af310..08b71f2 100644 --- a/emdr/package-lock.json +++ b/emdr/package-lock.json @@ -8,7 +8,11 @@ "name": "emdr", "version": "1.0.0", "license": "ISC", + "dependencies": { + "axios": "^1.3.2" + }, "devDependencies": { + "@types/node": "^18.11.18", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "css-loader": "^6.7.3", @@ -1073,6 +1077,21 @@ "node": ">=8" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.2.tgz", + "integrity": "sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1360,6 +1379,17 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1575,6 +1605,14 @@ "node": ">=8" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2341,7 +2379,6 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, "funding": [ { "type": "individual", @@ -2357,6 +2394,19 @@ } } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3253,7 +3303,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -3262,7 +3311,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -3839,6 +3887,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -6092,6 +6145,21 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.2.tgz", + "integrity": "sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -6304,6 +6372,14 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6469,6 +6545,11 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7055,8 +7136,17 @@ "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } }, "forwarded": { "version": "0.2.0", @@ -7719,14 +7809,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -8149,6 +8237,11 @@ } } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", diff --git a/emdr/package.json b/emdr/package.json index 986c0e3..8d74739 100644 --- a/emdr/package.json +++ b/emdr/package.json @@ -12,6 +12,7 @@ "author": "", "license": "ISC", "devDependencies": { + "@types/node": "^18.11.18", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "css-loader": "^6.7.3", @@ -24,5 +25,8 @@ "webpack": "^5.75.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.11.1" + }, + "dependencies": { + "axios": "^1.3.2" } } diff --git a/emdr/src/api.ts b/emdr/src/api.ts new file mode 100644 index 0000000..e885f61 --- /dev/null +++ b/emdr/src/api.ts @@ -0,0 +1,127 @@ +import * as L from "./logger"; +const axios = require("axios"); + +function APIResult(result: any) { + L.debug("APIResult:", result.config.url, result); + return result.data; +} + +export type Params = { + baseURL: string; + debug: boolean; + env: string; + version: string; + onLoading: () => void; + onLoadingDone: () => void; +}; + +export default class API { + params: Params; + api: any; + inFlightRequests: number; + + constructor(params: Params) { + this.params = { + baseURL: "https://api.pitchy.ninja/v1", + debug: true, + env: "dev", + version: "local", + onLoading: () => { + L.info("API LOADING"); + }, + onLoadingDone: () => { + L.info("API LOADING DONE"); + }, + ...params, + }; + + this.api = axios.create({ + baseURL: this.params.baseURL, + timeout: 20000, + withCredentials: true, // required for CORS requests + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + }); + + if (this.api === null) { + throw new Error("can't create API"); + } + + L.info("Using Pitchy backend: ", this.params.baseURL); + this.inFlightRequests = 0; + } + + onLoading() { + if (this.inFlightRequests === 0) { + this.params.onLoading(); + } + this.inFlightRequests += 1; + } + + onLoadingDone() { + this.inFlightRequests -= 1; + if (this.inFlightRequests === 0) { + this.params.onLoadingDone(); + } + } + + bolster(entity: any) { + // eslint-disable-next-line + entity["_env"] = this.params.env; + // eslint-disable-next-line + entity["_version"] = this.params.version; + } + + post(url: string, params: any) { + this.bolster(params); + L.info("API Request: POST", url, params); + this.onLoading(); + return this.api + .post(url, JSON.stringify(params)) + .then((data: any) => { + this.onLoadingDone(); + return APIResult(data); + }) + .catch((e: Error) => { + this.onLoadingDone(); + throw e; + }); + } + + get(url: string) { + L.info("API Request: GET", url); + this.onLoading(); + return this.api + .get(url) + .then((data: any) => { + this.onLoadingDone(); + return APIResult(data); + }) + .catch((e: Error) => { + this.onLoadingDone(); + throw e; + }); + } + + ping() { + return this.get("/ping"); + } + + authVerify(code: string) { + return this.post("/auth/verify", { code }); + } + + authLogout() { + return this.get("/auth/logout"); + } + + authWhoAmI() { + return this.get("/auth/whoami"); + } + + addFollower(email: string) { + return this.post("/followers", { email }); + } +} diff --git a/emdr/src/circle.ts b/emdr/src/circle.ts index 710d171..9c09599 100644 --- a/emdr/src/circle.ts +++ b/emdr/src/circle.ts @@ -1,3 +1,5 @@ +import * as L from "./logger"; + export default class Circle { x: number; y: number; @@ -5,11 +7,11 @@ export default class Circle { style: string; el: SVGElement; - constructor(x:number, y:number, radius: number) { + constructor(x: number, y: number, radius: number) { this.x = x; this.y = y; this.radius = radius; - this.style = 'fill: red; stroke: gray; stroke-width: 2px;'; + this.style = "fill: red; stroke: gray; stroke-width: 2px;"; } setStyle(style: string) { @@ -18,13 +20,13 @@ export default class Circle { createElement(containerEl: string) { const svgns = "http://www.w3.org/2000/svg"; - this.el = document.createElementNS(svgns, 'circle'); + this.el = document.createElementNS(svgns, "circle"); const container = document.getElementById(containerEl); - this.el.setAttribute("id", "circle1"); - this.el.setAttributeNS(null, 'cx', this.x.toString()); - this.el.setAttributeNS(null, 'cy', this.y.toString()); - this.el.setAttributeNS(null, 'r', this.radius.toString()); - this.el.setAttributeNS(null, 'style', this.style); + L.debug("Creating SVG element in", containerEl); + this.el.setAttributeNS(null, "cx", this.x.toString()); + this.el.setAttributeNS(null, "cy", this.y.toString()); + this.el.setAttributeNS(null, "r", this.radius.toString()); + this.el.setAttributeNS(null, "style", this.style); container.appendChild(this.el); return this; } @@ -32,7 +34,7 @@ export default class Circle { moveTo(x: number, y: number) { this.x = x; this.y = y; - this.el.setAttributeNS(null, 'cx', x.toString()); - this.el.setAttributeNS(null, 'cy', y.toString()); + this.el.setAttributeNS(null, "cx", x.toString()); + this.el.setAttributeNS(null, "cy", y.toString()); } } diff --git a/emdr/src/logger.ts b/emdr/src/logger.ts new file mode 100644 index 0000000..9d42805 --- /dev/null +++ b/emdr/src/logger.ts @@ -0,0 +1,33 @@ +let LOGLEVEL = 50; + +function log(level: number, ...args: string[]) { + if (level <= LOGLEVEL) { + // eslint-disable-next-line + console.log(`[pitchy:${level}]`, ...args); + } +} + +function debug(...args: string[]) { + log(50, ...args); +} + +function info(...args: string[]) { + log(30, ...args); +} + +function warn(...args: string[]) { + log(20, ...args); +} + +function error(...args: string[]) { + log(10, ...args); +} + +function setLevel(level: number) { + info('Setting log level to', level.toString()); + LOGLEVEL = level; +} + +export { + log, debug, info, warn, error, setLevel, +}; \ No newline at end of file diff --git a/rust/hello/src/iterators.rs b/rust/hello/src/iterators.rs new file mode 100644 index 0000000..1a959db --- /dev/null +++ b/rust/hello/src/iterators.rs @@ -0,0 +1,38 @@ +fn iterate() -> Vec { + let v = vec![5, 4, 2, 1]; + + for i in &v { + println!("v {i}"); + } + + let mut total: i32 = v.iter().sum(); + println!("sum: {total}"); + + // map() creates a new iterator, and because iterators are lazily evaluated, + // you need to call collect() on it to iterate through and create a new vector. + let n = 3; + let v2: Vec<_> = v.iter().map(|x| x * n).collect(); + + total = v2.iter().sum(); + println!("v2 sum: {total}"); + + let v3: Vec<_> = v.into_iter().filter(|x| *x > 3).collect(); + total = v3.iter().sum(); + println!("v3 {:?} sum: {total}", v3); + v3 +} + +pub fn run() { + iterate(); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn iterate_test() { + let v3 = iterate(); + assert_eq!(v3, vec![5, 4]) + } +} diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index f094150..a948816 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -2,6 +2,7 @@ mod args; mod arrays; mod functions; mod generics; +mod iterators; mod lifetimes; mod print; mod strings; @@ -31,6 +32,7 @@ fn process_cmdline() { "vars" => vars::run(), "tuples" => tuples::run(), "arrays" => arrays::run(), + "iterators" => iterators::run(), "functions" => functions::run(), "structs" => structs::run(), "args" => args::run(), From b8604ec02a4418fa7c828b09fbb1ca5a517a41f6 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 9 Feb 2023 16:17:56 -0500 Subject: [PATCH 134/180] Added custom smart pointer experiment. --- rust/hello/src/iterators.rs | 12 ++++++++++++ rust/hello/src/main.rs | 4 +++- rust/hello/src/pointers.rs | 23 +++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 rust/hello/src/pointers.rs diff --git a/rust/hello/src/iterators.rs b/rust/hello/src/iterators.rs index 1a959db..2a89e82 100644 --- a/rust/hello/src/iterators.rs +++ b/rust/hello/src/iterators.rs @@ -1,3 +1,5 @@ +use std::env; + fn iterate() -> Vec { let v = vec![5, 4, 2, 1]; @@ -22,8 +24,18 @@ fn iterate() -> Vec { v3 } +fn show_values(iter: impl Iterator) { + let values: Vec<_> = iter.collect(); + println!("{}", values.join(", ")); +} + +fn arguments() { + show_values(env::args()) +} + pub fn run() { iterate(); + arguments(); } #[cfg(test)] diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index a948816..58ae26b 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -4,6 +4,7 @@ mod functions; mod generics; mod iterators; mod lifetimes; +mod pointers; mod print; mod strings; mod structs; @@ -32,7 +33,6 @@ fn process_cmdline() { "vars" => vars::run(), "tuples" => tuples::run(), "arrays" => arrays::run(), - "iterators" => iterators::run(), "functions" => functions::run(), "structs" => structs::run(), "args" => args::run(), @@ -40,6 +40,8 @@ fn process_cmdline() { "traits" => traits::run(), "generics" => generics::run(), "threads" => threads::run(), + "iterators" => iterators::run(), + "pointers" => pointers::run(), _ => { println!("Unrecognized module: {}", args[1]); std::process::exit(-1); diff --git a/rust/hello/src/pointers.rs b/rust/hello/src/pointers.rs new file mode 100644 index 0000000..49ed41b --- /dev/null +++ b/rust/hello/src/pointers.rs @@ -0,0 +1,23 @@ +use std::ops::Deref; + +struct MyBox(T); + +impl MyBox { + fn new(t: T) -> MyBox { + return MyBox(t); + } +} + +impl Deref for MyBox { + type Target = T; + + fn deref(&self) -> &Self::Target { + return &self.0; + } +} + +pub fn run() { + let i = MyBox::new(25); + + println!("i = {}", *i); +} From caa8a4771f6135c8d237ac673553aca2c24e3150 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 9 Feb 2023 16:27:30 -0500 Subject: [PATCH 135/180] Implemented Drop trait for MyBox. --- rust/hello/src/pointers.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/rust/hello/src/pointers.rs b/rust/hello/src/pointers.rs index 49ed41b..7ce346a 100644 --- a/rust/hello/src/pointers.rs +++ b/rust/hello/src/pointers.rs @@ -1,14 +1,16 @@ +use std::fmt::Debug; use std::ops::Deref; -struct MyBox(T); +#[derive(Debug)] +struct MyBox(T); -impl MyBox { +impl MyBox { fn new(t: T) -> MyBox { return MyBox(t); } } -impl Deref for MyBox { +impl Deref for MyBox { type Target = T; fn deref(&self) -> &Self::Target { @@ -16,6 +18,12 @@ impl Deref for MyBox { } } +impl Drop for MyBox { + fn drop(&mut self) { + println!("goodbye {:?}!", *self) + } +} + pub fn run() { let i = MyBox::new(25); From 9c959b849fbbba62b1b0fe9b885d319c29300377 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 10 Feb 2023 08:44:25 -0500 Subject: [PATCH 136/180] Added simple mutex experiment. --- rust/hello/src/main.rs | 2 ++ rust/hello/src/pointers.rs | 4 +++- rust/hello/src/server.rs | 3 +++ rust/hello/src/threads.rs | 21 +++++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 rust/hello/src/server.rs diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 58ae26b..2887463 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -6,6 +6,7 @@ mod iterators; mod lifetimes; mod pointers; mod print; +mod server; mod strings; mod structs; mod threads; @@ -42,6 +43,7 @@ fn process_cmdline() { "threads" => threads::run(), "iterators" => iterators::run(), "pointers" => pointers::run(), + "server" => server::run(), _ => { println!("Unrecognized module: {}", args[1]); std::process::exit(-1); diff --git a/rust/hello/src/pointers.rs b/rust/hello/src/pointers.rs index 7ce346a..5631d8b 100644 --- a/rust/hello/src/pointers.rs +++ b/rust/hello/src/pointers.rs @@ -26,6 +26,8 @@ impl Drop for MyBox { pub fn run() { let i = MyBox::new(25); - println!("i = {}", *i); + + let j = MyBox::new(30); + drop(j); } diff --git a/rust/hello/src/server.rs b/rust/hello/src/server.rs new file mode 100644 index 0000000..b1535c9 --- /dev/null +++ b/rust/hello/src/server.rs @@ -0,0 +1,3 @@ +pub fn run() { + println!("starting server...") +} diff --git a/rust/hello/src/threads.rs b/rust/hello/src/threads.rs index 4817ce5..3ea988b 100644 --- a/rust/hello/src/threads.rs +++ b/rust/hello/src/threads.rs @@ -2,6 +2,26 @@ use std::sync::mpsc; use std::sync::{Arc, Condvar, Mutex}; use std::{thread, time}; +fn simple_mutex() { + let m = Arc::new(Mutex::new(0)); + + // Clone the pointer because we don't want to move m + // into the thread -- it'll become inaccessible back in the + // main thread at the end of this funciton. + let tm = Arc::clone(&m); + let tid = thread::spawn(move || { + for i in 0..10 { + println!("simple_mutex {}", i); + let mut num = tm.lock().unwrap(); + *num += 1; + } + }); + + tid.join().unwrap(); + let num = m.lock().unwrap(); + println!("simple_mutex: {}", num); +} + // Synchronized threads with channels. fn channels() { // Multi sender, single receiver channel. @@ -105,4 +125,5 @@ fn sync_threads() { pub fn run() { channels(); sync_threads(); + simple_mutex(); } From ef79c536a441019ab299c1d1ce3ee72b045393ea Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 10 Feb 2023 09:00:46 -0500 Subject: [PATCH 137/180] Added TcpListener to server. --- rust/hello/src/server.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rust/hello/src/server.rs b/rust/hello/src/server.rs index b1535c9..1aa402e 100644 --- a/rust/hello/src/server.rs +++ b/rust/hello/src/server.rs @@ -1,3 +1,14 @@ +use std::net::TcpListener; + +fn start() { + let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); + + for stream in listener.incoming() { + println!("Connection established: {:?}", stream) + } +} + pub fn run() { - println!("starting server...") + println!("starting server..."); + start(); } From ed116fe900e378307c68de64a25dc093b2d972f0 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 10 Feb 2023 16:17:38 -0500 Subject: [PATCH 138/180] Working file server. --- rust/hello/src/server.rs | 82 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/rust/hello/src/server.rs b/rust/hello/src/server.rs index 1aa402e..418060a 100644 --- a/rust/hello/src/server.rs +++ b/rust/hello/src/server.rs @@ -1,10 +1,86 @@ -use std::net::TcpListener; +/* + +Simple webserver that serves files out of the local directory. + +GET / -- returns static text +GET /files/{filename} -- returns contents of filename (does not recurse directories) + +*/ + +use std::{ + fs, io, + io::{prelude::*, BufReader}, + net::{TcpListener, TcpStream}, +}; fn start() { - let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); + let listener = TcpListener::bind("127.0.0.1:37878").unwrap(); for stream in listener.incoming() { - println!("Connection established: {:?}", stream) + println!("Connection established: {:?}", stream); + handle_connection(stream.unwrap()); + } +} + +fn return_response(mut stream: TcpStream, status: String, contents: String) { + let status_line = format!("HTTP/1.1 {}", status); + let length = contents.len(); + let response = format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"); + println!("Response: {}", response); + stream.write_all(response.as_bytes()).unwrap(); +} + +fn get_file_contents(path: &String) -> Result { + let parts: Vec<_> = path.split('/').collect(); + println!("{:?}", parts); + + if parts[1] == "files" { + let filename = parts[2]; + let contents = fs::read_to_string(filename)?; + return Ok(contents); + } + + return Err(io::Error::new(io::ErrorKind::NotFound, "file not found")); +} + +fn handle_connection(mut stream: TcpStream) { + let reader = BufReader::new(&mut stream); + + let request: Vec<_> = reader + .lines() + .map(|l| l.unwrap()) + .take_while(|l| !l.is_empty()) + .collect(); + + println!("Request: {:?}", request); + + let parts: Vec<_> = request[0].split_whitespace().collect(); + if parts[0] == "GET" { + if parts[1] == "/" { + return_response( + stream, + "200 OK".into(), + "\nOKAAAAY!\n".into(), + ); + } else { + let result = get_file_contents(&parts[1].into()); + + if let Ok(contents) = result { + return_response(stream, "200 OK".into(), contents.into()); + } else { + return_response( + stream, + "404 NOT FOUND".into(), + "\n404 nothing to see here\n".into(), + ); + } + } + } else { + return_response( + stream, + "500 SERVER ERROR".into(), + "\n500 boo\n".into(), + ); } } From acbbdf00234752c97edb60053553157c69cf9293 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 10 Feb 2023 21:38:03 -0500 Subject: [PATCH 139/180] Make webserver multithreaded. - Add threadpool 1.8.1 as cargo dependency. --- rust/hello/Cargo.lock | 37 ++++++++++++++++++++++++++++++++++++ rust/hello/Cargo.toml | 1 + rust/hello/src/main.rs | 2 ++ rust/hello/src/server.rs | 14 +++++++++++++- rust/hello/src/threadpool.rs | 31 ++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 rust/hello/src/threadpool.rs diff --git a/rust/hello/Cargo.lock b/rust/hello/Cargo.lock index c3aedd7..f21e254 100644 --- a/rust/hello/Cargo.lock +++ b/rust/hello/Cargo.lock @@ -5,3 +5,40 @@ version = 3 [[package]] name = "hello" version = "0.1.0" +dependencies = [ + "threadpool", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] diff --git a/rust/hello/Cargo.toml b/rust/hello/Cargo.toml index 128fbbb..46f1db1 100644 --- a/rust/hello/Cargo.toml +++ b/rust/hello/Cargo.toml @@ -6,3 +6,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +threadpool = "1.8.1" diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 2887463..8f4970e 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -9,6 +9,7 @@ mod print; mod server; mod strings; mod structs; +mod threadpool; mod threads; mod traits; mod tuples; @@ -44,6 +45,7 @@ fn process_cmdline() { "iterators" => iterators::run(), "pointers" => pointers::run(), "server" => server::run(), + "threadpool" => threadpool::run(), _ => { println!("Unrecognized module: {}", args[1]); std::process::exit(-1); diff --git a/rust/hello/src/server.rs b/rust/hello/src/server.rs index 418060a..b6f2dd2 100644 --- a/rust/hello/src/server.rs +++ b/rust/hello/src/server.rs @@ -11,14 +11,19 @@ use std::{ fs, io, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream}, + thread, + time::Duration, }; +use threadpool::ThreadPool; + fn start() { let listener = TcpListener::bind("127.0.0.1:37878").unwrap(); + let pool = ThreadPool::new(20); for stream in listener.incoming() { println!("Connection established: {:?}", stream); - handle_connection(stream.unwrap()); + pool.execute(move || handle_connection(stream.unwrap())); } } @@ -62,6 +67,13 @@ fn handle_connection(mut stream: TcpStream) { "200 OK".into(), "\nOKAAAAY!\n".into(), ); + } else if parts[1] == "/sleep" { + thread::sleep(Duration::from_secs(5)); + return_response( + stream, + "200 OK".into(), + "\nOh hi, good morning!YAWN!\n".into(), + ); } else { let result = get_file_contents(&parts[1].into()); diff --git a/rust/hello/src/threadpool.rs b/rust/hello/src/threadpool.rs new file mode 100644 index 0000000..a4d1b33 --- /dev/null +++ b/rust/hello/src/threadpool.rs @@ -0,0 +1,31 @@ +pub struct ThreadPool { + size: usize, +} + +impl ThreadPool { + fn new(size: usize) -> ThreadPool { + assert!(size > 0); + ThreadPool { size } + } + + fn size(&self) -> usize { + return self.size; + } +} + +pub fn run() { + println!("running threadpool"); + let tp = ThreadPool::new(10); + println!("size: {}", tp.size()); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new_pool() { + let tp = ThreadPool::new(5); + assert_eq!(tp.size(), 5); + } +} From f1334ccabf0e26cd5bbf968246481554af85b62e Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 11 Feb 2023 10:31:11 -0500 Subject: [PATCH 140/180] Added rust json experiment. --- rust/hello/Cargo.lock | 30 ++++++++++++++++++++++++++++++ rust/hello/Cargo.toml | 1 + rust/hello/src/json.rs | 24 ++++++++++++++++++++++++ rust/hello/src/main.rs | 2 ++ 4 files changed, 57 insertions(+) create mode 100644 rust/hello/src/json.rs diff --git a/rust/hello/Cargo.lock b/rust/hello/Cargo.lock index f21e254..de32a57 100644 --- a/rust/hello/Cargo.lock +++ b/rust/hello/Cargo.lock @@ -6,6 +6,7 @@ version = 3 name = "hello" version = "0.1.0" dependencies = [ + "serde_json", "threadpool", ] @@ -18,6 +19,12 @@ dependencies = [ "libc", ] +[[package]] +name = "itoa" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" + [[package]] name = "libc" version = "0.2.139" @@ -34,6 +41,29 @@ dependencies = [ "libc", ] +[[package]] +name = "ryu" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" + +[[package]] +name = "serde" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" + +[[package]] +name = "serde_json" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "threadpool" version = "1.8.1" diff --git a/rust/hello/Cargo.toml b/rust/hello/Cargo.toml index 46f1db1..39afa9a 100644 --- a/rust/hello/Cargo.toml +++ b/rust/hello/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" [dependencies] threadpool = "1.8.1" +serde_json = "1.0" diff --git a/rust/hello/src/json.rs b/rust/hello/src/json.rs new file mode 100644 index 0000000..8460cff --- /dev/null +++ b/rust/hello/src/json.rs @@ -0,0 +1,24 @@ +use serde_json::{Result, Value}; + +fn parse_string() -> Result<()> { + let data = r#" + { + "name": "bob", + "age": "45", + "phones": ["+1 (555) 555-5555" , "+1 (555) 555-5556" ] + } + "#; + + let v: Value = serde_json::from_str(data)?; + + println!( + "Hi {}, You're {}. Please call me at {}.", + v["name"], v["age"], v["phones"][0] + ); + + Ok(()) +} + +pub fn run() { + parse_string().unwrap(); +} diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 8f4970e..61f6a13 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -3,6 +3,7 @@ mod arrays; mod functions; mod generics; mod iterators; +mod json; mod lifetimes; mod pointers; mod print; @@ -46,6 +47,7 @@ fn process_cmdline() { "pointers" => pointers::run(), "server" => server::run(), "threadpool" => threadpool::run(), + "json" => json::run(), _ => { println!("Unrecognized module: {}", args[1]); std::process::exit(-1); From 0ce8f8bbb9ecb3301005a3524025275438bd80aa Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 11 Feb 2023 10:57:40 -0500 Subject: [PATCH 141/180] Added serialize/deserialize methods. --- rust/hello/Cargo.lock | 50 ++++++++++++++++++++++++++++++++++++++++++ rust/hello/Cargo.toml | 1 + rust/hello/src/json.rs | 31 ++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) diff --git a/rust/hello/Cargo.lock b/rust/hello/Cargo.lock index de32a57..df4cdd1 100644 --- a/rust/hello/Cargo.lock +++ b/rust/hello/Cargo.lock @@ -6,6 +6,7 @@ version = 3 name = "hello" version = "0.1.0" dependencies = [ + "serde", "serde_json", "threadpool", ] @@ -41,6 +42,24 @@ dependencies = [ "libc", ] +[[package]] +name = "proc-macro2" +version = "1.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +dependencies = [ + "proc-macro2", +] + [[package]] name = "ryu" version = "1.0.12" @@ -52,6 +71,20 @@ name = "serde" version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "serde_json" @@ -64,6 +97,17 @@ dependencies = [ "serde", ] +[[package]] +name = "syn" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -72,3 +116,9 @@ checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" dependencies = [ "num_cpus", ] + +[[package]] +name = "unicode-ident" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" diff --git a/rust/hello/Cargo.toml b/rust/hello/Cargo.toml index 39afa9a..9a3156c 100644 --- a/rust/hello/Cargo.toml +++ b/rust/hello/Cargo.toml @@ -7,4 +7,5 @@ edition = "2018" [dependencies] threadpool = "1.8.1" +serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/rust/hello/src/json.rs b/rust/hello/src/json.rs index 8460cff..4772906 100644 --- a/rust/hello/src/json.rs +++ b/rust/hello/src/json.rs @@ -1,3 +1,4 @@ +use serde::{Deserialize, Serialize}; use serde_json::{Result, Value}; fn parse_string() -> Result<()> { @@ -19,6 +20,36 @@ fn parse_string() -> Result<()> { Ok(()) } +#[derive(Serialize, Deserialize, Debug)] +struct Address { + street: String, + city: String, +} + +fn deserialize() { + let data = r#" + { + "street": "21 Downing St.", + "city": "London" + } + "#; + + let v: Address = serde_json::from_str(data).unwrap(); + println!("{:?}", v); +} + +fn serialize() { + let address = Address { + street: "555 Prospect Pl.".into(), + city: "Brooklyn".into(), + }; + + let data = serde_json::to_string(&address).unwrap(); + println!("{:?}", data); +} + pub fn run() { parse_string().unwrap(); + deserialize(); + serialize(); } From 98b2797ad6585841db1eb522076cd07b3984fc1d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 11 Feb 2023 21:36:34 -0500 Subject: [PATCH 142/180] Dynamic dispatch in rust. --- rust/hello/src/dynamic.rs | 54 +++++++++++++++++++++++++++++++++++++++ rust/hello/src/main.rs | 2 ++ 2 files changed, 56 insertions(+) create mode 100644 rust/hello/src/dynamic.rs diff --git a/rust/hello/src/dynamic.rs b/rust/hello/src/dynamic.rs new file mode 100644 index 0000000..0686e11 --- /dev/null +++ b/rust/hello/src/dynamic.rs @@ -0,0 +1,54 @@ +#[derive(Debug)] +struct Point(i32, i32); + +#[derive(Debug)] +struct Rect { + tl: Point, + br: Point, +} + +#[derive(Debug)] +struct Circle { + center: Point, + radius: u32, +} + +pub trait Draw { + fn draw(&self); +} + +impl Draw for Rect { + fn draw(&self) { + println!("Drawing rectangle: {:?}", self); + println!("br: {:?} tl: {:?}", self.br, self.tl); + } +} + +impl Draw for Circle { + fn draw(&self) { + println!("Drawing circle: {:?}", self); + println!("center: {:?} radius: {:?}", self.center, self.radius); + } +} + +pub fn draw_all(shapes: &Vec>) { + for shape in shapes { + shape.draw(); + } +} + +pub fn run() { + let circle = Box::new(Circle { + center: Point(100, 100), + radius: 10, + }); + + let rect = Box::new(Rect { + tl: Point(0, 0), + br: Point(100, 100), + }); + + let shapes: Vec> = vec![circle, rect]; + + draw_all(&shapes); +} diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index 61f6a13..fd92cf0 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -1,5 +1,6 @@ mod args; mod arrays; +mod dynamic; mod functions; mod generics; mod iterators; @@ -48,6 +49,7 @@ fn process_cmdline() { "server" => server::run(), "threadpool" => threadpool::run(), "json" => json::run(), + "dynamic" => dynamic::run(), _ => { println!("Unrecognized module: {}", args[1]); std::process::exit(-1); From 77616ba39268ab98028e4de985741ccd3a5923b7 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 12 Feb 2023 09:35:59 -0500 Subject: [PATCH 143/180] Added async experiments. --- rust/hello/Cargo.lock | 593 +++++++++++++++++++++++++++++++++++ rust/hello/Cargo.toml | 2 + rust/hello/src/asyncawait.rs | 33 ++ rust/hello/src/main.rs | 3 +- 4 files changed, 630 insertions(+), 1 deletion(-) create mode 100644 rust/hello/src/asyncawait.rs diff --git a/rust/hello/Cargo.lock b/rust/hello/Cargo.lock index df4cdd1..a392777 100644 --- a/rust/hello/Cargo.lock +++ b/rust/hello/Cargo.lock @@ -2,10 +2,317 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "async-channel" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" +dependencies = [ + "async-lock", + "autocfg", + "concurrent-queue", + "futures-lite", + "libc", + "log", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "windows-sys", +] + +[[package]] +name = "async-lock" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" +dependencies = [ + "event-listener", + "futures-lite", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" + +[[package]] +name = "atomic-waker" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "blocking" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", +] + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "concurrent-queue" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + +[[package]] +name = "futures" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" + +[[package]] +name = "futures-executor" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" + +[[package]] +name = "futures-task" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" + +[[package]] +name = "futures-util" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "hello" version = "0.1.0" dependencies = [ + "async-std", + "futures", "serde", "serde_json", "threadpool", @@ -20,18 +327,61 @@ dependencies = [ "libc", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "itoa" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "libc" version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", + "value-bag", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + [[package]] name = "num_cpus" version = "1.15.0" @@ -42,6 +392,44 @@ dependencies = [ "libc", ] +[[package]] +name = "once_cell" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "polling" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "log", + "wepoll-ffi", + "windows-sys", +] + [[package]] name = "proc-macro2" version = "1.0.51" @@ -97,6 +485,25 @@ dependencies = [ "serde", ] +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "socket2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "syn" version = "1.0.107" @@ -122,3 +529,189 @@ name = "unicode-ident" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" + +[[package]] +name = "value-bag" +version = "1.0.0-alpha.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" +dependencies = [ + "ctor", + "version_check", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" diff --git a/rust/hello/Cargo.toml b/rust/hello/Cargo.toml index 9a3156c..3bada83 100644 --- a/rust/hello/Cargo.toml +++ b/rust/hello/Cargo.toml @@ -9,3 +9,5 @@ edition = "2018" threadpool = "1.8.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +futures = "0.3" +async-std = "1.12" diff --git a/rust/hello/src/asyncawait.rs b/rust/hello/src/asyncawait.rs new file mode 100644 index 0000000..7269714 --- /dev/null +++ b/rust/hello/src/asyncawait.rs @@ -0,0 +1,33 @@ +use async_std::task; +use futures::executor::block_on; +use std::time; + +async fn part1() -> usize { + for n in 1..10 { + // Notice this is async_std::task::sleep and not thread::sleep. Also + // notice the await. You need to use async-aware blocking methods wherever + // possible. + task::sleep(time::Duration::from_millis(100)).await; + println!("a - {}", n); + } + + 1 +} + +async fn part2() -> usize { + for n in 1..10 { + task::sleep(time::Duration::from_millis(50)).await; + println!("b - {}", n); + } + + 2 +} + +async fn go() { + let (a, b) = futures::join!(part1(), part2()); + println!("a: {}, b: {}", a, b); +} + +pub fn run() { + block_on(go()); +} diff --git a/rust/hello/src/main.rs b/rust/hello/src/main.rs index fd92cf0..cfcffd2 100644 --- a/rust/hello/src/main.rs +++ b/rust/hello/src/main.rs @@ -1,5 +1,6 @@ mod args; mod arrays; +mod asyncawait; mod dynamic; mod functions; mod generics; @@ -50,6 +51,7 @@ fn process_cmdline() { "threadpool" => threadpool::run(), "json" => json::run(), "dynamic" => dynamic::run(), + "asyncawait" => asyncawait::run(), _ => { println!("Unrecognized module: {}", args[1]); std::process::exit(-1); @@ -58,6 +60,5 @@ fn process_cmdline() { } fn main() { - println!("Hello, world!"); process_cmdline(); } From 59f601d7b65026994980edfaf5b43d0e54c4ca23 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Wed, 15 Feb 2023 13:11:00 -0500 Subject: [PATCH 144/180] Initial commit of rust HTTP parser. --- rust/hello/Cargo.lock | 552 +++++++++++++++++++++++++++++++++++ rust/hello/Cargo.toml | 1 + rust/hello/src/asyncawait.rs | 16 + rust/hype/Cargo.lock | 347 ++++++++++++++++++++++ rust/hype/Cargo.toml | 11 + rust/hype/src/lib.rs | 19 ++ rust/hype/src/main.rs | 45 +++ rust/hype/src/parser.rs | 196 +++++++++++++ 8 files changed, 1187 insertions(+) create mode 100644 rust/hype/Cargo.lock create mode 100644 rust/hype/Cargo.toml create mode 100644 rust/hype/src/lib.rs create mode 100644 rust/hype/src/main.rs create mode 100644 rust/hype/src/parser.rs diff --git a/rust/hello/Cargo.lock b/rust/hello/Cargo.lock index a392777..9871ed9 100644 --- a/rust/hello/Cargo.lock +++ b/rust/hello/Cargo.lock @@ -116,6 +116,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "blocking" version = "1.3.0" @@ -136,6 +148,12 @@ version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.79" @@ -157,6 +175,22 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "crossbeam-utils" version = "0.8.14" @@ -176,6 +210,15 @@ dependencies = [ "syn", ] +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -191,6 +234,36 @@ dependencies = [ "instant", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + [[package]] name = "futures" version = "0.3.26" @@ -307,12 +380,38 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "h2" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hello" version = "0.1.0" dependencies = [ "async-std", "futures", + "reqwest", "serde", "serde_json", "threadpool", @@ -327,6 +426,97 @@ dependencies = [ "libc", ] +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "instant" version = "0.1.12" @@ -336,6 +526,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "ipnet" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" + [[package]] name = "itoa" version = "1.0.5" @@ -360,6 +556,12 @@ dependencies = [ "log", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.139" @@ -382,6 +584,42 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mio" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "num_cpus" version = "1.15.0" @@ -398,12 +636,63 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +[[package]] +name = "openssl" +version = "0.10.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "parking" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -416,6 +705,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + [[package]] name = "polling" version = "2.5.2" @@ -448,12 +743,99 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "ryu" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.152" @@ -485,6 +867,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "slab" version = "0.4.7" @@ -515,6 +909,20 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -524,12 +932,125 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "pin-project-lite", + "socket2", + "windows-sys", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "unicode-bidi" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" + [[package]] name = "unicode-ident" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "value-bag" version = "1.0.0-alpha.9" @@ -540,6 +1061,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" @@ -552,6 +1079,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" version = "0.2.84" @@ -715,3 +1258,12 @@ name = "windows_x86_64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] diff --git a/rust/hello/Cargo.toml b/rust/hello/Cargo.toml index 3bada83..dc75845 100644 --- a/rust/hello/Cargo.toml +++ b/rust/hello/Cargo.toml @@ -11,3 +11,4 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" futures = "0.3" async-std = "1.12" +reqwest = "0.11" diff --git a/rust/hello/src/asyncawait.rs b/rust/hello/src/asyncawait.rs index 7269714..8b218ed 100644 --- a/rust/hello/src/asyncawait.rs +++ b/rust/hello/src/asyncawait.rs @@ -28,6 +28,22 @@ async fn go() { println!("a: {}, b: {}", a, b); } +async fn fetch() { + /* + // Needs Tokio to work. + use reqwest; + + let body = reqwest::get("http://www.rust-lang.org") + .await + .unwrap() + .text() + .await + .unwrap(); + println!("Rust body:\n{}", body) + */ +} + pub fn run() { block_on(go()); + block_on(fetch()); } diff --git a/rust/hype/Cargo.lock b/rust/hype/Cargo.lock new file mode 100644 index 0000000..9face7f --- /dev/null +++ b/rust/hype/Cargo.lock @@ -0,0 +1,347 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hype" +version = "0.1.0" +dependencies = [ + "lazy_static", + "tokio", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.45.0", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "proc-macro2" +version = "1.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tokio" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.42.0", +] + +[[package]] +name = "tokio-macros" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" diff --git a/rust/hype/Cargo.toml b/rust/hype/Cargo.toml new file mode 100644 index 0000000..ececf74 --- /dev/null +++ b/rust/hype/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "hype" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tokio = { version = "1", features = ["full"] } +lazy_static = "1.4" + diff --git a/rust/hype/src/lib.rs b/rust/hype/src/lib.rs new file mode 100644 index 0000000..4f49c56 --- /dev/null +++ b/rust/hype/src/lib.rs @@ -0,0 +1,19 @@ +#[macro_use] +extern crate lazy_static; + +pub mod parser; + +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/rust/hype/src/main.rs b/rust/hype/src/main.rs new file mode 100644 index 0000000..3d14fed --- /dev/null +++ b/rust/hype/src/main.rs @@ -0,0 +1,45 @@ +use tokio::{ + io::AsyncReadExt, + net::{TcpListener, TcpStream}, +}; + +use hype::parser::Parser; + +pub async fn dump_stream(mut stream: TcpStream) { + let mut parser = Parser::new(); + + loop { + let mut buf = [0u8; 16]; + + match stream.read(&mut buf).await { + Ok(0) => { + parser.parse_eof().unwrap(); + break; + } + Ok(n) => { + parser.parse_buf(&buf[..n]).unwrap(); + } + Err(e) => { + println!("Error: {:?}", e); + break; + } + } + } + + println!("Parser output:\n{:?}", parser); +} + +pub async fn start() { + let listener = TcpListener::bind("127.0.0.1:4000").await.unwrap(); + + loop { + let (socket, _) = listener.accept().await.unwrap(); + dump_stream(socket).await; + println!("Done"); + } +} + +#[tokio::main] +async fn main() { + start().await; +} diff --git a/rust/hype/src/parser.rs b/rust/hype/src/parser.rs new file mode 100644 index 0000000..f4bcfc1 --- /dev/null +++ b/rust/hype/src/parser.rs @@ -0,0 +1,196 @@ +use std::collections::HashMap; + +#[derive(Debug, PartialEq, Eq, Hash)] +enum State { + Start, + InCommand, + InHeaders, + InBody, +} + +lazy_static! { + // map of target state -> prior state(s) + static ref STATE_MACHINE: HashMap> = HashMap::from([ + (State::InCommand, vec![State::Start]), + (State::InHeaders, vec![State::InCommand]), + (State::InBody, vec![State::InHeaders]), +]); +} + +#[derive(Debug, PartialEq)] +pub enum ParseError { + UnexpectedState, + InvalidStateTransition, + BadCommandLine(String), + BadHeaderLine(String), + UnexpectedEOF, +} + +#[derive(Debug)] +pub struct Parser { + state: State, + buf: Vec, + command: String, + path: String, + version: String, + headers: HashMap, + body: Vec, +} + +impl Parser { + pub fn new() -> Parser { + Parser { + state: State::Start, + buf: Vec::with_capacity(16384), + command: String::new(), + path: String::new(), + version: String::new(), + headers: HashMap::new(), + body: Vec::new(), + } + } + + fn update_state(&mut self, target_state: State) -> Result<(), ParseError> { + if !STATE_MACHINE + .get(&target_state) + .unwrap() + .contains(&self.state) + { + return Err(ParseError::InvalidStateTransition); + } + + self.state = target_state; + + Ok(()) + } + + fn commit_command(&mut self) -> Result<(), ParseError> { + let command_line = std::str::from_utf8(&self.buf[..]).unwrap(); + let parts = command_line.split_ascii_whitespace().collect::>(); + + if parts.len() != 3 { + return Err(ParseError::BadCommandLine(command_line.into())); + } + + self.command = parts[0].into(); + self.path = parts[1].into(); + self.version = parts[2].into(); + + self.buf.clear(); + Ok(()) + } + + fn commit_header(&mut self) -> Result<(), ParseError> { + let mut result: Result<(), ParseError> = Ok(()); + let header_line = std::str::from_utf8(&self.buf[..]).unwrap(); + + if header_line == "\r" || header_line == "" { + result = self.update_state(State::InBody); + } else { + if let Some((k, v)) = header_line.split_once(':') { + self.headers.insert(k.into(), v.trim().into()); + } else { + result = Err(ParseError::BadHeaderLine(header_line.into())); + } + } + + self.buf.clear(); + result + } + + fn commit_line(&mut self) -> Result<(), ParseError> { + let result: Result<(), ParseError>; + + match self.state { + State::Start => result = Ok(()), + State::InCommand => { + result = self.commit_command(); + self.update_state(State::InHeaders)?; + } + State::InHeaders => { + result = self.commit_header(); + } + _ => { + result = Err(ParseError::UnexpectedState); + } + } + + result + } + + fn consume(&mut self, b: u8) -> Result<(), ParseError> { + self.buf.push(b); + Ok(()) + } + + pub fn parse_buf(&mut self, buf: &[u8]) -> Result<(), ParseError> { + for c in buf { + let ch = *c as char; + match self.state { + State::Start => { + if !ch.is_whitespace() { + self.consume(*c)?; + self.update_state(State::InCommand)?; + } + } + State::InCommand | State::InHeaders => { + if ch == '\n' { + self.commit_line()?; + } else { + self.consume(*c)?; + } + } + State::InBody => { + self.consume(*c)?; + } + } + } + + Ok(()) + } + + pub fn parse_eof(&mut self) -> Result<(), ParseError> { + if self.state == State::InBody { + self.body = std::str::from_utf8(&self.buf[..]).unwrap().into(); + return Ok(()); + } + + Err(ParseError::UnexpectedEOF) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn parse_ok(buf: &str) { + let mut parser = Parser::new(); + println!("buf:\n{}", buf); + let result = parser.parse_buf(String::from(buf).as_bytes()); + assert_eq!(result, Ok(())); + } + + #[test] + fn it_works() { + parse_ok( + r##"POST / HTTP/1.1 +Host: localhost:4000 +Content-Length: 20 + +{"merchantID": "00"}"##, + ); + } + + #[test] + fn newline_prefixes() { + parse_ok( + r##" + +POST / HTTP/1.1 +Host: localhost:4000 +Content-Length: 20 + +{"merchantID": "00"}"##, + ); + } +} From 5b12f78dfbc5688609bfd0d3aee113ecfdeeb16b Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Wed, 15 Feb 2023 14:52:05 -0500 Subject: [PATCH 145/180] Detect invalid methods. --- rust/hype/src/parser.rs | 51 +++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/rust/hype/src/parser.rs b/rust/hype/src/parser.rs index f4bcfc1..413dc8b 100644 --- a/rust/hype/src/parser.rs +++ b/rust/hype/src/parser.rs @@ -14,7 +14,11 @@ lazy_static! { (State::InCommand, vec![State::Start]), (State::InHeaders, vec![State::InCommand]), (State::InBody, vec![State::InHeaders]), -]); + ]); + + static ref VALID_METHODS: Vec<&'static str> = vec![ + "GET", "HEAD", "POST", "PUT", "OPTIONS", "CONNECT", "DELETE", "TRACE", "PATCH" + ]; } #[derive(Debug, PartialEq)] @@ -23,6 +27,7 @@ pub enum ParseError { InvalidStateTransition, BadCommandLine(String), BadHeaderLine(String), + InvalidMethod(String), UnexpectedEOF, } @@ -46,7 +51,7 @@ impl Parser { path: String::new(), version: String::new(), headers: HashMap::new(), - body: Vec::new(), + body: Vec::with_capacity(16384), } } @@ -72,6 +77,10 @@ impl Parser { return Err(ParseError::BadCommandLine(command_line.into())); } + if !VALID_METHODS.contains(&parts[0]) { + return Err(ParseError::InvalidMethod(parts[0].into())); + } + self.command = parts[0].into(); self.path = parts[1].into(); self.version = parts[2].into(); @@ -150,7 +159,7 @@ impl Parser { } pub fn parse_eof(&mut self) -> Result<(), ParseError> { - if self.state == State::InBody { + if self.state == State::InBody || self.state == State::InHeaders { self.body = std::str::from_utf8(&self.buf[..]).unwrap().into(); return Ok(()); } @@ -163,16 +172,26 @@ impl Parser { mod tests { use super::*; - fn parse_ok(buf: &str) { + fn assert_parse_result( + buf: &str, + parse_buf_result: Result<(), ParseError>, + parse_eof_result: Result<(), ParseError>, + ) { let mut parser = Parser::new(); - println!("buf:\n{}", buf); - let result = parser.parse_buf(String::from(buf).as_bytes()); - assert_eq!(result, Ok(())); + println!("Parsing buffer:\n{}", buf); + let mut result = parser.parse_buf(String::from(buf).as_bytes()); + assert_eq!(result, parse_buf_result); + result = parser.parse_eof(); + assert_eq!(result, parse_eof_result); + } + + fn assert_parse_ok(buf: &str) { + assert_parse_result(buf, Ok(()), Ok(())); } #[test] fn it_works() { - parse_ok( + assert_parse_ok( r##"POST / HTTP/1.1 Host: localhost:4000 Content-Length: 20 @@ -183,7 +202,7 @@ Content-Length: 20 #[test] fn newline_prefixes() { - parse_ok( + assert_parse_ok( r##" POST / HTTP/1.1 @@ -193,4 +212,18 @@ Content-Length: 20 {"merchantID": "00"}"##, ); } + + #[test] + fn get_request() { + assert_parse_ok("GET / HTTP/1.1\n"); + } + + #[test] + fn invalid_method() { + assert_parse_result( + "BIT / HTTP/1.1\n", + Err(ParseError::InvalidMethod("BIT".into())), + Ok(()), + ); + } } From 077b83e90f0a4507dbe08e3c95ab1fead600fedd Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 16 Feb 2023 18:27:20 -0500 Subject: [PATCH 146/180] Added Http response implementation. --- rust/hype/Cargo.toml | 8 +++- rust/hype/src/lib.rs | 2 + rust/hype/src/parser.rs | 86 ++++++++++++++++++++++++++++----------- rust/hype/src/response.rs | 79 +++++++++++++++++++++++++++++++++++ rust/hype/src/status.rs | 35 ++++++++++++++++ 5 files changed, 185 insertions(+), 25 deletions(-) create mode 100644 rust/hype/src/response.rs create mode 100644 rust/hype/src/status.rs diff --git a/rust/hype/Cargo.toml b/rust/hype/Cargo.toml index ececf74..666d53d 100644 --- a/rust/hype/Cargo.toml +++ b/rust/hype/Cargo.toml @@ -3,7 +3,13 @@ name = "hype" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "hype" +path = "src/lib.rs" + +[[bin]] +name = "main" +path = "src/main.rs" [dependencies] tokio = { version = "1", features = ["full"] } diff --git a/rust/hype/src/lib.rs b/rust/hype/src/lib.rs index 4f49c56..8a2c4e4 100644 --- a/rust/hype/src/lib.rs +++ b/rust/hype/src/lib.rs @@ -2,6 +2,8 @@ extern crate lazy_static; pub mod parser; +pub mod response; +pub mod status; pub fn add(left: usize, right: usize) -> usize { left + right diff --git a/rust/hype/src/parser.rs b/rust/hype/src/parser.rs index 413dc8b..bace6d2 100644 --- a/rust/hype/src/parser.rs +++ b/rust/hype/src/parser.rs @@ -31,15 +31,32 @@ pub enum ParseError { UnexpectedEOF, } +#[derive(Debug, Clone)] +pub struct Request { + pub method: String, + pub path: String, + pub version: String, + pub headers: HashMap, + pub body: Vec, +} + +impl Request { + fn new() -> Request { + Request { + method: String::new(), + path: String::new(), + version: String::new(), + headers: HashMap::new(), + body: Vec::with_capacity(16384), + } + } +} + #[derive(Debug)] pub struct Parser { state: State, buf: Vec, - command: String, - path: String, - version: String, - headers: HashMap, - body: Vec, + request: Request, } impl Parser { @@ -47,11 +64,7 @@ impl Parser { Parser { state: State::Start, buf: Vec::with_capacity(16384), - command: String::new(), - path: String::new(), - version: String::new(), - headers: HashMap::new(), - body: Vec::with_capacity(16384), + request: Request::new(), } } @@ -81,9 +94,9 @@ impl Parser { return Err(ParseError::InvalidMethod(parts[0].into())); } - self.command = parts[0].into(); - self.path = parts[1].into(); - self.version = parts[2].into(); + self.request.method = parts[0].into(); + self.request.path = parts[1].into(); + self.request.version = parts[2].into(); self.buf.clear(); Ok(()) @@ -97,7 +110,7 @@ impl Parser { result = self.update_state(State::InBody); } else { if let Some((k, v)) = header_line.split_once(':') { - self.headers.insert(k.into(), v.trim().into()); + self.request.headers.insert(k.into(), v.trim().into()); } else { result = Err(ParseError::BadHeaderLine(header_line.into())); } @@ -160,12 +173,22 @@ impl Parser { pub fn parse_eof(&mut self) -> Result<(), ParseError> { if self.state == State::InBody || self.state == State::InHeaders { - self.body = std::str::from_utf8(&self.buf[..]).unwrap().into(); + self.request.body = std::str::from_utf8(&self.buf[..]).unwrap().into(); return Ok(()); } Err(ParseError::UnexpectedEOF) } + + pub fn get_request(&self) -> Request { + return self.request.clone(); + } + + pub fn reset(&mut self) { + self.state = State::Start; + self.buf.clear(); + self.request = Request::new(); + } } #[cfg(test)] @@ -176,28 +199,38 @@ mod tests { buf: &str, parse_buf_result: Result<(), ParseError>, parse_eof_result: Result<(), ParseError>, - ) { + ) -> Option { let mut parser = Parser::new(); println!("Parsing buffer:\n{}", buf); - let mut result = parser.parse_buf(String::from(buf).as_bytes()); - assert_eq!(result, parse_buf_result); - result = parser.parse_eof(); - assert_eq!(result, parse_eof_result); + let result1 = parser.parse_buf(String::from(buf).as_bytes()); + assert_eq!(result1, parse_buf_result); + let result2 = parser.parse_eof(); + assert_eq!(result2, parse_eof_result); + + if result1 == Ok(()) && result2 == Ok(()) { + return Some(parser.get_request()); + } + + None } - fn assert_parse_ok(buf: &str) { - assert_parse_result(buf, Ok(()), Ok(())); + fn assert_parse_ok(buf: &str) -> Option { + assert_parse_result(buf, Ok(()), Ok(())) } #[test] fn it_works() { - assert_parse_ok( + let request = assert_parse_ok( r##"POST / HTTP/1.1 Host: localhost:4000 Content-Length: 20 {"merchantID": "00"}"##, ); + + assert!(request.is_some()); + let request = request.unwrap(); + assert_eq!(request.method, "POST"); } #[test] @@ -215,7 +248,12 @@ Content-Length: 20 #[test] fn get_request() { - assert_parse_ok("GET / HTTP/1.1\n"); + let request = assert_parse_ok("GET / HTTP/1.1\n"); + assert!(request.is_some()); + let request = request.unwrap(); + assert_eq!(request.method, "GET"); + assert_eq!(request.path, "/"); + assert_eq!(request.version, "HTTP/1.1"); } #[test] diff --git a/rust/hype/src/response.rs b/rust/hype/src/response.rs new file mode 100644 index 0000000..021c781 --- /dev/null +++ b/rust/hype/src/response.rs @@ -0,0 +1,79 @@ +use std::collections::HashMap; + +use tokio::io::AsyncWriteExt; + +use crate::status; + +#[allow(dead_code)] +#[derive(Debug, Clone)] +pub struct Response<'a> { + pub status: status::Status<'a>, + pub headers: HashMap, + pub body: String, +} + +#[allow(dead_code)] +impl<'a> Response<'a> { + fn new(status: status::Status) -> Response { + Response { + status, + headers: HashMap::new(), + body: String::new(), + } + } + + fn set_header(&mut self, key: String, value: String) { + self.headers.insert(key, value); + } + + fn set_body(&mut self, body: String) { + self.body = body; + } + + fn serialize(&mut self) -> String { + let status_line = format!("HTTP/1.1 {} {}", self.status.code, self.status.text); + let length = self.body.len(); + if length > 0 { + self.set_header("Content-Length".into(), length.to_string()); + } + + let headers: String = self + .headers + .iter() + .map(|(k, v)| format!("{}: {}", k, v)) + .collect::>() + .join("\r\n"); + + format!("{status_line}\r\n{headers}\r\n\r\n{}", self.body) + } +} + +#[allow(dead_code)] +pub struct Writer<'a, T: AsyncWriteExt> { + stream: &'a mut T, +} + +#[allow(dead_code)] +impl<'a, T: AsyncWriteExt> Writer<'a, T> { + fn new(stream: &'a mut T) -> Writer { + return Writer { stream }; + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let mut response = Response::new(status::from(status::OK)); + println!("{}", response.serialize()) + } + + #[test] + fn it_works_with_body() { + let mut response = Response::new(status::from(status::OK)); + response.set_body("Hello world!".into()); + println!("{}", response.serialize()) + } +} diff --git a/rust/hype/src/status.rs b/rust/hype/src/status.rs new file mode 100644 index 0000000..399670c --- /dev/null +++ b/rust/hype/src/status.rs @@ -0,0 +1,35 @@ +type Code<'a> = (u16, &'a str); + +pub const OK: Code = (200, "OK"); +pub const NOT_FOUND: Code = (404, "NOT FOUND"); +pub const SERVER_ERROR: Code = (500, "SERVER ERROR"); + +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct Status<'a> { + pub code: u16, + pub text: &'a str, +} + +pub fn from(c: Code) -> Status { + Status { + code: c.0, + text: c.1, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + assert_eq!(from(OK).code, 200); + assert_eq!(from(OK).text, "OK"); + } + + #[test] + fn it_works_with_var() { + let code = from(NOT_FOUND); + assert_eq!(code.code, 404); + } +} From d1604c8a7e6039179e4030594372bcae508a89e8 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Thu, 16 Feb 2023 22:54:28 -0500 Subject: [PATCH 147/180] Working basic HTTP server. --- rust/hype/src/lib.rs | 1 + rust/hype/src/main.rs | 44 ++-------------------- rust/hype/src/parser.rs | 12 ++++++ rust/hype/src/response.rs | 13 +++---- rust/hype/src/server.rs | 78 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 49 deletions(-) create mode 100644 rust/hype/src/server.rs diff --git a/rust/hype/src/lib.rs b/rust/hype/src/lib.rs index 8a2c4e4..3dc3189 100644 --- a/rust/hype/src/lib.rs +++ b/rust/hype/src/lib.rs @@ -3,6 +3,7 @@ extern crate lazy_static; pub mod parser; pub mod response; +pub mod server; pub mod status; pub fn add(left: usize, right: usize) -> usize { diff --git a/rust/hype/src/main.rs b/rust/hype/src/main.rs index 3d14fed..7d0aa1c 100644 --- a/rust/hype/src/main.rs +++ b/rust/hype/src/main.rs @@ -1,45 +1,7 @@ -use tokio::{ - io::AsyncReadExt, - net::{TcpListener, TcpStream}, -}; - -use hype::parser::Parser; - -pub async fn dump_stream(mut stream: TcpStream) { - let mut parser = Parser::new(); - - loop { - let mut buf = [0u8; 16]; - - match stream.read(&mut buf).await { - Ok(0) => { - parser.parse_eof().unwrap(); - break; - } - Ok(n) => { - parser.parse_buf(&buf[..n]).unwrap(); - } - Err(e) => { - println!("Error: {:?}", e); - break; - } - } - } - - println!("Parser output:\n{:?}", parser); -} - -pub async fn start() { - let listener = TcpListener::bind("127.0.0.1:4000").await.unwrap(); - - loop { - let (socket, _) = listener.accept().await.unwrap(); - dump_stream(socket).await; - println!("Done"); - } -} +use hype::server::Server; #[tokio::main] async fn main() { - start().await; + let server = Server::new("127.0.0.1".into(), 4000); + server.start().await.unwrap(); } diff --git a/rust/hype/src/parser.rs b/rust/hype/src/parser.rs index bace6d2..6ce420d 100644 --- a/rust/hype/src/parser.rs +++ b/rust/hype/src/parser.rs @@ -171,6 +171,18 @@ impl Parser { Ok(()) } + pub fn is_complete(&self) -> bool { + self.state == State::InBody + && self.buf.len() + == self + .request + .headers + .get("Content-Length") + .unwrap_or(&"0".into()) + .parse::() + .unwrap() + } + pub fn parse_eof(&mut self) -> Result<(), ParseError> { if self.state == State::InBody || self.state == State::InHeaders { self.request.body = std::str::from_utf8(&self.buf[..]).unwrap().into(); diff --git a/rust/hype/src/response.rs b/rust/hype/src/response.rs index 021c781..382e482 100644 --- a/rust/hype/src/response.rs +++ b/rust/hype/src/response.rs @@ -4,7 +4,6 @@ use tokio::io::AsyncWriteExt; use crate::status; -#[allow(dead_code)] #[derive(Debug, Clone)] pub struct Response<'a> { pub status: status::Status<'a>, @@ -12,9 +11,8 @@ pub struct Response<'a> { pub body: String, } -#[allow(dead_code)] impl<'a> Response<'a> { - fn new(status: status::Status) -> Response { + pub fn new(status: status::Status) -> Response { Response { status, headers: HashMap::new(), @@ -22,15 +20,15 @@ impl<'a> Response<'a> { } } - fn set_header(&mut self, key: String, value: String) { + pub fn set_header(&mut self, key: String, value: String) { self.headers.insert(key, value); } - fn set_body(&mut self, body: String) { + pub fn set_body(&mut self, body: String) { self.body = body; } - fn serialize(&mut self) -> String { + pub fn serialize(&mut self) -> String { let status_line = format!("HTTP/1.1 {} {}", self.status.code, self.status.text); let length = self.body.len(); if length > 0 { @@ -48,14 +46,13 @@ impl<'a> Response<'a> { } } -#[allow(dead_code)] pub struct Writer<'a, T: AsyncWriteExt> { stream: &'a mut T, } #[allow(dead_code)] impl<'a, T: AsyncWriteExt> Writer<'a, T> { - fn new(stream: &'a mut T) -> Writer { + pub fn new(stream: &'a mut T) -> Writer { return Writer { stream }; } } diff --git a/rust/hype/src/server.rs b/rust/hype/src/server.rs new file mode 100644 index 0000000..a662841 --- /dev/null +++ b/rust/hype/src/server.rs @@ -0,0 +1,78 @@ +use std::sync::Arc; + +use tokio::{ + io::{AsyncReadExt, AsyncWriteExt}, + net::{TcpListener, TcpStream}, +}; + +use crate::{parser::Parser, response::Response, status}; + +pub struct Server { + address: String, + port: u16, +} + +impl Server { + async fn process_stream(mut stream: TcpStream) { + println!("Connection: {:?}", stream); + let mut parser = Parser::new(); + + loop { + let mut buf = [0u8; 16]; + + match stream.read(&mut buf).await { + Ok(0) => { + parser.parse_eof().unwrap(); + break; + } + Ok(n) => { + parser.parse_buf(&buf[..n]).unwrap(); + if parser.is_complete() { + parser.parse_eof().unwrap(); + break; + } + } + Err(e) => { + println!("Error: {:?}", e); + break; + } + } + } + + let request = parser.get_request(); + println!("request: {:?}", request); + + if request.method == "GET".to_string() && request.path == "/".to_string() { + let mut response = Response::new(status::from(status::OK)); + response.set_body("hi!".into()); + let buf = response.serialize(); + + stream.write_all(buf.as_bytes()).await.unwrap(); + } + } + + pub fn new(address: String, port: u16) -> Self { + Self { address, port } + } + + pub async fn start(&self) -> Result<(), ()> { + let hostport = format!("{}:{}", self.address, self.port); + println!("Listening on {}...", hostport); + let listener = TcpListener::bind(hostport).await.unwrap(); + + loop { + let (socket, _) = listener.accept().await.unwrap(); + tokio::spawn(async move { Server::process_stream(socket).await }); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let server = Server::new("a".into(), 10); + } +} From a244efc8fd1a8ff07326c11011a4f46e65437a4c Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 3 Sep 2023 12:05:38 -0400 Subject: [PATCH 148/180] Added some deno experiments. --- js/deno_test.js | 6 ++++++ js/denolib.ts | 3 +++ js/denorun.ts | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 js/deno_test.js create mode 100644 js/denolib.ts create mode 100644 js/denorun.ts diff --git a/js/deno_test.js b/js/deno_test.js new file mode 100644 index 0000000..1286641 --- /dev/null +++ b/js/deno_test.js @@ -0,0 +1,6 @@ +import { add } from "./denolib.ts"; +import { assertEquals } from "https://deno.land/std@0.201.0/assert/mod.ts"; + +Deno.test("adder test", () => { + assertEquals(add(1, 2), 3); +}) \ No newline at end of file diff --git a/js/denolib.ts b/js/denolib.ts new file mode 100644 index 0000000..8d9b8a2 --- /dev/null +++ b/js/denolib.ts @@ -0,0 +1,3 @@ +export function add(a: number, b: number): number { + return a + b; +} diff --git a/js/denorun.ts b/js/denorun.ts new file mode 100644 index 0000000..7e37f69 --- /dev/null +++ b/js/denorun.ts @@ -0,0 +1,21 @@ +import { add } from "./denolib.ts"; + +// deno run --allow-net="deno.com" ... +async function _dumpSite(site: string) { + const res = await fetch(site); // https://deno.com + const body = await res.text(); + + console.log(body); +} + +function adder() { + console.log(add(1, 2)); +} + +// deno run --allow-env ... +function env() { + console.log(Deno.env.get("HOME")); +} + +adder(); +env(); From e5a5ef627233aec0455d304e94f6d4b216c902d4 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 9 Sep 2023 12:05:55 -0400 Subject: [PATCH 149/180] Added some deno examples. --- js/denorun.ts | 10 ++++++++++ js/glyphnames.js.gz | Bin 0 -> 42730 bytes js/glyphnames2.js.gz | Bin 0 -> 24320 bytes 3 files changed, 10 insertions(+) create mode 100644 js/glyphnames.js.gz create mode 100644 js/glyphnames2.js.gz diff --git a/js/denorun.ts b/js/denorun.ts index 7e37f69..bca9a7e 100644 --- a/js/denorun.ts +++ b/js/denorun.ts @@ -1,4 +1,7 @@ import { add } from "./denolib.ts"; +import chalk from "npm:chalk@5.3"; + +// deno run --allow-all denorun.ts // deno run --allow-net="deno.com" ... async function _dumpSite(site: string) { @@ -17,5 +20,12 @@ function env() { console.log(Deno.env.get("HOME")); } +// deno run --allow-all ... +function hello_color() { + // Seems like you need --allow-all for terminal colors to work + console.log(chalk.green("Hello"), chalk.blue("World!")); +} + adder(); env(); +hello_color(); diff --git a/js/glyphnames.js.gz b/js/glyphnames.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d3476275f6cea62250eabf3ef064c94833c6162d GIT binary patch literal 42730 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 DV58aX literal 0 HcmV?d00001 diff --git a/js/glyphnames2.js.gz b/js/glyphnames2.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..f8fcaa6fb0c213cb7dc1c4b828201db9ff3e2f52 GIT binary patch literal 24320 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 literal 0 HcmV?d00001 From 9956c880972ba186dd890430b2c5bc1cbcf59bd4 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 9 Sep 2023 12:06:33 -0400 Subject: [PATCH 150/180] Added Rust leetcode solutions. --- rust/leetcode/Cargo.lock | 7 ++++ rust/leetcode/Cargo.toml | 8 ++++ rust/leetcode/src/lib.rs | 1 + rust/leetcode/src/two_sum.rs | 73 ++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 rust/leetcode/Cargo.lock create mode 100644 rust/leetcode/Cargo.toml create mode 100644 rust/leetcode/src/lib.rs create mode 100644 rust/leetcode/src/two_sum.rs diff --git a/rust/leetcode/Cargo.lock b/rust/leetcode/Cargo.lock new file mode 100644 index 0000000..d5eb8a3 --- /dev/null +++ b/rust/leetcode/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "leetcode" +version = "0.1.0" diff --git a/rust/leetcode/Cargo.toml b/rust/leetcode/Cargo.toml new file mode 100644 index 0000000..b3979a3 --- /dev/null +++ b/rust/leetcode/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "leetcode" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/leetcode/src/lib.rs b/rust/leetcode/src/lib.rs new file mode 100644 index 0000000..83a8e8c --- /dev/null +++ b/rust/leetcode/src/lib.rs @@ -0,0 +1 @@ +pub mod two_sum; \ No newline at end of file diff --git a/rust/leetcode/src/two_sum.rs b/rust/leetcode/src/two_sum.rs new file mode 100644 index 0000000..52604bd --- /dev/null +++ b/rust/leetcode/src/two_sum.rs @@ -0,0 +1,73 @@ +use std::collections::HashMap; + +// Premature optimization, slow and high memory +pub fn two_sum(nums: Vec, target: i32) -> Vec { + let mut nums: Vec<(usize, i32)> = nums.into_iter().enumerate().collect(); + + nums.sort_by(|a, b| a.1.cmp(&b.1)); + + for (i, num) in nums.iter().enumerate() { + for num2 in nums.iter().skip(i + 1) { + // println!("{} {} {} {}", i, j, num, num2); + if num.1 + num2.1 == target { + return vec![num.0 as i32, num2.0 as i32]; + } + + if num.1 + num2.1 > target { + break; + } + } + } + + vec![0, 0] +} + +// Lowest memory solution, slow +pub fn two_sum2(nums: Vec, target: i32) -> Vec { + for i in 0..nums.len() { + for j in i + 1..nums.len() { + if nums[i] + nums[j] == target { + return vec![i as i32, j as i32]; + } + } + } + + panic!() +} + +// Fastest solution, higher memory +pub fn two_sum3(nums: Vec, target: i32) -> Vec { + let mut map = HashMap::with_capacity(nums.len()); + + for (i, num) in nums.iter().enumerate() { + let complement = target - num; + + if let Some(&j) = map.get(&complement) { + return vec![i as i32, j as i32]; + } + + map.insert(num, i); + } + + panic!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let a = vec![1, 2, 3]; + assert_eq!(two_sum(a.clone(), 3), vec![0, 1]); + assert_eq!(two_sum2(a, 3), vec![0, 1]); + + let a = vec![1, 5, 12, 43, 3, 2, 22, 3433, 28, 21, 11, 9, 8, 7, 44]; + assert_eq!(two_sum(a.clone(), 24), vec![5, 6]); + assert_eq!(two_sum2(a.clone(), 24), vec![4, 9]); + + // two_sum3 uses hashmaps, so the order of the vector is not guaranteed + assert!(two_sum3(a.clone(), 24).contains(&5)); + assert!(two_sum3(a, 24).contains(&6)); + } +} From 34de238dd82e7829e9e49e6ff8b7450737ecd1eb Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 9 Sep 2023 13:57:56 -0400 Subject: [PATCH 151/180] Add Two Numbers --- rust/leetcode/src/add_two_numbers.rs | 106 +++++++++++++++++++++++++++ rust/leetcode/src/lib.rs | 3 +- 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 rust/leetcode/src/add_two_numbers.rs diff --git a/rust/leetcode/src/add_two_numbers.rs b/rust/leetcode/src/add_two_numbers.rs new file mode 100644 index 0000000..4ad085b --- /dev/null +++ b/rust/leetcode/src/add_two_numbers.rs @@ -0,0 +1,106 @@ +#[derive(PartialEq, Eq, Clone, Debug)] +pub struct ListNode { + pub val: i32, + pub next: Option>, +} + +impl ListNode { + #[inline] + fn new(val: i32) -> Self { + ListNode { next: None, val } + } +} + +pub fn new_list(nums: Vec) -> Option> { + let mut list = None; + + for num in nums.into_iter().rev() { + let mut node = ListNode::new(num); + node.next = list; + list = Some(Box::new(node)); + } + + list +} + +pub fn from_int(num: i32) -> Option> { + let mut num = num; + let mut list = vec![]; + + while num > 0 { + let digit = num % 10; + num /= 10; + + list.push(digit); + } + + new_list(list) +} + +pub fn to_int(list: Option>) -> i32 { + let mut list = list; + let mut num = 0; + let mut i = 0; + + while let Some(node) = list { + num += node.val * 10_i32.pow(i); + i += 1; + list = node.next; + } + + num +} + +pub fn add_two_numbers( + l1: Option>, + l2: Option>, +) -> Option> { + let mut l1 = l1.unwrap(); + let mut l2 = l2.unwrap(); + + let mut sum = (l1.val + l2.val) % 10; + let mut carry = (l1.val + l2.val) / 10; + + let mut solution = Box::new(ListNode::new(sum)); + let mut s = &mut solution; + + while l1.next.is_some() || l2.next.is_some() { + l1 = l1.next.unwrap_or(Box::new(ListNode::new(0))); + l2 = l2.next.unwrap_or(Box::new(ListNode::new(0))); + + sum = (l1.val + l2.val + carry) % 10; + carry = (l1.val + l2.val + carry) / 10; + + s.next = Some(Box::new(ListNode::new(sum))); + s = s.next.as_mut().unwrap(); + } + + if carry > 0 { + s.next = Some(Box::new(ListNode::new(carry))); + } + + Some(solution) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let l1 = from_int(342); + let l2 = from_int(465); + + let solution = add_two_numbers(l1, l2); + assert_eq!(to_int(solution), 807); + + let solution = add_two_numbers(from_int(1234), from_int(5678)); + assert_eq!(to_int(solution), 6912); + + let solution = add_two_numbers(from_int(1234), from_int(567)); + assert_eq!(to_int(solution), 1801); + + let solution = add_two_numbers(from_int(9999999), from_int(9999)); + assert_eq!(to_int(solution), 10009998); + } +} diff --git a/rust/leetcode/src/lib.rs b/rust/leetcode/src/lib.rs index 83a8e8c..2616242 100644 --- a/rust/leetcode/src/lib.rs +++ b/rust/leetcode/src/lib.rs @@ -1 +1,2 @@ -pub mod two_sum; \ No newline at end of file +pub mod add_two_numbers; +pub mod two_sum; From c5af71bc3dfc4629b8d4c00de5159ae3e046a576 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 9 Sep 2023 14:01:41 -0400 Subject: [PATCH 152/180] Add Two Numbers --- rust/leetcode/src/add_two_numbers.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rust/leetcode/src/add_two_numbers.rs b/rust/leetcode/src/add_two_numbers.rs index 4ad085b..187eb34 100644 --- a/rust/leetcode/src/add_two_numbers.rs +++ b/rust/leetcode/src/add_two_numbers.rs @@ -82,6 +82,16 @@ pub fn add_two_numbers( Some(solution) } +pub fn add_two_numbers2( + l1: Option>, + l2: Option>, +) -> Option> { + let num1 = to_int(l1); + let num2 = to_int(l2); + + from_int(num1 + num2) +} + #[cfg(test)] mod tests { use super::*; @@ -102,5 +112,7 @@ mod tests { let solution = add_two_numbers(from_int(9999999), from_int(9999)); assert_eq!(to_int(solution), 10009998); + let solution = add_two_numbers2(from_int(9999999), from_int(9999)); + assert_eq!(to_int(solution), 10009998); } } From f1e888bcabf7bcba519039df83465fdbfad17cbf Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 9 Sep 2023 15:27:03 -0400 Subject: [PATCH 153/180] Improved add_two_numbers --- rust/leetcode/src/add_two_numbers.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rust/leetcode/src/add_two_numbers.rs b/rust/leetcode/src/add_two_numbers.rs index 187eb34..af670ee 100644 --- a/rust/leetcode/src/add_two_numbers.rs +++ b/rust/leetcode/src/add_two_numbers.rs @@ -11,6 +11,7 @@ impl ListNode { } } +#[inline] pub fn new_list(nums: Vec) -> Option> { let mut list = None; @@ -23,10 +24,15 @@ pub fn new_list(nums: Vec) -> Option> { list } +#[inline] pub fn from_int(num: i32) -> Option> { let mut num = num; let mut list = vec![]; + if num == 0 { + return Some(Box::new(ListNode::new(0))); + } + while num > 0 { let digit = num % 10; num /= 10; @@ -37,6 +43,7 @@ pub fn from_int(num: i32) -> Option> { new_list(list) } +#[inline] pub fn to_int(list: Option>) -> i32 { let mut list = list; let mut num = 0; @@ -51,6 +58,7 @@ pub fn to_int(list: Option>) -> i32 { num } +// Best solution (so far) pub fn add_two_numbers( l1: Option>, l2: Option>, @@ -82,6 +90,7 @@ pub fn add_two_numbers( Some(solution) } +// This solution works, but is limited to i32, so fails on large numbers pub fn add_two_numbers2( l1: Option>, l2: Option>, @@ -112,6 +121,7 @@ mod tests { let solution = add_two_numbers(from_int(9999999), from_int(9999)); assert_eq!(to_int(solution), 10009998); + let solution = add_two_numbers2(from_int(9999999), from_int(9999)); assert_eq!(to_int(solution), 10009998); } From 17c38dc327203d011f01a592f7d00c5b377447d3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 9 Sep 2023 16:26:01 -0400 Subject: [PATCH 154/180] Finished longest substring --- rust/leetcode/src/lib.rs | 1 + ..._substring_without_repeating_characters.rs | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 rust/leetcode/src/longest_substring_without_repeating_characters.rs diff --git a/rust/leetcode/src/lib.rs b/rust/leetcode/src/lib.rs index 2616242..17baf6a 100644 --- a/rust/leetcode/src/lib.rs +++ b/rust/leetcode/src/lib.rs @@ -1,2 +1,3 @@ pub mod add_two_numbers; +pub mod longest_substring_without_repeating_characters; pub mod two_sum; diff --git a/rust/leetcode/src/longest_substring_without_repeating_characters.rs b/rust/leetcode/src/longest_substring_without_repeating_characters.rs new file mode 100644 index 0000000..e448dbf --- /dev/null +++ b/rust/leetcode/src/longest_substring_without_repeating_characters.rs @@ -0,0 +1,47 @@ +use std::collections::HashMap; + +pub fn length_of_longest_substring(s: String) -> i32 { + let mut longest = 0; + let mut current = 0; + + let mut set = HashMap::new(); + + println!("\n{:?}", s); + + for (i, c) in s.chars().enumerate() { + println!("i: {} c: {} current: {} set: {:?}", i, c, current, set); + if let Some(v) = set.get(&c) { + current = i - v; + let t = *v; + set.retain(|_, val| *val >= t); + set.insert(c, i); + } else { + set.insert(c, i); + current += 1; + } + + if current > longest { + longest = current; + } + } + + longest as i32 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + assert_eq!(length_of_longest_substring("abcabcbb".to_string()), 3); + assert_eq!(length_of_longest_substring("bbbbb".to_string()), 1); + assert_eq!(length_of_longest_substring("pwwkew".to_string()), 3); + assert_eq!(length_of_longest_substring("".to_string()), 0); + assert_eq!(length_of_longest_substring(" ".to_string()), 1); + assert_eq!(length_of_longest_substring("au".to_string()), 2); + assert_eq!(length_of_longest_substring("dvdf".to_string()), 3); + assert_eq!(length_of_longest_substring("abba".to_string()), 2); + assert_eq!(length_of_longest_substring("tmmzuxt".to_string()), 5); + } +} From a5ad46d62494c588b5f84c96aeeda4aae8392f2a Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 10 Sep 2023 10:06:05 -0400 Subject: [PATCH 155/180] Finished median of two sorted arrays --- rust/leetcode/src/add_two_numbers.rs | 2 + rust/leetcode/src/lib.rs | 1 + ..._substring_without_repeating_characters.rs | 5 +- .../src/median_of_two_sorted_arrays.rs | 94 +++++++++++++++++++ rust/leetcode/src/two_sum.rs | 2 + 5 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 rust/leetcode/src/median_of_two_sorted_arrays.rs diff --git a/rust/leetcode/src/add_two_numbers.rs b/rust/leetcode/src/add_two_numbers.rs index af670ee..89e7a69 100644 --- a/rust/leetcode/src/add_two_numbers.rs +++ b/rust/leetcode/src/add_two_numbers.rs @@ -1,3 +1,5 @@ +// https://leetcode.com/problems/add-two-numbers/description/ + #[derive(PartialEq, Eq, Clone, Debug)] pub struct ListNode { pub val: i32, diff --git a/rust/leetcode/src/lib.rs b/rust/leetcode/src/lib.rs index 17baf6a..90f8ea7 100644 --- a/rust/leetcode/src/lib.rs +++ b/rust/leetcode/src/lib.rs @@ -1,3 +1,4 @@ pub mod add_two_numbers; pub mod longest_substring_without_repeating_characters; +pub mod median_of_two_sorted_arrays; pub mod two_sum; diff --git a/rust/leetcode/src/longest_substring_without_repeating_characters.rs b/rust/leetcode/src/longest_substring_without_repeating_characters.rs index e448dbf..4c2dcf6 100644 --- a/rust/leetcode/src/longest_substring_without_repeating_characters.rs +++ b/rust/leetcode/src/longest_substring_without_repeating_characters.rs @@ -1,15 +1,14 @@ use std::collections::HashMap; +// https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ + pub fn length_of_longest_substring(s: String) -> i32 { let mut longest = 0; let mut current = 0; let mut set = HashMap::new(); - println!("\n{:?}", s); - for (i, c) in s.chars().enumerate() { - println!("i: {} c: {} current: {} set: {:?}", i, c, current, set); if let Some(v) = set.get(&c) { current = i - v; let t = *v; diff --git a/rust/leetcode/src/median_of_two_sorted_arrays.rs b/rust/leetcode/src/median_of_two_sorted_arrays.rs new file mode 100644 index 0000000..e576105 --- /dev/null +++ b/rust/leetcode/src/median_of_two_sorted_arrays.rs @@ -0,0 +1,94 @@ +// https://leetcode.com/problems/median-of-two-sorted-arrays/description/ + +pub fn find_median_sorted_arrays(nums1: Vec, nums2: Vec) -> f64 { + let mut i = 0; + let mut j = 0; + + let len = nums1.len() + nums2.len(); + assert_ne!(len, 0); + + let is_even = len % 2 == 0; + + let mut target = if len > 1 { len / 2 } else { 0 }; + if is_even { + target -= 1; + } + + println!("\n{} {} {:?} {:?}", target, is_even, nums1, nums2); + + if nums1.is_empty() { + if nums2.is_empty() { + return 0.0; + } else { + return if is_even { + (nums2[target] + nums2[target + 1]) as f64 / 2.0 + } else { + nums2[target] as f64 + }; + } + } else if nums2.is_empty() { + return if is_even { + (nums1[target] + nums1[target + 1]) as f64 / 2.0 + } else { + nums1[target] as f64 + }; + } + + let mut a = 0; + + while i + j <= target { + if i > nums1.len() - 1 { + a = nums2[j]; + j += 1; + continue; + } else if j > nums2.len() - 1 { + a = nums1[i]; + i += 1; + continue; + } + + if nums1[i] < nums2[j] { + a = nums1[i]; + i += 1; + } else { + a = nums2[j]; + j += 1; + } + } + + let mut b; + + if i > nums1.len() - 1 { + b = nums2[j]; + } else if j > nums2.len() - 1 { + b = nums1[i]; + } else { + if nums1[i] < nums2[j] { + b = nums1[i]; + } else { + b = nums2[j]; + } + } + + println!("{} {} {} {}", i, j, a, b); + + if is_even { + (a + b) as f64 / 2.0 + } else { + a as f64 + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + assert_eq!(find_median_sorted_arrays(vec![1, 3], vec![2]), 2.0); + assert_eq!(find_median_sorted_arrays(vec![1, 2], vec![3, 4]), 2.5); + assert_eq!(find_median_sorted_arrays(vec![1], vec![]), 1.0); + assert_eq!(find_median_sorted_arrays(vec![], vec![2]), 2.0); + assert_eq!(find_median_sorted_arrays(vec![3], vec![-2, -1]), -1.0); + } +} diff --git a/rust/leetcode/src/two_sum.rs b/rust/leetcode/src/two_sum.rs index 52604bd..e88c842 100644 --- a/rust/leetcode/src/two_sum.rs +++ b/rust/leetcode/src/two_sum.rs @@ -1,3 +1,5 @@ +// https://leetcode.com/problems/two-sum/description + use std::collections::HashMap; // Premature optimization, slow and high memory From 6d810c1ce7e6ed6d8e59a4ba669abd425cc7bf14 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 10 Sep 2023 10:10:36 -0400 Subject: [PATCH 156/180] Make linter happy --- rust/leetcode/src/median_of_two_sorted_arrays.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/rust/leetcode/src/median_of_two_sorted_arrays.rs b/rust/leetcode/src/median_of_two_sorted_arrays.rs index e576105..6b1c9b6 100644 --- a/rust/leetcode/src/median_of_two_sorted_arrays.rs +++ b/rust/leetcode/src/median_of_two_sorted_arrays.rs @@ -1,5 +1,7 @@ // https://leetcode.com/problems/median-of-two-sorted-arrays/description/ +use std::cmp::min; + pub fn find_median_sorted_arrays(nums1: Vec, nums2: Vec) -> f64 { let mut i = 0; let mut j = 0; @@ -56,18 +58,14 @@ pub fn find_median_sorted_arrays(nums1: Vec, nums2: Vec) -> f64 { } } - let mut b; + let b; if i > nums1.len() - 1 { b = nums2[j]; } else if j > nums2.len() - 1 { b = nums1[i]; } else { - if nums1[i] < nums2[j] { - b = nums1[i]; - } else { - b = nums2[j]; - } + b = min(nums1[i], nums2[j]); } println!("{} {} {} {}", i, j, a, b); From de87a7c1034659dba9c341c5e03625431fbce052 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 10 Sep 2023 10:55:49 -0400 Subject: [PATCH 157/180] Longest palindromic substring --- rust/leetcode/src/lib.rs | 1 + .../src/longest_palindromic_substring.rs | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 rust/leetcode/src/longest_palindromic_substring.rs diff --git a/rust/leetcode/src/lib.rs b/rust/leetcode/src/lib.rs index 90f8ea7..505ce0d 100644 --- a/rust/leetcode/src/lib.rs +++ b/rust/leetcode/src/lib.rs @@ -1,4 +1,5 @@ pub mod add_two_numbers; +pub mod longest_palindromic_substring; pub mod longest_substring_without_repeating_characters; pub mod median_of_two_sorted_arrays; pub mod two_sum; diff --git a/rust/leetcode/src/longest_palindromic_substring.rs b/rust/leetcode/src/longest_palindromic_substring.rs new file mode 100644 index 0000000..2c49b9c --- /dev/null +++ b/rust/leetcode/src/longest_palindromic_substring.rs @@ -0,0 +1,72 @@ +// https://leetcode.com/problems/longest-palindromic-substring/ + +#[inline] +pub fn is_palindrome(s: &str) -> bool { + let max_len = s.len() / 2 + 1; + for (i, c) in s.chars().enumerate() { + if c != s.as_bytes()[s.len() - i - 1] as char { + return false; + } + + if i >= max_len { + break; + } + } + + true +} + +// Naive solution - O(n^3) +pub fn longest_palindrome(s: String) -> String { + let start_len = s.len(); + + if start_len == 0 { + return "".to_string(); + } + + for len in (1..=start_len).rev() { + for i in 0..=start_len - len { + let sub = &s[i..i + len]; + if is_palindrome(sub) { + return sub.to_string(); + } + } + } + + unreachable!() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_palindrome_test() { + assert!(!is_palindrome("foobar")); + assert!(is_palindrome("aba")); + assert!(is_palindrome("abba")); + assert!(is_palindrome("cabac")); + assert!(is_palindrome("cabbac")); + assert!(!is_palindrome("cabcac")); + } + + #[test] + fn longest_palindrome_test() { + assert_eq!(longest_palindrome("babad".to_string()), "bab".to_string()); + assert_eq!(longest_palindrome("cbbd".to_string()), "bb".to_string()); + assert_eq!(longest_palindrome("a".to_string()), "a".to_string()); + assert_eq!(longest_palindrome("ac".to_string()), "a".to_string()); + assert_eq!(longest_palindrome("bb".to_string()), "bb".to_string()); + assert_eq!(longest_palindrome("ccc".to_string()), "ccc".to_string()); + assert_eq!(longest_palindrome("aaaa".to_string()), "aaaa".to_string()); + assert_eq!(longest_palindrome("aaaaa".to_string()), "aaaaa".to_string()); + assert_eq!( + longest_palindrome("aaaaaa".to_string()), + "aaaaaa".to_string() + ); + assert_eq!( + longest_palindrome("aaaaaaa".to_string()), + "aaaaaaa".to_string() + ); + } +} From 3917287b2570d2b2cb9b6d656978a6afe59da41f Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 10 Sep 2023 19:31:36 -0400 Subject: [PATCH 158/180] Improved algorithm from O(n^3) to O(n^2) --- .../src/longest_palindromic_substring.rs | 89 ++++++++++++++++++- .../src/median_of_two_sorted_arrays.rs | 4 - 2 files changed, 88 insertions(+), 5 deletions(-) diff --git a/rust/leetcode/src/longest_palindromic_substring.rs b/rust/leetcode/src/longest_palindromic_substring.rs index 2c49b9c..2b72877 100644 --- a/rust/leetcode/src/longest_palindromic_substring.rs +++ b/rust/leetcode/src/longest_palindromic_substring.rs @@ -17,7 +17,7 @@ pub fn is_palindrome(s: &str) -> bool { } // Naive solution - O(n^3) -pub fn longest_palindrome(s: String) -> String { +pub fn longest_palindrome_slow(s: String) -> String { let start_len = s.len(); if start_len == 0 { @@ -36,6 +36,75 @@ pub fn longest_palindrome(s: String) -> String { unreachable!() } +// O(n^2) solution +pub fn longest_palindrome(s: String) -> String { + let mut longest = (1, &s[0..1]); + + for i in 0..s.len() - 1 { + let mut p1 = i; + let mut p2 = i; + + let mut same = true; + + while p1 > 0 || p2 < s.len() - 1 { + if p1 > 0 && p2 < s.len() - 1 { + p1 -= 1; + p2 += 1; + + if s.as_bytes()[p1] as char == s.as_bytes()[p2] as char { + if s.as_bytes()[p1] != s.as_bytes()[p1 + 1] { + same = false; + } + if (p2 - p1 + 1) > longest.0 { + longest = (p2 - p1 + 1, &s[p1..=p2]); + } + continue; + } + + p1 += 1; + p2 -= 1; + } + + if p1 > 0 { + p1 -= 1; + + if s.as_bytes()[p1] as char == s.as_bytes()[p2] as char && same { + if s.as_bytes()[p1] != s.as_bytes()[p1 + 1] { + same = false; + continue; + } + + if (p2 - p1 + 1) > longest.0 { + longest = (p2 - p1 + 1, &s[p1..=p2]); + } + continue; + } + p1 += 1; + } + + if p2 < s.len() - 1 { + p2 += 1; + if s.as_bytes()[p1] as char == s.as_bytes()[p2] as char && same { + if s.as_bytes()[p2] != s.as_bytes()[p2 - 1] { + same = false; + continue; + } + + if (p2 - p1 + 1) > longest.0 { + longest = (p2 - p1 + 1, &s[p1..=p2]); + } + continue; + } + // not needed: p2 -= 1; + } + + break; + } + } + + longest.1.into() +} + #[cfg(test)] mod tests { use super::*; @@ -52,6 +121,20 @@ mod tests { #[test] fn longest_palindrome_test() { + assert_eq!(longest_palindrome("abb".to_string()), "bb".to_string()); + assert_eq!( + longest_palindrome("tattarrattat".to_string()), + "tattarrattat".to_string() + ); + assert_eq!( + longest_palindrome("aaaabaaa".to_string()), + "aaabaaa".to_string() + ); + assert_eq!( + longest_palindrome("xaabacxcabaaxcabaax".to_string()), + "xaabacxcabaax".to_string() + ); + assert_eq!(longest_palindrome("abcba".to_string()), "abcba".to_string()); assert_eq!(longest_palindrome("babad".to_string()), "bab".to_string()); assert_eq!(longest_palindrome("cbbd".to_string()), "bb".to_string()); assert_eq!(longest_palindrome("a".to_string()), "a".to_string()); @@ -68,5 +151,9 @@ mod tests { longest_palindrome("aaaaaaa".to_string()), "aaaaaaa".to_string() ); + assert_eq!( + longest_palindrome("aacabdkacaa".to_string()), + "aca".to_string() + ); } } diff --git a/rust/leetcode/src/median_of_two_sorted_arrays.rs b/rust/leetcode/src/median_of_two_sorted_arrays.rs index 6b1c9b6..577d8fa 100644 --- a/rust/leetcode/src/median_of_two_sorted_arrays.rs +++ b/rust/leetcode/src/median_of_two_sorted_arrays.rs @@ -16,8 +16,6 @@ pub fn find_median_sorted_arrays(nums1: Vec, nums2: Vec) -> f64 { target -= 1; } - println!("\n{} {} {:?} {:?}", target, is_even, nums1, nums2); - if nums1.is_empty() { if nums2.is_empty() { return 0.0; @@ -68,8 +66,6 @@ pub fn find_median_sorted_arrays(nums1: Vec, nums2: Vec) -> f64 { b = min(nums1[i], nums2[j]); } - println!("{} {} {} {}", i, j, a, b); - if is_even { (a + b) as f64 / 2.0 } else { From 52359fe788838d1e6f5c432bc585e545ce95fb2d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 16 Sep 2023 09:58:33 -0400 Subject: [PATCH 159/180] Finished Zigzag --- rust/leetcode/src/lib.rs | 1 + rust/leetcode/src/zigzag_conversion.rs | 175 +++++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 rust/leetcode/src/zigzag_conversion.rs diff --git a/rust/leetcode/src/lib.rs b/rust/leetcode/src/lib.rs index 505ce0d..8f0f278 100644 --- a/rust/leetcode/src/lib.rs +++ b/rust/leetcode/src/lib.rs @@ -3,3 +3,4 @@ pub mod longest_palindromic_substring; pub mod longest_substring_without_repeating_characters; pub mod median_of_two_sorted_arrays; pub mod two_sum; +pub mod zigzag_conversion; diff --git a/rust/leetcode/src/zigzag_conversion.rs b/rust/leetcode/src/zigzag_conversion.rs new file mode 100644 index 0000000..5280225 --- /dev/null +++ b/rust/leetcode/src/zigzag_conversion.rs @@ -0,0 +1,175 @@ +// https://leetcode.com/problems/zigzag-conversion/ + +/* + +Z G A +I IZ ZG +G Z A G Z +ZG GI I +A Z G + +--- init: + +num_rows = 5 +spacing = num_rows - 2 +cols_per_block = spacing + 1 +chars_per_block = num_rows + spacing + +-- solve: +str = zigzagzigzagzigzagzig +len = 21 + +num_full_blocks = len / chars_per_block +chars_in_remaining_block = len % chars_per_block +num_blocks = num_full_blocks + (1 if chars_in_remaining_block > 0 else 0) + +-- final: +num_cols = num_blocks * cols_per_block + +--- corner cases + +len < num_rows +len == num_rows +len < chars_per_block +*/ + +#[allow(dead_code)] +#[derive(Debug)] +struct Board { + s: String, + num_rows: i32, + + // -- calculated + len: i32, + spacing: i32, + cols_per_block: i32, + chars_per_block: i32, + num_full_blocks: i32, + chars_in_remaining_block: i32, + num_blocks: i32, + num_cols: i32, + + // -- state + rows: Vec>, +} + +#[derive(Debug)] +enum Direction { + Down, + Up, +} + +impl Board { + pub fn new(s: String, num_rows: i32) -> Self { + let spacing = num_rows - 2; + let cols_per_block = spacing + 1; + let chars_per_block = num_rows + spacing; + let len = s.len() as i32; + let num_full_blocks = len / chars_per_block; + let chars_in_remaining_block = len % chars_per_block; + let num_blocks = num_full_blocks + (if chars_in_remaining_block > 0 { 1 } else { 0 }); + let num_cols = num_blocks * cols_per_block; + let mut rows = Vec::with_capacity(num_rows as usize); + for _ in 0..num_rows { + rows.push(vec![0 as char; num_cols as usize]); + } + + Self { + s, + len, + num_rows, + spacing, + cols_per_block, + chars_per_block, + num_full_blocks, + chars_in_remaining_block, + num_blocks, + num_cols, + rows, + } + } + + pub fn plot(&mut self, row: i32, col: i32, c: char) { + println!("plotting {} at ({}, {})", c, row, col); + self.rows[row as usize][col as usize] = c; + } + + pub fn solve(&mut self) { + use Direction::*; + + let mut dir = Down; + let mut row = 0; + let mut col = 0; + + for c in self.s.clone().chars() { + match dir { + Down => { + if row >= self.num_rows { + dir = Up; + col += 1; + row -= 2; + self.plot(row, col, c); + row -= 1; + } else { + self.plot(row, col, c); + row += 1; + } + } + Up => { + if row < 0 { + dir = Down; + row = 1; + self.plot(row, col, c); + row += 1; + } else { + self.plot(row, col, c); + row -= 1; + col += 1; + } + } + } + } + } + + pub fn as_zigzag(&self) -> String { + let mut s = String::with_capacity(self.s.len()); + for row in self.rows.iter() { + for c in row.iter() { + if *c != 0 as char { + s.push(*c); + } + } + } + s + } +} + +pub fn convert(s: String, num_rows: i32) -> String { + if s.len() == 1 || num_rows == 1 { + return s; + } + + let mut board = Board::new(s, num_rows); + board.solve(); + board.as_zigzag() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let actual = convert("A".to_string(), 1); + assert_eq!(actual, "A"); + + let actual = convert("PAYPALISHIRING".to_string(), 3); + assert_eq!(actual, "PAHNAPLSIIGYIR"); + + let actual = convert("PAYPALISHIRING".to_string(), 4); + assert_eq!(actual, "PINALSIGYAHRPI"); + + let actual = convert("ABCD".to_string(), 2); + assert_eq!(actual, "ACBD"); + } +} From 4dad54687c1b7da6fb63cb970b3aedbae7533fcd Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 16 Sep 2023 10:07:57 -0400 Subject: [PATCH 160/180] Finished Zigzag --- rust/leetcode/src/zigzag_conversion.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rust/leetcode/src/zigzag_conversion.rs b/rust/leetcode/src/zigzag_conversion.rs index 5280225..ec54047 100644 --- a/rust/leetcode/src/zigzag_conversion.rs +++ b/rust/leetcode/src/zigzag_conversion.rs @@ -101,7 +101,8 @@ impl Board { let mut row = 0; let mut col = 0; - for c in self.s.clone().chars() { + for i in 0..self.s.len() { + let c = self.s.chars().nth(i).unwrap(); match dir { Down => { if row >= self.num_rows { @@ -154,6 +155,16 @@ pub fn convert(s: String, num_rows: i32) -> String { board.as_zigzag() } +pub fn convert2(s: String, num_rows: i32) -> String { + if s.len() == 1 || num_rows == 1 { + return s; + } + + let mut board = Board::new(s, num_rows); + board.solve(); + board.as_zigzag() +} + #[cfg(test)] mod tests { use super::*; From ee022c8c54a0b868ed7f11d60d8045de8663b799 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 16 Sep 2023 10:11:13 -0400 Subject: [PATCH 161/180] Finished Zigzag --- rust/leetcode/src/zigzag_conversion.rs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/rust/leetcode/src/zigzag_conversion.rs b/rust/leetcode/src/zigzag_conversion.rs index ec54047..97dbc54 100644 --- a/rust/leetcode/src/zigzag_conversion.rs +++ b/rust/leetcode/src/zigzag_conversion.rs @@ -89,11 +89,6 @@ impl Board { } } - pub fn plot(&mut self, row: i32, col: i32, c: char) { - println!("plotting {} at ({}, {})", c, row, col); - self.rows[row as usize][col as usize] = c; - } - pub fn solve(&mut self) { use Direction::*; @@ -101,18 +96,20 @@ impl Board { let mut row = 0; let mut col = 0; - for i in 0..self.s.len() { - let c = self.s.chars().nth(i).unwrap(); + let s: &str = self.s.as_ref(); + + for i in s.as_bytes() { + let c = *i as char; match dir { Down => { if row >= self.num_rows { dir = Up; col += 1; row -= 2; - self.plot(row, col, c); + self.rows[row as usize][col as usize] = c; row -= 1; } else { - self.plot(row, col, c); + self.rows[row as usize][col as usize] = c; row += 1; } } @@ -120,10 +117,10 @@ impl Board { if row < 0 { dir = Down; row = 1; - self.plot(row, col, c); + self.rows[row as usize][col as usize] = c; row += 1; } else { - self.plot(row, col, c); + self.rows[row as usize][col as usize] = c; row -= 1; col += 1; } From 453f9634837f367850f0496fa39286d43e2aec51 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 17 Sep 2023 09:40:32 -0400 Subject: [PATCH 162/180] Finished reverse integer --- rust/leetcode/src/lib.rs | 1 + rust/leetcode/src/reverse_integer.rs | 57 ++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 rust/leetcode/src/reverse_integer.rs diff --git a/rust/leetcode/src/lib.rs b/rust/leetcode/src/lib.rs index 8f0f278..ea576f8 100644 --- a/rust/leetcode/src/lib.rs +++ b/rust/leetcode/src/lib.rs @@ -2,5 +2,6 @@ pub mod add_two_numbers; pub mod longest_palindromic_substring; pub mod longest_substring_without_repeating_characters; pub mod median_of_two_sorted_arrays; +pub mod reverse_integer; pub mod two_sum; pub mod zigzag_conversion; diff --git a/rust/leetcode/src/reverse_integer.rs b/rust/leetcode/src/reverse_integer.rs new file mode 100644 index 0000000..38f7ac8 --- /dev/null +++ b/rust/leetcode/src/reverse_integer.rs @@ -0,0 +1,57 @@ +// https://leetcode.com/problems/reverse-integer/ + +#[allow(clippy::result_unit_err)] +pub fn reverse2(x: i32) -> Result { + println!("\nx: {}", x); + let mut result = 0i32; + let mut started = None; + + let mut final_place = false; + for i in (1..10).rev() { + let place = 10i32.checked_pow(i).ok_or(())?; + let digit = (x % place) / 10i32.pow(i - 1); + + if i == 9 && x / place != 0 { + final_place = true; + } + + if digit != 0 && started.is_none() { + started = Some(i); + } + + if let Some(started) = started { + let multiple = digit + .checked_mul(10i32.checked_pow(started - i).ok_or(())?) + .ok_or(())?; + + result = result.checked_add(multiple).ok_or(())?; + } + } + + if final_place { + result = result.checked_mul(10).ok_or(())?; + } + + Ok(result) +} + +pub fn reverse(x: i32) -> i32 { + reverse2(x).unwrap_or(0) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_7() { + assert_eq!(reverse(123), 321); + assert_eq!(reverse(-123), -321); + assert_eq!(reverse(120), 21); + assert_eq!(reverse(102), 201); + assert_eq!(reverse(-1002), -2001); + assert_eq!(reverse(0), 0); + assert_eq!(reverse(1_534_236_469), 0); + assert_eq!(reverse(-1_534_236_469), 0); + } +} From a0e3ad472532b7206e4cbb83a3a8f8bc0f393a76 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 17 Sep 2023 09:42:14 -0400 Subject: [PATCH 163/180] Finished reverse integer --- rust/leetcode/src/reverse_integer.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/leetcode/src/reverse_integer.rs b/rust/leetcode/src/reverse_integer.rs index 38f7ac8..cd7224d 100644 --- a/rust/leetcode/src/reverse_integer.rs +++ b/rust/leetcode/src/reverse_integer.rs @@ -53,5 +53,6 @@ mod tests { assert_eq!(reverse(0), 0); assert_eq!(reverse(1_534_236_469), 0); assert_eq!(reverse(-1_534_236_469), 0); + assert_eq!(reverse(-2147483412), -2143847412); } } From be8d95e33b2eb3aa0f7dc3c7055363557ec3d354 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 17 Sep 2023 10:09:05 -0400 Subject: [PATCH 164/180] Fixed bugs in reverse integer --- rust/leetcode/src/reverse_integer.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/rust/leetcode/src/reverse_integer.rs b/rust/leetcode/src/reverse_integer.rs index cd7224d..5c429cf 100644 --- a/rust/leetcode/src/reverse_integer.rs +++ b/rust/leetcode/src/reverse_integer.rs @@ -2,17 +2,17 @@ #[allow(clippy::result_unit_err)] pub fn reverse2(x: i32) -> Result { - println!("\nx: {}", x); let mut result = 0i32; let mut started = None; - let mut final_place = false; + let mut final_place = 0; + for i in (1..10).rev() { let place = 10i32.checked_pow(i).ok_or(())?; let digit = (x % place) / 10i32.pow(i - 1); if i == 9 && x / place != 0 { - final_place = true; + final_place = x / place; } if digit != 0 && started.is_none() { @@ -28,8 +28,12 @@ pub fn reverse2(x: i32) -> Result { } } - if final_place { - result = result.checked_mul(10).ok_or(())?; + if final_place != 0 { + result = result + .checked_mul(10) + .ok_or(())? + .checked_add(final_place) + .ok_or(())?; } Ok(result) From 7948050c144bae192ef73083a5beb1a4779b90f6 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sun, 17 Sep 2023 10:11:29 -0400 Subject: [PATCH 165/180] Fixed bugs in reverse integer --- rust/leetcode/src/reverse_integer.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rust/leetcode/src/reverse_integer.rs b/rust/leetcode/src/reverse_integer.rs index 5c429cf..c19a7ad 100644 --- a/rust/leetcode/src/reverse_integer.rs +++ b/rust/leetcode/src/reverse_integer.rs @@ -20,9 +20,7 @@ pub fn reverse2(x: i32) -> Result { } if let Some(started) = started { - let multiple = digit - .checked_mul(10i32.checked_pow(started - i).ok_or(())?) - .ok_or(())?; + let multiple = digit * 10i32.pow(started - i); result = result.checked_add(multiple).ok_or(())?; } From a63aa24f26428c26f2963f01d00c07ce6900cce3 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 26 Feb 2024 11:06:28 -0500 Subject: [PATCH 166/180] more rust experiments --- rust/leetcode/src/reverse_integer.rs | 1 - rust/threads/Cargo.lock | 7 ++ rust/threads/Cargo.toml | 8 +++ rust/threads/src/atomics1.rs | 33 ++++++++++ rust/threads/src/main.rs | 13 ++++ rust/threads/src/thread1.rs | 99 ++++++++++++++++++++++++++++ 6 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 rust/threads/Cargo.lock create mode 100644 rust/threads/Cargo.toml create mode 100644 rust/threads/src/atomics1.rs create mode 100644 rust/threads/src/main.rs create mode 100644 rust/threads/src/thread1.rs diff --git a/rust/leetcode/src/reverse_integer.rs b/rust/leetcode/src/reverse_integer.rs index c19a7ad..4c67fe5 100644 --- a/rust/leetcode/src/reverse_integer.rs +++ b/rust/leetcode/src/reverse_integer.rs @@ -21,7 +21,6 @@ pub fn reverse2(x: i32) -> Result { if let Some(started) = started { let multiple = digit * 10i32.pow(started - i); - result = result.checked_add(multiple).ok_or(())?; } } diff --git a/rust/threads/Cargo.lock b/rust/threads/Cargo.lock new file mode 100644 index 0000000..e412e95 --- /dev/null +++ b/rust/threads/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "threads" +version = "0.1.0" diff --git a/rust/threads/Cargo.toml b/rust/threads/Cargo.toml new file mode 100644 index 0000000..a40fcd5 --- /dev/null +++ b/rust/threads/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "threads" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/threads/src/atomics1.rs b/rust/threads/src/atomics1.rs new file mode 100644 index 0000000..205c107 --- /dev/null +++ b/rust/threads/src/atomics1.rs @@ -0,0 +1,33 @@ +use std::cell::UnsafeCell; + +pub fn run() { + // Immutable + let a = UnsafeCell::new([1, 2, 3]); + + let ptr = a.get(); + + // Get and mutate it raw -- replace the whole thing + unsafe { + *ptr = [3, 4, 5]; + } + + println!("ptr: {:?} = {:?}", ptr, unsafe { *ptr }); + + // This won't work because a is not mutable + // let r = a.get_mut(); + + let mut a = UnsafeCell::new([2, 1, 3]); + let r = a.get_mut(); + + (*r).sort(); + + println!("r: {:?}", r); + + // With vec + let mut a = UnsafeCell::new(vec![41, 200, 113]); + let r = a.get_mut(); + + r.push(50); + r.sort(); + println!("r: {:?}", r); +} diff --git a/rust/threads/src/main.rs b/rust/threads/src/main.rs new file mode 100644 index 0000000..f3f78be --- /dev/null +++ b/rust/threads/src/main.rs @@ -0,0 +1,13 @@ +mod atomics1; +mod thread1; + +fn main() { + thread1::run1(); + thread1::run2(); + thread1::run3(); + thread1::run4(); + thread1::run5(); + thread1::run6(); + + atomics1::run(); +} diff --git a/rust/threads/src/thread1.rs b/rust/threads/src/thread1.rs new file mode 100644 index 0000000..3f8f2c2 --- /dev/null +++ b/rust/threads/src/thread1.rs @@ -0,0 +1,99 @@ +use std::thread; + +pub fn run1() { + let h1 = thread::spawn(f); + let h2 = thread::spawn(f); + + h1.join().unwrap(); + h2.join().unwrap(); + println!("Hello, from main thread ID: {:?}", thread::current().id()); +} + +pub fn run2() { + let nums = vec![1, 2, 3, 4, 5]; + + thread::spawn(move || { + for n in nums { + println!("{:?} says: {}", thread::current().id(), n); + } + }) + .join() + .unwrap(); +} + +pub fn run3() { + // Scoped threads are a way to ensure that the spawned thread does not outlive the parent thread. Unilke + // regular threads spawned with thread::spawn, which have static lifetimes, scoped threads have lifetimes + // that are tied to the parent thread. This means that the parent thread will wait for all of its scoped + // threads to finish before it exits. This is useful when you want to ensure that all threads are done + // before the parent thread exits. + + let nums = vec![1, 2, 3, 4, 5]; + + thread::scope(|s| { + s.spawn(|| { + for n in nums { + println!("scoped {:?} says: {}", thread::current().id(), n); + } + }); + }) +} + +pub fn run4() { + // Sharing values with threads + static X: [i32; 3] = [1, 2, 3]; + + let x = Box::leak(Box::new([1, 2, 3])); + + thread::spawn(|| dbg!(&X)).join().unwrap(); + thread::spawn(|| dbg!(X)).join().unwrap(); + thread::spawn(|| dbg!(x)).join().unwrap(); +} + +pub fn run5() { + // Some refcounting + use std::rc::Rc; + + let rc = Rc::new([1, 2, 3]); + let rc2 = rc.clone(); + + println!("rc: {:?} rc2: {:?}", rc.as_ptr(), rc2.as_ptr()); + + use std::sync::Arc; + let arc = Arc::new([1, 2, 3]); + let arc2 = arc.clone(); + + println!("arc: {:?} arc2: {:?}", arc.as_ptr(), arc2.as_ptr()); + + thread::spawn({ + // this is not a closure (note: no ||), it's just a separate scope + let arc = arc.clone(); + move || { + // this is a closure + println!("arc: {:?}", arc.as_ptr()); + } + }) + .join() + .unwrap(); +} + + +// MyStruct must be copyable to be used with Cell +#[derive(Debug, Clone, Copy)] +struct MyStruct { + a: i32, + b: i32, +} + +pub fn run6() { + use std::cell::Cell; + + let c = Cell::new(MyStruct { a: 1, b: 2 }); + let v = c.get(); + println!("v: {:?} {:?}", v.a, v.b); +} + +fn f() { + let id = thread::current().id(); + println!("Hello, from thread ID: {:?}", id); +} From ffd719d058d9b0007f56bc03ed5601ddcfa8cc86 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 1 Mar 2024 11:27:09 -0500 Subject: [PATCH 167/180] added some more experiments --- python/torchtest.py | 6 +++++ rust/leetcode/src/string_to_integer_atoi.rs | 1 + rust/threads/src/{atomics1.rs => atomics.rs} | 0 rust/threads/src/locks.rs | 27 ++++++++++++++++++++ rust/threads/src/main.rs | 20 ++++++++------- rust/threads/src/{thread1.rs => thread.rs} | 0 6 files changed, 45 insertions(+), 9 deletions(-) create mode 100755 python/torchtest.py create mode 100644 rust/leetcode/src/string_to_integer_atoi.rs rename rust/threads/src/{atomics1.rs => atomics.rs} (100%) create mode 100644 rust/threads/src/locks.rs rename rust/threads/src/{thread1.rs => thread.rs} (100%) diff --git a/python/torchtest.py b/python/torchtest.py new file mode 100755 index 0000000..8327970 --- /dev/null +++ b/python/torchtest.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +import torch + +zeros = torch.zeros(size=(3,4)) +print(zeros) diff --git a/rust/leetcode/src/string_to_integer_atoi.rs b/rust/leetcode/src/string_to_integer_atoi.rs new file mode 100644 index 0000000..1f3e1c4 --- /dev/null +++ b/rust/leetcode/src/string_to_integer_atoi.rs @@ -0,0 +1 @@ +// https://leetcode.com/problems/string-to-integer-atoi/ diff --git a/rust/threads/src/atomics1.rs b/rust/threads/src/atomics.rs similarity index 100% rename from rust/threads/src/atomics1.rs rename to rust/threads/src/atomics.rs diff --git a/rust/threads/src/locks.rs b/rust/threads/src/locks.rs new file mode 100644 index 0000000..13b816d --- /dev/null +++ b/rust/threads/src/locks.rs @@ -0,0 +1,27 @@ +use std::{sync::Mutex, thread}; + +fn mutexes() { + struct M { + foo: String, + bar: Mutex, + } + + let m = M { + foo: "hello".to_string(), + bar: Mutex::new(0), + }; + + thread::scope(|s| { + for _ in 0..10 { + s.spawn(|| { + let mut b = m.bar.lock().unwrap(); + *b += 1; + m.foo = "world".to_string(); + }); + } + }); +} + +pub fn run() { + mutexes() +} diff --git a/rust/threads/src/main.rs b/rust/threads/src/main.rs index f3f78be..ac0e308 100644 --- a/rust/threads/src/main.rs +++ b/rust/threads/src/main.rs @@ -1,13 +1,15 @@ -mod atomics1; -mod thread1; +mod atomics; +mod locks; +mod thread; fn main() { - thread1::run1(); - thread1::run2(); - thread1::run3(); - thread1::run4(); - thread1::run5(); - thread1::run6(); + thread::run1(); + thread::run2(); + thread::run3(); + thread::run4(); + thread::run5(); + thread::run6(); - atomics1::run(); + atomics::run(); + locks::run(); } diff --git a/rust/threads/src/thread1.rs b/rust/threads/src/thread.rs similarity index 100% rename from rust/threads/src/thread1.rs rename to rust/threads/src/thread.rs From d80bc565a714324b45f69033c8d85c2297db8885 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Mon, 4 Mar 2024 22:31:24 -0500 Subject: [PATCH 168/180] Added atomic/ordering experiments --- rust/threads/Cargo.lock | 68 +++++++++++++++++++ rust/threads/Cargo.toml | 1 + rust/threads/src/atomics.rs | 35 +++++++++- rust/threads/src/locks.rs | 126 +++++++++++++++++++++++++++++++++--- 4 files changed, 220 insertions(+), 10 deletions(-) diff --git a/rust/threads/Cargo.lock b/rust/threads/Cargo.lock index e412e95..8da5b5b 100644 --- a/rust/threads/Cargo.lock +++ b/rust/threads/Cargo.lock @@ -2,6 +2,74 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "threads" version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/rust/threads/Cargo.toml b/rust/threads/Cargo.toml index a40fcd5..113bd6d 100644 --- a/rust/threads/Cargo.toml +++ b/rust/threads/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +rand = "0.8.5" diff --git a/rust/threads/src/atomics.rs b/rust/threads/src/atomics.rs index 205c107..d0f43d3 100644 --- a/rust/threads/src/atomics.rs +++ b/rust/threads/src/atomics.rs @@ -1,6 +1,6 @@ -use std::cell::UnsafeCell; +use std::{cell::UnsafeCell, sync::atomic::AtomicUsize, thread, time::Duration}; -pub fn run() { +pub fn unsafe_cell() { // Immutable let a = UnsafeCell::new([1, 2, 3]); @@ -31,3 +31,34 @@ pub fn run() { r.sort(); println!("r: {:?}", r); } + +pub fn atomic1() { + println!("AtomicUsize"); + static COUNTER: AtomicUsize = AtomicUsize::new(0); + + // Every atomic operation takes an argument of type std::sync::atomic::Ordering, + // which determines what guarantees we get about the relative ordering of operations. + // The simplest variant with the fewest guarantees is Relaxed. Relaxed still + // guarantees consistency on a single atomic variable, but does not promise anything + // about the relative order of operations between different variables. + + thread::spawn(|| loop { + let v = COUNTER.load(std::sync::atomic::Ordering::Relaxed); + println!("thread 1: {}", v); + if v >= 9 { + break; + } + + thread::sleep(Duration::from_millis(100)); + }); + + for i in 0..10 { + COUNTER.store(i, std::sync::atomic::Ordering::Relaxed); + thread::sleep(Duration::from_millis(100)); + } +} + +pub fn run() { + unsafe_cell(); + atomic1(); +} diff --git a/rust/threads/src/locks.rs b/rust/threads/src/locks.rs index 13b816d..e7e308c 100644 --- a/rust/threads/src/locks.rs +++ b/rust/threads/src/locks.rs @@ -1,27 +1,137 @@ -use std::{sync::Mutex, thread}; +use std::{ + collections::VecDeque, + sync::{Arc, Mutex}, + thread, + time::Duration, +}; + +use rand::Rng; fn mutexes() { struct M { - foo: String, bar: Mutex, } - let m = M { - foo: "hello".to_string(), - bar: Mutex::new(0), - }; + let m = M { bar: Mutex::new(0) }; thread::scope(|s| { for _ in 0..10 { s.spawn(|| { + let random_millis = rand::thread_rng().gen_range(0..100); + thread::sleep(Duration::from_millis(random_millis)); let mut b = m.bar.lock().unwrap(); + + // Increment the value (so output is always 1, 2, 3, ...)) *b += 1; - m.foo = "world".to_string(); + println!("{}", *b); }); } }); } +fn mutexes2() { + struct M { + bar: Arc>, + } + + let m = M { + bar: Arc::new(Mutex::new(0)), + }; + + let mut handles = vec![]; + + for i in 0..10 { + let bar = Arc::clone(&m.bar); + + let handle = thread::spawn(move || { + let random_millis = rand::thread_rng().gen_range(0..100); + + // sleep for a random amount of time + thread::sleep(Duration::from_millis(random_millis)); + + let mut b = bar.lock().unwrap(); + // Assign i to b, so output will vary based on the order of execution + *b = i; + println!("{}", *b); + }); + + handles.push(handle); + } + + handles.into_iter().for_each(|h| h.join().unwrap()); +} + +fn park() { + println!("Parking a thread"); + + // Share this queue between the producer and consumer, using thread::park() to + // block the consumer when the queue is empty. This is a simple way to implement + // a producer-consumer pattern, but breaks down when there are multiple consumers: if + // we had multiple consumer threads taking items from the same queue, the producer + // thread would have no way of knowing which of the consumers is actually + // waiting and should be woken up. + let q = Mutex::new(VecDeque::new()); + + thread::scope(|s| { + // Consumer + let t = s.spawn(|| loop { + let item = q.lock().unwrap().pop_front(); + if let Some(v) = item { + println!("Consumed {}", v); + if v == 9 { + break; + } + } else { + // Park only if the queue is empty, not on every iteration (otherwise it + // may block the thread indefinitely waiting for an item to be pushed) + thread::park(); + } + }); + + // Producer + for i in 0..10 { + q.lock().unwrap().push_back(i); + t.thread().unpark(); + thread::sleep(Duration::from_millis(50)); + } + }); +} + +fn cond_var() { + println!("Condition variables"); + + let q = Mutex::new(VecDeque::new()); + let cvar = std::sync::Condvar::new(); + + thread::scope(|s| { + // Consumer + s.spawn(|| { + loop { + let mut q = q.lock().unwrap(); + let item = q.pop_front(); + if let Some(v) = item { + println!("Consumed {}", v); + if v == 9 { + break; + } + } else { + // Wait for the producer to signal that there's an item in the queue + q = cvar.wait(q).unwrap(); + } + } + }); + + for i in 0..10 { + q.lock().unwrap().push_back(i); + cvar.notify_one(); + thread::sleep(Duration::from_millis(50)); + } + }); +} + pub fn run() { - mutexes() + mutexes(); + mutexes2(); + park(); + cond_var(); } From c170bd2058445d1ad4935897be6e894a24399d3d Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Fri, 12 Apr 2024 10:38:39 -0400 Subject: [PATCH 169/180] Added some python leetcode solutions. --- python/challenges/add_two_numbers.py | 61 + python/challenges/all_subsets.py | 66 + python/challenges/easy_div7_not5.py | 19 + python/challenges/fib.py | 32 + python/challenges/find_duplicate_number.py | 30068 +++++++++++++++++++ python/challenges/house_robber.py | 20 + python/challenges/longest_palindrome.py | 49 + python/challenges/longest_substring.py | 44 + python/challenges/lru_cache.py | 152 + python/challenges/max_profit.py | 44 + python/challenges/max_subarray.py | 45 + python/challenges/num_islands.py | 56 + python/challenges/trapping_water.py | 38 + 13 files changed, 30694 insertions(+) create mode 100644 python/challenges/add_two_numbers.py create mode 100644 python/challenges/all_subsets.py create mode 100644 python/challenges/easy_div7_not5.py create mode 100644 python/challenges/fib.py create mode 100644 python/challenges/find_duplicate_number.py create mode 100644 python/challenges/house_robber.py create mode 100644 python/challenges/longest_palindrome.py create mode 100644 python/challenges/longest_substring.py create mode 100644 python/challenges/lru_cache.py create mode 100644 python/challenges/max_profit.py create mode 100644 python/challenges/max_subarray.py create mode 100644 python/challenges/num_islands.py create mode 100644 python/challenges/trapping_water.py diff --git a/python/challenges/add_two_numbers.py b/python/challenges/add_two_numbers.py new file mode 100644 index 0000000..24df758 --- /dev/null +++ b/python/challenges/add_two_numbers.py @@ -0,0 +1,61 @@ +# https://leetcode.com/problems/add-two-numbers/ + + +class ListNode: + @staticmethod + def from_list(vals: list): + ans = ListNode(vals[0]) + node = ans + + for val in vals[1:]: + node.next = ListNode(val) + node = node.next + + return ans + + def __init__(self, val, next=None): + self.val = val + self.next = next + + def to_list(self): + ans = [] + node = self + + while node is not None: + print(node.val, node.next) + ans.append(node.val) + node = node.next + + return ans + + +def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode: + final = ListNode(0) + ans = final + p1 = l1 + p2 = l2 + carry = 0 + + while 1: + val = (p1 and p1.val or 0) + (p2 and p2.val or 0) + carry + ans.val = int(val % 10) + carry = int(val / 10) + p1 = p1 and p1.next + p2 = p2 and p2.next + + if p1 is None and p2 is None and carry == 0: + break + + ans.next = ListNode(0) + ans = ans.next + + return final + + +l = ListNode.from_list +ans = addTwoNumbers(l([2, 4, 3]), l([5, 6, 4])) +print(ans, ans.to_list()) + + +ans = addTwoNumbers(l([9, 9, 9, 9, 9, 9, 9]), l([9, 9, 9, 9])) +print(ans, ans.to_list()) diff --git a/python/challenges/all_subsets.py b/python/challenges/all_subsets.py new file mode 100644 index 0000000..7d709f6 --- /dev/null +++ b/python/challenges/all_subsets.py @@ -0,0 +1,66 @@ +# Working through the problem of finding all subsets of [1, 2, 3, 4, 5] in a recursive manner. + +# ---- Base: +# [] + +# ---- Add 1: +# 1 + +# ---- Add 2: +# 2 +# 1, 2 + +# ---- Add 3 +# 1, 3 +# 2, 3 +# 1, 2, 3 + +# ---- Add 4 +# 1, 4 +# 2, 4 +# 1, 2, 4 + +# 1, 3, 4 +# 2, 3, 4 +# 1, 2, 3, 4 + +# ---- Add 5 +# 1, 5 +# 2, 5 +# 1, 2, 5 + +# 1, 3, 5 +# 2, 3, 5 +# 1, 2, 3, 5 + +# 1, 4, 5 +# 2, 4, 5 +# 1, 2, 4, 5 + +# 1, 3, 4, 5 +# 2, 3, 4, 5 +# 1, 2, 3, 4, 5 + +# Every line of numbers above is a unique subset of [1, 2, 3, 4, 5]. +# +# [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4], [5], [1, 5], [2, 5], [1, 2, 5], [3, 5], [1, 3, 5], [2, 3, 5], [1, 2, 3, 5], [4, 5], [1, 4, 5], [2, 4, 5], [1, 2, 4, 5], [3, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5], [1, 2, 3, 4, 5]] + + +def all_subsets(q): + return get_subsets(q, []) + + +def get_subsets(q, result): + if len(q) == 0: + return [[]] + result + + subset = [[q[0]]] + for r in result: + subset.append(r[:] + [q[0]]) + + [result.append(s) for s in subset] + + return get_subsets(q[1:], result) + + +print(all_subsets([1, 2, 3, 4, 5])) diff --git a/python/challenges/easy_div7_not5.py b/python/challenges/easy_div7_not5.py new file mode 100644 index 0000000..3bae191 --- /dev/null +++ b/python/challenges/easy_div7_not5.py @@ -0,0 +1,19 @@ +# https://github.com/zhiwehu/Python-programming-exercises/blob/master/100%2B%20Python%20challenging%20programming%20exercises.txt + + +""" +Question 1 +Level 1 + +Question: +Write a program which will find all such numbers which are divisible by 7 but are not a multiple of 5, +between 2000 and 3200 (both included). +The numbers obtained should be printed in a comma-separated sequence on a single line. +""" + + +def solve(): + return [x for x in range(2000, 3200) if x % 7 == 0 and x % 5 != 0] + + +print(solve()) diff --git a/python/challenges/fib.py b/python/challenges/fib.py new file mode 100644 index 0000000..15ca6c5 --- /dev/null +++ b/python/challenges/fib.py @@ -0,0 +1,32 @@ +def fib_1(num): + if num < 0: + raise ValueError(num) + if num == 0: + return 0 + + if num == 1 or num == 2: + return 1 + + return fib_1(num - 1) + fib_1(num - 2) + + +def fib_2(num): + t = {} + t[0] = 0 + t[1] = 1 + t[2] = 1 + + if num < 0: + raise ValueError(num) + + if num < 2: + return t[num] + + for n in range(3, num + 1): + t[n] = t[n - 1] + t[n - 2] + + return t[num] + + +print(5, fib_2(50)) +print(5, fib_1(50)) diff --git a/python/challenges/find_duplicate_number.py b/python/challenges/find_duplicate_number.py new file mode 100644 index 0000000..3fdfebd --- /dev/null +++ b/python/challenges/find_duplicate_number.py @@ -0,0 +1,30068 @@ +# https://leetcode.com/problems/find-the-duplicate-number/description/ + + +class BitSet: + def __init__(self, num_bits): + self.bitset = bytearray(int(num_bits / 8) + 1) + + def set(self, index): + self.bitset[int(index / 8)] |= 1 << index % 8 + + def get(self, index) -> bool: + return self.bitset[int(index / 8)] & 1 << index % 8 > 0 + + def __str__(self): + s = f"{len(self.bitset) * 8}-bit bitset: [{self.bitset}] " + for i in range(len(self.bitset) * 8): + s += self.get(i) and "1 " or "0 " + + return s + + +def findDuplicate(nums: list[int]) -> int: + bitset = BitSet(100000) + + for i in nums: + if bitset.get(i): + return i + + bitset.set(i) + + return -1 + + +def test_bitset(): + bitset = BitSet(16) + assert bitset.get(8) is False + bitset.set(8) + assert bitset.get(8) is True + bitset.set(7) + bitset.set(11) + assert bitset.get(7) is True + assert bitset.get(11) is True + assert bitset.get(0) is False + bitset.set(0) + assert bitset.get(0) is True + print(bitset) + + +test_bitset() + +assert findDuplicate([1, 3, 4, 2, 2]) == 2 +assert findDuplicate([3, 1, 3, 4, 2]) == 3 +assert findDuplicate([3, 3, 3, 3, 3, 3, 3, 3]) == 3 +assert ( + findDuplicate( + [14, 16, 12, 1, 16, 17, 6, 8, 5, 19, 16, 13, 16, 3, 11, 16, 4, 16, 9, 7] + ) + == 16 +) + +assert ( + findDuplicate( + [ + 3813, + 8229, + 15919, + 16146, + 19061, + 26146, + 11849, + 28124, + 22288, + 19711, + 6050, + 27586, + 25607, + 4226, + 16366, + 28307, + 19954, + 6764, + 27118, + 17464, + 21581, + 6627, + 9221, + 26702, + 15971, + 24298, + 23098, + 21967, + 26853, + 23008, + 14622, + 27549, + 1590, + 9776, + 8537, + 22716, + 23037, + 12719, + 19716, + 8266, + 9230, + 6897, + 22429, + 21539, + 18852, + 3470, + 8434, + 10895, + 5146, + 14841, + 22687, + 29176, + 23650, + 29111, + 6678, + 17754, + 23144, + 7501, + 2303, + 26700, + 24078, + 29702, + 6072, + 22366, + 5340, + 19726, + 16081, + 4594, + 2514, + 12237, + 12857, + 21376, + 4075, + 4867, + 25623, + 14322, + 5627, + 19661, + 29576, + 9735, + 17093, + 21938, + 11584, + 29387, + 27764, + 13154, + 28581, + 6634, + 29503, + 17074, + 7536, + 21327, + 20982, + 26266, + 25593, + 6201, + 26210, + 13506, + 21860, + 22228, + 12345, + 8854, + 18668, + 28127, + 815, + 11424, + 29167, + 8703, + 11327, + 16182, + 28450, + 12293, + 23438, + 18703, + 16766, + 13554, + 3268, + 19702, + 25420, + 19723, + 14355, + 9040, + 18287, + 29064, + 1387, + 29082, + 29847, + 16443, + 5329, + 29895, + 19808, + 10759, + 25715, + 15645, + 17198, + 23159, + 18070, + 22372, + 26576, + 20985, + 26907, + 17000, + 10087, + 18108, + 15584, + 7404, + 19051, + 12314, + 15799, + 29228, + 12743, + 23402, + 23869, + 11007, + 11543, + 931, + 5000, + 10879, + 24942, + 26556, + 19238, + 26741, + 24944, + 29866, + 13096, + 19510, + 4865, + 12506, + 7463, + 11430, + 17993, + 2896, + 5621, + 1974, + 27184, + 6974, + 22256, + 8256, + 16731, + 23503, + 26335, + 20273, + 8608, + 3909, + 23546, + 13144, + 16979, + 4572, + 21991, + 14783, + 4629, + 28087, + 21875, + 18592, + 11179, + 13478, + 24519, + 25320, + 13119, + 19803, + 2934, + 8173, + 5394, + 22077, + 29669, + 24426, + 14468, + 14216, + 6199, + 4731, + 22827, + 28375, + 4882, + 16999, + 14444, + 20250, + 2686, + 23113, + 5083, + 16203, + 29295, + 20495, + 22406, + 8422, + 16487, + 11370, + 22127, + 23316, + 8914, + 21535, + 17144, + 29394, + 25888, + 7068, + 28082, + 28342, + 13482, + 27902, + 13006, + 1951, + 12529, + 20776, + 13721, + 10117, + 3184, + 4747, + 1319, + 20572, + 4499, + 484, + 1698, + 20974, + 1636, + 15585, + 11268, + 6143, + 29542, + 20960, + 18696, + 29993, + 24747, + 23542, + 15826, + 22677, + 9463, + 20719, + 3504, + 22820, + 26296, + 23143, + 15823, + 16281, + 29597, + 2577, + 10239, + 22908, + 9583, + 22678, + 10278, + 8845, + 16169, + 2511, + 22131, + 14891, + 18105, + 28177, + 17836, + 15401, + 24163, + 27160, + 17126, + 13279, + 6233, + 4743, + 29945, + 1893, + 14048, + 9210, + 24767, + 11244, + 11118, + 16843, + 17540, + 14873, + 757, + 15363, + 28765, + 19967, + 10713, + 8569, + 24676, + 18551, + 28117, + 8912, + 3295, + 2679, + 18504, + 15447, + 17909, + 12003, + 527, + 29850, + 27088, + 18365, + 8199, + 29405, + 19524, + 27941, + 28068, + 19320, + 26511, + 28381, + 20455, + 673, + 4352, + 24272, + 12926, + 17053, + 2676, + 22883, + 12817, + 8092, + 324, + 11839, + 19229, + 18328, + 6697, + 11532, + 25056, + 19447, + 15926, + 2105, + 26838, + 13759, + 3771, + 9036, + 11323, + 20602, + 22950, + 2754, + 25550, + 15235, + 3958, + 1826, + 1489, + 11027, + 9405, + 9023, + 18233, + 10369, + 1105, + 13937, + 16474, + 18573, + 23723, + 1628, + 16102, + 5552, + 27601, + 6110, + 8516, + 19043, + 9893, + 24126, + 26385, + 2593, + 8642, + 25010, + 11320, + 9917, + 29578, + 26740, + 29020, + 18216, + 9261, + 26279, + 20348, + 23394, + 25000, + 10891, + 20018, + 828, + 28328, + 20565, + 10273, + 13752, + 22059, + 4827, + 1960, + 1952, + 29923, + 12783, + 14793, + 28406, + 17935, + 26549, + 19631, + 4431, + 25225, + 29806, + 26989, + 7624, + 24286, + 17236, + 26536, + 24104, + 16008, + 6430, + 26028, + 26106, + 15304, + 8319, + 16650, + 17643, + 25168, + 23120, + 26082, + 20644, + 29775, + 773, + 6198, + 2743, + 6216, + 4703, + 29113, + 12472, + 16782, + 26424, + 3325, + 1431, + 19283, + 2673, + 27952, + 6777, + 24802, + 11278, + 13188, + 20354, + 17367, + 20655, + 10265, + 28409, + 29122, + 12940, + 20784, + 28299, + 8822, + 15811, + 16906, + 8974, + 15717, + 2167, + 26158, + 4290, + 20445, + 28769, + 17379, + 14594, + 6163, + 3620, + 27587, + 10898, + 26071, + 1711, + 29074, + 29003, + 14653, + 19047, + 17557, + 21750, + 24011, + 20283, + 21538, + 28679, + 12092, + 25817, + 28025, + 9158, + 14733, + 6505, + 28562, + 16372, + 29856, + 23876, + 16519, + 15249, + 26768, + 9464, + 5337, + 9809, + 18118, + 14579, + 477, + 19563, + 6619, + 22284, + 21901, + 7066, + 20496, + 19985, + 14202, + 11762, + 27538, + 194, + 16586, + 29666, + 7365, + 16502, + 26738, + 24321, + 3737, + 20980, + 2221, + 9459, + 8669, + 23213, + 3176, + 7526, + 2974, + 26313, + 25545, + 4493, + 709, + 28587, + 14769, + 182, + 6260, + 18060, + 22741, + 23377, + 1330, + 1487, + 14505, + 29493, + 14055, + 10995, + 26346, + 15449, + 24055, + 256, + 23780, + 23941, + 29916, + 3538, + 23577, + 17988, + 23334, + 6582, + 22856, + 11965, + 6577, + 27903, + 10038, + 12582, + 3437, + 24152, + 14918, + 1764, + 29218, + 22446, + 25220, + 18389, + 8489, + 3593, + 5603, + 22947, + 10726, + 15476, + 15762, + 9546, + 24387, + 29253, + 3322, + 4517, + 15297, + 7973, + 15018, + 891, + 19319, + 341, + 24307, + 25629, + 1482, + 17936, + 28898, + 15648, + 15418, + 21988, + 21729, + 13529, + 213, + 26851, + 2504, + 6957, + 27940, + 14527, + 18247, + 15638, + 4732, + 16683, + 24262, + 24868, + 28217, + 8614, + 16426, + 10184, + 12050, + 24832, + 2034, + 27120, + 1381, + 8128, + 329, + 25116, + 20412, + 11342, + 23118, + 29910, + 16272, + 28867, + 22958, + 843, + 11914, + 15152, + 11219, + 16357, + 15131, + 22025, + 14358, + 248, + 18740, + 11702, + 5219, + 22589, + 25231, + 16579, + 16251, + 28463, + 6572, + 11083, + 14964, + 6546, + 26526, + 1981, + 15490, + 23147, + 16510, + 4287, + 18621, + 17384, + 23238, + 25002, + 19071, + 7819, + 11032, + 29664, + 19980, + 29213, + 14393, + 20940, + 10161, + 20456, + 13695, + 22898, + 13236, + 5581, + 11784, + 14907, + 19840, + 28827, + 15321, + 22970, + 11379, + 8536, + 24281, + 8241, + 2973, + 24290, + 16902, + 26873, + 25530, + 9258, + 15818, + 9842, + 19874, + 5908, + 7729, + 20829, + 11197, + 25312, + 11826, + 21116, + 18538, + 22442, + 27478, + 202, + 3672, + 6099, + 5438, + 25755, + 28836, + 6085, + 16557, + 8539, + 26277, + 8951, + 16927, + 16508, + 10747, + 29162, + 4890, + 5582, + 12235, + 22088, + 947, + 3128, + 26732, + 20817, + 28720, + 20777, + 20431, + 2149, + 3157, + 25185, + 26323, + 9604, + 1798, + 26033, + 4177, + 23178, + 5647, + 12970, + 2697, + 28495, + 22647, + 1502, + 27116, + 27520, + 17986, + 3710, + 20350, + 2678, + 14681, + 15218, + 12598, + 13881, + 24510, + 1574, + 20922, + 25337, + 21338, + 21485, + 10978, + 22711, + 14146, + 23841, + 27158, + 15822, + 28110, + 3884, + 5628, + 20554, + 27393, + 15373, + 17119, + 2783, + 8327, + 4723, + 19905, + 29265, + 27611, + 1192, + 7281, + 11243, + 12010, + 23672, + 5044, + 24777, + 10341, + 20678, + 11220, + 11225, + 17514, + 14145, + 6477, + 5004, + 28976, + 28056, + 4313, + 18362, + 21413, + 22794, + 23578, + 15714, + 21781, + 18384, + 21978, + 19538, + 382, + 15819, + 13966, + 9560, + 23622, + 7381, + 15522, + 28188, + 16820, + 23280, + 45, + 2459, + 3451, + 7160, + 28994, + 20530, + 28693, + 27497, + 28215, + 29544, + 9715, + 11116, + 20653, + 27915, + 6182, + 17273, + 21950, + 26263, + 23124, + 5853, + 5616, + 15760, + 29259, + 867, + 11476, + 2490, + 20486, + 2164, + 7238, + 24425, + 11003, + 14154, + 19830, + 1582, + 12049, + 26695, + 15464, + 12634, + 304, + 16641, + 25278, + 14807, + 24548, + 28940, + 9633, + 2583, + 1336, + 28336, + 26253, + 3383, + 4484, + 17410, + 16113, + 8427, + 18651, + 23017, + 13610, + 18082, + 5945, + 22267, + 12791, + 21655, + 29577, + 11817, + 7928, + 9966, + 858, + 24397, + 5259, + 20362, + 2967, + 7577, + 23741, + 25449, + 5963, + 8648, + 166, + 19036, + 1879, + 24863, + 21496, + 2868, + 19807, + 25347, + 7169, + 17979, + 1079, + 4843, + 20990, + 21853, + 20908, + 100, + 27389, + 26843, + 17101, + 26311, + 1232, + 9298, + 24569, + 244, + 8715, + 5502, + 14731, + 7970, + 4297, + 26730, + 20556, + 18882, + 7187, + 19275, + 20877, + 26459, + 15604, + 24457, + 2624, + 8153, + 26720, + 4590, + 10012, + 22347, + 9806, + 12186, + 20178, + 28399, + 3136, + 21095, + 2824, + 28715, + 22173, + 16433, + 7909, + 16362, + 5263, + 20098, + 18756, + 6831, + 26826, + 15412, + 19620, + 21224, + 20425, + 24216, + 3393, + 22244, + 8595, + 20458, + 10572, + 2966, + 2447, + 22234, + 1257, + 25123, + 13925, + 6287, + 926, + 28643, + 7456, + 12852, + 14449, + 23230, + 8220, + 9160, + 21969, + 20966, + 22391, + 3379, + 28353, + 10855, + 877, + 5759, + 27624, + 14460, + 11874, + 28904, + 2226, + 20938, + 29317, + 14011, + 20379, + 28182, + 22866, + 19326, + 13385, + 6008, + 15434, + 16797, + 26440, + 29301, + 12887, + 9656, + 12686, + 283, + 21156, + 22122, + 17130, + 17806, + 20027, + 7174, + 570, + 28983, + 23383, + 20594, + 29553, + 15789, + 497, + 22824, + 6266, + 19695, + 2617, + 7663, + 15690, + 13261, + 25783, + 18408, + 10271, + 23016, + 3147, + 4673, + 13766, + 23087, + 6078, + 16778, + 22373, + 14811, + 10428, + 21713, + 27577, + 28166, + 17325, + 16573, + 23467, + 8862, + 24528, + 11507, + 8556, + 28609, + 5864, + 6089, + 17437, + 26048, + 23641, + 17765, + 16285, + 11176, + 19590, + 23350, + 25224, + 20494, + 22593, + 21596, + 26160, + 3652, + 19927, + 24436, + 28997, + 29821, + 21943, + 27540, + 26420, + 22457, + 16528, + 17291, + 15758, + 24111, + 2307, + 7633, + 18923, + 5492, + 8134, + 13357, + 5441, + 18116, + 15198, + 2026, + 29660, + 22369, + 14158, + 23084, + 28658, + 5182, + 16934, + 29962, + 12109, + 11246, + 27494, + 11705, + 16068, + 2787, + 17491, + 22339, + 8764, + 10932, + 13007, + 28111, + 8380, + 23557, + 20559, + 16981, + 4969, + 14102, + 23126, + 29198, + 3641, + 19756, + 16524, + 28883, + 11701, + 5306, + 15841, + 21483, + 24491, + 16692, + 21134, + 28632, + 9322, + 14244, + 1252, + 7005, + 6090, + 4, + 25865, + 24700, + 17351, + 1491, + 2876, + 23994, + 2954, + 22546, + 1690, + 2331, + 23589, + 16453, + 9642, + 29135, + 13879, + 21881, + 27124, + 26865, + 23754, + 21492, + 1883, + 13977, + 8368, + 10110, + 19042, + 12979, + 586, + 5122, + 27679, + 18088, + 1655, + 22367, + 9825, + 544, + 3793, + 14308, + 10471, + 20717, + 28174, + 20099, + 14181, + 27905, + 29834, + 15387, + 16398, + 8385, + 23149, + 4453, + 19009, + 26331, + 9510, + 11097, + 8051, + 19982, + 13975, + 21842, + 3269, + 21815, + 25284, + 12953, + 4111, + 26795, + 8711, + 20848, + 24716, + 20681, + 24988, + 11628, + 2900, + 13172, + 6600, + 3120, + 15842, + 26916, + 7341, + 9077, + 10533, + 20589, + 22791, + 24003, + 22474, + 22934, + 27691, + 15847, + 1091, + 24459, + 12412, + 8036, + 627, + 14798, + 21231, + 9181, + 12098, + 1211, + 8938, + 375, + 22417, + 2677, + 17261, + 26904, + 20632, + 28143, + 488, + 12384, + 4083, + 13588, + 10953, + 1193, + 12465, + 21792, + 7500, + 18322, + 20044, + 18660, + 9878, + 7272, + 20039, + 21547, + 11818, + 7958, + 15445, + 27255, + 141, + 10263, + 16724, + 11216, + 5022, + 24651, + 8101, + 2262, + 4158, + 22857, + 19648, + 16514, + 25511, + 23122, + 27776, + 9183, + 15473, + 6475, + 28694, + 2329, + 11011, + 13072, + 14423, + 15331, + 748, + 4494, + 22078, + 2576, + 24943, + 22236, + 25520, + 12915, + 2605, + 7237, + 6652, + 23865, + 27917, + 5488, + 4891, + 19005, + 6342, + 8777, + 19345, + 14320, + 5718, + 12819, + 22322, + 4936, + 22389, + 17289, + 12162, + 26737, + 16016, + 21201, + 12206, + 22412, + 26350, + 19077, + 11350, + 1000, + 1721, + 22752, + 29383, + 2632, + 9885, + 3466, + 20315, + 12341, + 7082, + 27398, + 8442, + 29730, + 22092, + 22064, + 25236, + 27589, + 4186, + 24600, + 27051, + 29327, + 29286, + 15270, + 8839, + 4716, + 22632, + 22098, + 22952, + 14435, + 16729, + 26312, + 8116, + 674, + 6742, + 3658, + 13794, + 662, + 16129, + 13923, + 29899, + 11832, + 15708, + 21360, + 22110, + 12294, + 19373, + 27130, + 29788, + 4459, + 27077, + 10051, + 21744, + 28957, + 1821, + 21739, + 7482, + 24086, + 27011, + 1607, + 8408, + 28057, + 2152, + 20017, + 10751, + 20970, + 12376, + 3897, + 15871, + 21446, + 20799, + 7873, + 14648, + 13428, + 28351, + 11510, + 23902, + 12308, + 15770, + 726, + 951, + 19879, + 5540, + 13307, + 12567, + 4345, + 7493, + 18697, + 12712, + 2926, + 25283, + 5057, + 20992, + 10006, + 1873, + 12837, + 17428, + 8975, + 11352, + 2646, + 4232, + 13346, + 14242, + 6229, + 17827, + 20318, + 2342, + 24499, + 13093, + 26782, + 24535, + 29377, + 19091, + 7906, + 13444, + 22466, + 4485, + 28926, + 27084, + 3040, + 15551, + 29863, + 28168, + 7645, + 22617, + 26713, + 7380, + 28265, + 28700, + 24219, + 9471, + 7440, + 24269, + 13981, + 5659, + 27154, + 19557, + 1188, + 25180, + 13916, + 2265, + 6310, + 10539, + 21097, + 16701, + 25864, + 6924, + 3872, + 14264, + 2102, + 20073, + 4985, + 17462, + 5155, + 9209, + 23634, + 20275, + 24811, + 25954, + 15020, + 26466, + 6435, + 21417, + 3365, + 20842, + 3501, + 29055, + 18914, + 7433, + 10005, + 17322, + 19789, + 13060, + 3478, + 23234, + 10208, + 2071, + 9170, + 10070, + 9772, + 21364, + 7353, + 25709, + 25040, + 17256, + 10426, + 12070, + 23737, + 12828, + 16082, + 3316, + 790, + 24380, + 29928, + 18624, + 16412, + 1025, + 618, + 4739, + 2338, + 20016, + 26037, + 16783, + 26375, + 6506, + 22411, + 3560, + 10513, + 2156, + 13814, + 13723, + 4175, + 20090, + 25057, + 23566, + 5229, + 23066, + 20867, + 2872, + 14386, + 12468, + 1374, + 20382, + 26486, + 28872, + 7112, + 28116, + 24755, + 1402, + 2224, + 10945, + 22583, + 9771, + 3297, + 21041, + 1140, + 2174, + 15506, + 19291, + 16607, + 21389, + 20689, + 3083, + 13301, + 17833, + 1937, + 4196, + 19844, + 1301, + 6540, + 21476, + 20618, + 20723, + 6784, + 22532, + 12032, + 6669, + 15687, + 7979, + 22704, + 4878, + 8190, + 9054, + 26302, + 17011, + 11411, + 1263, + 10509, + 1125, + 29332, + 23510, + 5926, + 10419, + 11119, + 1507, + 18125, + 6810, + 14156, + 18939, + 7287, + 20664, + 3106, + 12615, + 9465, + 3835, + 799, + 11810, + 17638, + 27335, + 11798, + 20040, + 7375, + 28834, + 17345, + 14591, + 19444, + 9817, + 764, + 13855, + 24053, + 11980, + 11760, + 16658, + 16700, + 8654, + 26162, + 18720, + 10776, + 10901, + 10695, + 18523, + 16172, + 15335, + 11190, + 504, + 8959, + 18154, + 2635, + 1177, + 1173, + 29481, + 1136, + 4374, + 16315, + 8958, + 8853, + 8884, + 5472, + 11385, + 15095, + 4657, + 10085, + 25184, + 21394, + 11038, + 22657, + 24823, + 7476, + 130, + 4339, + 25694, + 27975, + 18548, + 27268, + 16910, + 3935, + 11707, + 13314, + 4939, + 9384, + 29634, + 19079, + 28392, + 26038, + 4292, + 11605, + 7839, + 6316, + 4818, + 14542, + 14233, + 16163, + 21645, + 7809, + 5900, + 23336, + 14441, + 26893, + 17063, + 25637, + 9586, + 860, + 1460, + 24005, + 18028, + 6429, + 10566, + 26442, + 2170, + 4220, + 3539, + 4934, + 19028, + 28380, + 25884, + 5163, + 28156, + 29996, + 1579, + 19425, + 27926, + 9761, + 27566, + 7449, + 7483, + 8162, + 16596, + 8230, + 22811, + 5982, + 3, + 3910, + 24543, + 25989, + 1722, + 19092, + 24796, + 24138, + 3351, + 7224, + 25101, + 2228, + 18018, + 2986, + 14849, + 12240, + 1715, + 7558, + 19296, + 637, + 21449, + 12483, + 16582, + 24289, + 18062, + 28783, + 18894, + 17676, + 4245, + 28183, + 10707, + 20493, + 17850, + 26365, + 16174, + 17038, + 29587, + 25374, + 29040, + 26280, + 1963, + 10615, + 29186, + 2723, + 10737, + 10620, + 5734, + 15700, + 5442, + 14106, + 15856, + 6886, + 8209, + 5235, + 23827, + 8163, + 4108, + 11714, + 12576, + 4790, + 8523, + 8022, + 8387, + 19896, + 11700, + 9920, + 22382, + 23013, + 5499, + 21633, + 17292, + 27929, + 1759, + 26520, + 29291, + 26983, + 5606, + 20158, + 10396, + 13304, + 4443, + 29164, + 5991, + 6311, + 26505, + 26792, + 12271, + 16708, + 5317, + 29783, + 23229, + 19101, + 27545, + 9996, + 21155, + 25397, + 16845, + 8625, + 2004, + 1197, + 21207, + 20760, + 4887, + 17500, + 5624, + 24579, + 6907, + 23270, + 29638, + 16244, + 25700, + 23757, + 27963, + 15894, + 25065, + 24099, + 676, + 5203, + 4965, + 21839, + 26095, + 9361, + 6413, + 1830, + 7837, + 16523, + 6732, + 17270, + 20967, + 27233, + 17949, + 20690, + 19416, + 12907, + 17953, + 476, + 19489, + 14637, + 12773, + 13984, + 6443, + 11797, + 28153, + 11213, + 5784, + 10094, + 1246, + 1924, + 25429, + 17304, + 19714, + 18069, + 29110, + 14005, + 15374, + 2690, + 2777, + 12928, + 23817, + 24496, + 16495, + 2384, + 2513, + 24042, + 29071, + 21001, + 14988, + 8842, + 20423, + 2468, + 29000, + 21043, + 23585, + 11068, + 1221, + 16689, + 21107, + 24026, + 26395, + 18254, + 5554, + 16034, + 12825, + 16749, + 4557, + 2865, + 13597, + 5408, + 4953, + 29651, + 19618, + 9270, + 1204, + 1531, + 28191, + 16854, + 4438, + 21066, + 9814, + 1356, + 2629, + 6778, + 4360, + 10927, + 11582, + 3845, + 6377, + 24082, + 11194, + 26931, + 24931, + 29340, + 11439, + 3274, + 621, + 8709, + 9622, + 19001, + 17465, + 27267, + 3673, + 608, + 10824, + 26465, + 12396, + 27076, + 13029, + 11357, + 447, + 7758, + 7016, + 15591, + 11317, + 28954, + 19189, + 15767, + 10648, + 16296, + 23422, + 28731, + 19709, + 18423, + 1163, + 7774, + 24373, + 26457, + 6454, + 2664, + 19931, + 28947, + 18793, + 28596, + 7613, + 17813, + 16950, + 7344, + 16467, + 25298, + 23069, + 21378, + 11517, + 23254, + 3382, + 10517, + 25853, + 10088, + 10118, + 7952, + 22604, + 25111, + 17326, + 29904, + 13313, + 3725, + 4383, + 29680, + 3253, + 2918, + 22987, + 24179, + 24419, + 2096, + 17748, + 6125, + 11281, + 1413, + 12547, + 28459, + 3563, + 10523, + 16463, + 26589, + 5732, + 4001, + 7472, + 10474, + 24413, + 4489, + 23528, + 11340, + 10571, + 230, + 20945, + 27631, + 21714, + 25344, + 24420, + 8514, + 18296, + 8905, + 5751, + 8766, + 19721, + 21935, + 29372, + 26964, + 14787, + 11255, + 25978, + 21509, + 8082, + 4274, + 7870, + 4632, + 727, + 29389, + 24917, + 19371, + 7929, + 13917, + 19855, + 10274, + 15500, + 13384, + 17057, + 10002, + 16990, + 24560, + 18918, + 5973, + 12714, + 10546, + 2972, + 16786, + 9792, + 6383, + 12398, + 28313, + 22348, + 16790, + 23920, + 9671, + 4627, + 6274, + 2055, + 9417, + 17337, + 28514, + 18147, + 17688, + 19085, + 23220, + 19764, + 10723, + 12099, + 10729, + 1371, + 12936, + 11885, + 6768, + 12744, + 14023, + 29588, + 4622, + 12833, + 2299, + 17333, + 20367, + 20447, + 9617, + 23668, + 4701, + 9658, + 16200, + 20947, + 25719, + 1560, + 23764, + 27228, + 20374, + 20311, + 13664, + 18644, + 21465, + 22016, + 28850, + 595, + 1737, + 18427, + 27703, + 9329, + 2687, + 8085, + 7756, + 3385, + 15771, + 2616, + 9121, + 9795, + 5805, + 20069, + 28915, + 9127, + 16506, + 5861, + 15927, + 13156, + 16676, + 10512, + 13931, + 28207, + 1218, + 11163, + 13616, + 6186, + 11315, + 4030, + 22942, + 42, + 10302, + 574, + 28326, + 24593, + 801, + 10892, + 5640, + 12605, + 26212, + 26679, + 25093, + 2138, + 8716, + 3048, + 29939, + 6351, + 26942, + 21636, + 21323, + 4914, + 27859, + 26746, + 18515, + 9961, + 28206, + 7912, + 22566, + 395, + 9196, + 29663, + 4647, + 2982, + 27448, + 29408, + 11104, + 24511, + 4463, + 4377, + 18077, + 6999, + 11574, + 10641, + 28509, + 26797, + 11166, + 22746, + 21667, + 8966, + 19204, + 7652, + 11525, + 21037, + 22085, + 11895, + 24616, + 17120, + 18119, + 5475, + 27891, + 7346, + 18259, + 19974, + 25348, + 131, + 17914, + 26949, + 20614, + 10084, + 7871, + 11749, + 8564, + 28642, + 14707, + 8936, + 29453, + 11428, + 7877, + 25272, + 28314, + 29929, + 13065, + 12304, + 817, + 13849, + 19138, + 16176, + 19398, + 3534, + 28737, + 13392, + 27805, + 26770, + 20525, + 24745, + 21637, + 515, + 1890, + 3489, + 1921, + 12266, + 25540, + 29523, + 12000, + 11573, + 27820, + 21696, + 9725, + 20241, + 7192, + 17578, + 12807, + 29282, + 29061, + 24037, + 6642, + 19397, + 27889, + 7600, + 13726, + 11602, + 9939, + 13208, + 19385, + 8026, + 27192, + 15912, + 14087, + 28467, + 6500, + 8154, + 11489, + 22926, + 19730, + 13341, + 15077, + 26426, + 23579, + 17963, + 28278, + 9677, + 20100, + 10100, + 25399, + 16931, + 403, + 27135, + 8978, + 6213, + 28968, + 8530, + 10817, + 28465, + 29549, + 17439, + 28338, + 2460, + 10959, + 20460, + 20720, + 12786, + 18406, + 5622, + 15048, + 10585, + 8528, + 8334, + 26024, + 9649, + 18349, + 8033, + 18518, + 20420, + 9777, + 17444, + 10646, + 27073, + 1910, + 6069, + 17290, + 23800, + 17615, + 29360, + 19383, + 8965, + 22660, + 20133, + 24831, + 19150, + 22002, + 2030, + 2951, + 25172, + 9367, + 25494, + 10510, + 20821, + 9895, + 23150, + 4163, + 19224, + 12301, + 15375, + 9899, + 4256, + 10918, + 9266, + 5211, + 4860, + 20088, + 15976, + 10594, + 10754, + 18530, + 4721, + 4870, + 1568, + 15285, + 10477, + 27355, + 6492, + 25647, + 14248, + 15510, + 7485, + 19660, + 2980, + 19989, + 11868, + 915, + 16293, + 25748, + 15123, + 18460, + 27114, + 7195, + 9349, + 23117, + 8751, + 26137, + 23210, + 27436, + 531, + 12504, + 6147, + 12913, + 13547, + 24423, + 1696, + 29099, + 9784, + 23333, + 18721, + 14943, + 2, + 23885, + 26968, + 2806, + 27068, + 28931, + 20714, + 3990, + 16550, + 27468, + 20518, + 3133, + 17545, + 12335, + 1920, + 9229, + 29653, + 21351, + 8151, + 17027, + 14634, + 10009, + 23300, + 20791, + 1922, + 10076, + 28470, + 25642, + 669, + 20157, + 18235, + 4811, + 15797, + 25254, + 12910, + 2106, + 866, + 21057, + 24206, + 25248, + 22507, + 6630, + 20145, + 6851, + 21255, + 3289, + 8152, + 27024, + 2192, + 23328, + 18231, + 16419, + 15347, + 9696, + 23724, + 431, + 21742, + 21344, + 26451, + 12215, + 11539, + 25453, + 19551, + 4098, + 25823, + 23243, + 2524, + 9674, + 14639, + 26092, + 2079, + 10971, + 17977, + 14955, + 15015, + 22248, + 27469, + 4341, + 8947, + 2619, + 9001, + 23514, + 1437, + 6356, + 21556, + 10954, + 25928, + 13741, + 3920, + 28792, + 22397, + 18612, + 11937, + 12481, + 4570, + 1497, + 8221, + 17538, + 28403, + 9391, + 24659, + 8178, + 22888, + 3928, + 29513, + 20693, + 28917, + 27883, + 24346, + 22381, + 9354, + 16242, + 13642, + 12948, + 10071, + 21751, + 17730, + 24974, + 3187, + 22851, + 23580, + 26177, + 557, + 20141, + 28770, + 303, + 25339, + 29184, + 9288, + 16652, + 29363, + 11473, + 11879, + 17890, + 3282, + 23093, + 27411, + 4571, + 8792, + 1463, + 963, + 23389, + 3303, + 14454, + 21259, + 1739, + 3326, + 3098, + 3114, + 14297, + 24025, + 9193, + 9134, + 7649, + 2961, + 21976, + 1537, + 20715, + 3155, + 14114, + 5846, + 21960, + 10839, + 2375, + 29402, + 1595, + 25923, + 6772, + 8927, + 1849, + 23591, + 29793, + 6888, + 20557, + 10170, + 16832, + 3300, + 3369, + 21012, + 11203, + 20499, + 23730, + 23999, + 26667, + 13944, + 2693, + 16983, + 27146, + 27942, + 15532, + 28773, + 27031, + 8744, + 28910, + 13237, + 8206, + 525, + 28349, + 2332, + 13651, + 8094, + 28357, + 5270, + 27293, + 2278, + 18930, + 755, + 2066, + 15492, + 3273, + 21085, + 22747, + 24136, + 21955, + 2682, + 28998, + 21707, + 29210, + 18824, + 5858, + 20282, + 25388, + 24299, + 482, + 13117, + 6666, + 15266, + 27730, + 976, + 12546, + 23038, + 17306, + 28752, + 29352, + 10534, + 793, + 3117, + 19872, + 16118, + 19396, + 6118, + 6959, + 3005, + 23499, + 8630, + 27408, + 13548, + 25170, + 15001, + 10403, + 22948, + 9596, + 19466, + 10186, + 11537, + 2445, + 5521, + 25830, + 14269, + 2047, + 16761, + 9313, + 15084, + 1791, + 28059, + 19496, + 16015, + 17534, + 22226, + 22068, + 20691, + 4728, + 7705, + 11977, + 21203, + 6395, + 14027, + 1862, + 16044, + 16909, + 6096, + 25243, + 15031, + 28428, + 25338, + 25957, + 13537, + 15890, + 22961, + 11564, + 23816, + 22740, + 13030, + 2191, + 3955, + 15938, + 20899, + 18415, + 17328, + 11934, + 23445, + 28235, + 5464, + 22766, + 15143, + 19295, + 24859, + 11576, + 5910, + 26716, + 6043, + 24612, + 7330, + 17969, + 24764, + 11480, + 29968, + 12037, + 17889, + 24080, + 6489, + 27634, + 5017, + 9376, + 23568, + 14676, + 24125, + 14492, + 17660, + 22622, + 9269, + 10470, + 13996, + 698, + 24634, + 3284, + 22358, + 23966, + 20897, + 20582, + 7184, + 10307, + 22616, + 26781, + 19313, + 7479, + 28807, + 18658, + 27701, + 18476, + 13031, + 1504, + 103, + 23232, + 7559, + 24460, + 12167, + 12452, + 28252, + 8472, + 16722, + 22402, + 8761, + 6473, + 1123, + 9857, + 20478, + 16434, + 4840, + 20122, + 29479, + 8791, + 17485, + 18593, + 12781, + 9476, + 15149, + 3465, + 10449, + 20118, + 20171, + 175, + 22095, + 9872, + 12991, + 25361, + 15081, + 6234, + 26956, + 28695, + 26718, + 29496, + 11102, + 4504, + 15086, + 6653, + 8304, + 3047, + 23693, + 15079, + 22648, + 26886, + 21016, + 9075, + 19337, + 15426, + 16727, + 209, + 26766, + 13696, + 24035, + 1400, + 9768, + 10291, + 18462, + 9511, + 28140, + 3976, + 9494, + 22495, + 29009, + 19307, + 8933, + 5243, + 16404, + 17157, + 730, + 2747, + 26345, + 27166, + 6530, + 2433, + 18012, + 556, + 27069, + 29817, + 19741, + 11406, + 13368, + 1677, + 28244, + 7367, + 7991, + 25142, + 16048, + 8019, + 11481, + 17886, + 18753, + 4544, + 27215, + 22941, + 10530, + 7966, + 14424, + 12867, + 25363, + 3027, + 21456, + 27210, + 9272, + 12640, + 19450, + 22884, + 8824, + 4482, + 20604, + 13460, + 26739, + 19298, + 1571, + 18785, + 28484, + 3601, + 12497, + 26532, + 8591, + 18189, + 6029, + 13299, + 8961, + 7946, + 26049, + 6714, + 19863, + 5459, + 12541, + 6481, + 11998, + 28958, + 26565, + 20280, + 21863, + 7443, + 10591, + 2280, + 14283, + 23089, + 28498, + 21218, + 13784, + 24882, + 5003, + 8460, + 6285, + 11823, + 25639, + 3599, + 11237, + 28519, + 26839, + 441, + 17763, + 7040, + 830, + 27495, + 25815, + 26437, + 2601, + 13649, + 28201, + 2381, + 22778, + 18686, + 10825, + 14704, + 11361, + 17678, + 14041, + 19556, + 14834, + 23828, + 7394, + 12008, + 19986, + 19431, + 6726, + 11159, + 22069, + 2107, + 4054, + 18222, + 17693, + 2764, + 4880, + 16154, + 5389, + 3149, + 24381, + 6496, + 8454, + 27864, + 7735, + 26182, + 5372, + 3888, + 15180, + 6520, + 4492, + 6108, + 471, + 10774, + 847, + 22428, + 19481, + 16338, + 17051, + 16400, + 4455, + 10468, + 10360, + 6664, + 3842, + 10676, + 803, + 23197, + 28933, + 8771, + 25151, + 6345, + 9779, + 2012, + 19502, + 16083, + 29347, + 4585, + 28451, + 25307, + 12176, + 7418, + 6707, + 8194, + 5715, + 21855, + 19987, + 12968, + 3980, + 19095, + 15872, + 17799, + 2572, + 17313, + 19301, + 12952, + 7950, + 7610, + 14428, + 1650, + 15061, + 17133, + 579, + 26920, + 16377, + 23497, + 19821, + 16224, + 11781, + 7995, + 16035, + 7861, + 24186, + 15795, + 4273, + 10205, + 17716, + 20054, + 24788, + 26933, + 28223, + 12957, + 29145, + 16299, + 13850, + 22624, + 18535, + 1811, + 12038, + 9762, + 13248, + 14722, + 21350, + 28646, + 23162, + 14266, + 28296, + 8734, + 22370, + 18700, + 27034, + 11916, + 17201, + 23212, + 4921, + 7901, + 21813, + 27599, + 9451, + 26758, + 16874, + 505, + 9406, + 1913, + 23464, + 12473, + 23341, + 25526, + 27612, + 906, + 29177, + 11646, + 28469, + 6070, + 1291, + 1733, + 2534, + 25055, + 12026, + 23181, + 26101, + 20434, + 7593, + 22487, + 18333, + 16370, + 20596, + 5533, + 1587, + 29469, + 26232, + 29528, + 4388, + 20737, + 6883, + 21887, + 10352, + 10522, + 5525, + 19259, + 9479, + 13550, + 6406, + 12280, + 20191, + 4213, + 12441, + 14374, + 7030, + 28555, + 19464, + 21202, + 29736, + 24587, + 26315, + 14861, + 9937, + 16009, + 3550, + 13374, + 4359, + 26611, + 8678, + 26557, + 18911, + 425, + 22289, + 29520, + 15646, + 3756, + 16547, + 17280, + 29403, + 24147, + 14327, + 5448, + 6130, + 19754, + 26318, + 20869, + 11656, + 2253, + 22804, + 15112, + 10561, + 11389, + 19267, + 5740, + 24779, + 6507, + 25109, + 8404, + 3261, + 18981, + 8117, + 27198, + 10837, + 588, + 16709, + 15091, + 23913, + 21030, + 16739, + 24074, + 29924, + 11905, + 11470, + 22414, + 5280, + 29382, + 28955, + 287, + 6180, + 21126, + 3732, + 16785, + 18185, + 9976, + 21764, + 2669, + 13473, + 27833, + 2236, + 3433, + 6998, + 28412, + 27762, + 5289, + 25995, + 21400, + 2959, + 26409, + 22705, + 13317, + 7711, + 26776, + 21230, + 17342, + 1083, + 6258, + 2597, + 13009, + 1311, + 17525, + 2553, + 40, + 24273, + 11168, + 28663, + 22787, + 28829, + 29357, + 11876, + 26748, + 14222, + 12590, + 18725, + 17267, + 20124, + 27518, + 5919, + 5601, + 21252, + 2130, + 8329, + 25267, + 420, + 4724, + 21393, + 52, + 2813, + 3118, + 28198, + 15454, + 26568, + 22706, + 12956, + 19024, + 18598, + 928, + 29766, + 5979, + 20844, + 18039, + 10875, + 1616, + 24648, + 5753, + 29567, + 9382, + 19924, + 3619, + 19727, + 18864, + 7285, + 21620, + 8130, + 4699, + 8399, + 12383, + 23046, + 2217, + 22015, + 20497, + 1973, + 15371, + 3668, + 16571, + 2411, + 16548, + 7547, + 28021, + 7955, + 11898, + 24306, + 25004, + 17760, + 13765, + 23281, + 8355, + 2264, + 6830, + 26790, + 29698, + 23121, + 19934, + 9774, + 16195, + 18241, + 1190, + 19572, + 13451, + 26574, + 27423, + 5987, + 28939, + 4467, + 26514, + 23381, + 16059, + 1151, + 21578, + 20831, + 4300, + 16631, + 9447, + 16139, + 17207, + 24565, + 18080, + 28133, + 2767, + 26789, + 1183, + 9232, + 28225, + 1092, + 20925, + 9602, + 5655, + 25903, + 25636, + 10955, + 12149, + 4776, + 26657, + 17139, + 29031, + 14043, + 14887, + 7678, + 2949, + 16988, + 615, + 29101, + 22633, + 25288, + 4563, + 6621, + 22832, + 26643, + 21040, + 19943, + 22071, + 20048, + 21798, + 26943, + 23000, + 11141, + 20761, + 29590, + 11541, + 13675, + 3315, + 15185, + 15074, + 18380, + 28864, + 2699, + 29799, + 23276, + 19305, + 1511, + 8812, + 4550, + 23032, + 13224, + 1093, + 11012, + 10931, + 24330, + 27603, + 7718, + 26026, + 27139, + 16695, + 6800, + 22807, + 11458, + 5906, + 26254, + 24411, + 18904, + 21080, + 1626, + 5216, + 14616, + 18800, + 11843, + 22965, + 17664, + 18702, + 13326, + 13786, + 28935, + 4606, + 106, + 4449, + 4222, + 18870, + 27834, + 17077, + 2978, + 16175, + 25769, + 27548, + 21216, + 613, + 4958, + 4181, + 18414, + 24929, + 29173, + 15109, + 22612, + 15814, + 14091, + 15727, + 20627, + 8952, + 10231, + 8418, + 4624, + 21331, + 1423, + 3481, + 17414, + 22696, + 6457, + 19800, + 24242, + 26379, + 27610, + 17145, + 26796, + 13898, + 14047, + 17602, + 2705, + 6524, + 23991, + 2396, + 21612, + 2763, + 6682, + 22477, + 14243, + 7664, + 15776, + 8698, + 8948, + 27017, + 7611, + 16266, + 27945, + 2002, + 14529, + 3288, + 678, + 29046, + 8919, + 4845, + 15749, + 29211, + 22461, + 70, + 13594, + 29780, + 29361, + 11442, + 2291, + 4332, + 4266, + 14373, + 21032, + 18369, + 7306, + 17919, + 8038, + 17634, + 25782, + 11086, + 8016, + 14697, + 297, + 10775, + 18059, + 17012, + 6606, + 9091, + 121, + 23240, + 11631, + 7882, + 11593, + 24890, + 24047, + 17583, + 3102, + 12896, + 7105, + 28008, + 13407, + 12626, + 1234, + 11277, + 15294, + 24002, + 3499, + 4954, + 21884, + 27345, + 15427, + 23587, + 10492, + 17070, + 4169, + 25425, + 3670, + 19359, + 18808, + 4281, + 2123, + 603, + 28786, + 22786, + 20552, + 14214, + 23255, + 8911, + 19349, + 24736, + 19356, + 15586, + 10267, + 18634, + 3175, + 4141, + 24677, + 9449, + 14833, + 28924, + 11201, + 18732, + 17726, + 20958, + 5013, + 29842, + 29774, + 8880, + 20853, + 2267, + 27894, + 23136, + 25522, + 14029, + 2025, + 807, + 5863, + 355, + 17412, + 23049, + 5570, + 5971, + 20067, + 20998, + 1161, + 7860, + 269, + 12177, + 12729, + 25741, + 24701, + 16936, + 26401, + 18405, + 23076, + 13149, + 16779, + 9056, + 8135, + 29759, + 7071, + 10465, + 6297, + 16348, + 12034, + 21874, + 4439, + 23637, + 2488, + 5824, + 21361, + 28231, + 19632, + 10458, + 16263, + 3408, + 14615, + 10565, + 19377, + 22035, + 23062, + 21241, + 25033, + 2387, + 22351, + 15772, + 11598, + 21003, + 18037, + 9517, + 7299, + 12435, + 29045, + 2842, + 6556, + 25383, + 1412, + 10859, + 15960, + 7976, + 8014, + 26743, + 29344, + 26224, + 27650, + 3123, + 22658, + 27711, + 4729, + 17598, + 22876, + 5465, + 29813, + 3617, + 8363, + 23552, + 3158, + 13670, + 6333, + 1250, + 2199, + 16473, + 17295, + 17235, + 1909, + 20862, + 8461, + 16066, + 14299, + 17117, + 16436, + 683, + 1658, + 23781, + 16250, + 15010, + 23362, + 9661, + 10496, + 19340, + 29437, + 15949, + 19592, + 4404, + 24891, + 15343, + 2568, + 28309, + 814, + 20699, + 8673, + 14675, + 11188, + 12140, + 10771, + 24204, + 24101, + 4264, + 7665, + 13847, + 9199, + 13422, + 18356, + 5508, + 3525, + 6051, + 11337, + 3343, + 3229, + 23553, + 29532, + 12157, + 1494, + 25759, + 16446, + 4598, + 20271, + 14185, + 14640, + 16359, + 7465, + 6865, + 20539, + 24615, + 14072, + 10874, + 24873, + 5936, + 13943, + 18221, + 11870, + 10685, + 19316, + 20638, + 679, + 18167, + 9530, + 7454, + 13100, + 10719, + 6294, + 1398, + 23794, + 9719, + 15968, + 27098, + 25465, + 12930, + 25099, + 4581, + 15733, + 3918, + 4938, + 13469, + 11675, + 7294, + 2940, + 7278, + 15965, + 1564, + 16376, + 20087, + 14611, + 17610, + 9102, + 2376, + 25887, + 10351, + 11958, + 24738, + 13979, + 14565, + 9980, + 582, + 15745, + 6837, + 18112, + 15932, + 10497, + 27376, + 8772, + 28106, + 27527, + 17044, + 19168, + 12805, + 8063, + 7421, + 26043, + 19384, + 13441, + 7348, + 7481, + 10650, + 13129, + 5413, + 5609, + 29432, + 1187, + 13393, + 23626, + 19056, + 23584, + 14842, + 15689, + 24012, + 9151, + 24088, + 16723, + 23104, + 9688, + 18942, + 27564, + 20659, + 22, + 28699, + 23105, + 11449, + 10951, + 14241, + 14767, + 8430, + 22253, + 9709, + 23926, + 24093, + 21442, + 10140, + 12822, + 6874, + 16381, + 13870, + 28079, + 8653, + 26763, + 11683, + 21646, + 11301, + 22621, + 9722, + 26086, + 9526, + 9750, + 28000, + 25319, + 11405, + 2530, + 13191, + 4584, + 19991, + 26476, + 13270, + 5034, + 10175, + 11665, + 9419, + 17853, + 20174, + 17396, + 6194, + 29157, + 28677, + 16215, + 26607, + 5974, + 27464, + 2097, + 2859, + 22315, + 22858, + 13330, + 6053, + 24723, + 27176, + 24856, + 25599, + 4910, + 29307, + 7223, + 29476, + 15709, + 29373, + 11782, + 21864, + 29093, + 23610, + 5481, + 17747, + 25848, + 16074, + 20028, + 11465, + 27243, + 905, + 9360, + 12803, + 23921, + 22167, + 16148, + 8270, + 15483, + 13973, + 9385, + 24366, + 5335, + 20686, + 7668, + 4294, + 19963, + 6196, + 8253, + 17156, + 4740, + 585, + 7446, + 1094, + 15698, + 8062, + 4351, + 27400, + 24928, + 29671, + 2222, + 7438, + 24493, + 5692, + 24936, + 19498, + 21577, + 24598, + 20154, + 14963, + 22010, + 25505, + 12152, + 23701, + 19693, + 957, + 16567, + 5553, + 10320, + 23600, + 23981, + 16302, + 777, + 6419, + 26078, + 22573, + 27407, + 27749, + 14357, + 23619, + 12955, + 19856, + 18397, + 22264, + 7429, + 10326, + 22252, + 3038, + 20786, + 21247, + 3817, + 23707, + 29853, + 8996, + 28616, + 27688, + 21488, + 12689, + 232, + 26327, + 13360, + 13905, + 20551, + 22563, + 6157, + 14690, + 28641, + 5872, + 12900, + 12492, + 7527, + 13819, + 5669, + 27236, + 28424, + 24486, + 2214, + 29406, + 24404, + 11694, + 22300, + 25949, + 23930, + 25720, + 25064, + 26628, + 13502, + 3236, + 7847, + 7423, + 6922, + 1840, + 19858, + 22774, + 27641, + 8635, + 25484, + 15043, + 7850, + 14587, + 19075, + 11873, + 18646, + 17870, + 22790, + 6374, + 23489, + 29837, + 8289, + 13331, + 15195, + 18659, + 13645, + 15740, + 1685, + 24150, + 16697, + 29909, + 19376, + 742, + 24385, + 23961, + 3580, + 7961, + 23218, + 26015, + 7765, + 21088, + 18871, + 12934, + 22422, + 22482, + 15582, + 12033, + 17652, + 26996, + 13003, + 22178, + 1471, + 13727, + 2060, + 6171, + 10616, + 4095, + 26369, + 23995, + 7366, + 9383, + 172, + 1513, + 21174, + 28741, + 18762, + 20101, + 28995, + 18784, + 966, + 8322, + 12606, + 24829, + 18603, + 23909, + 15820, + 16595, + 18628, + 7132, + 492, + 5190, + 2660, + 14519, + 6109, + 1452, + 25931, + 19211, + 15274, + 12302, + 19037, + 13780, + 13520, + 27961, + 23748, + 20029, + 6124, + 14113, + 17003, + 28138, + 4490, + 5145, + 2700, + 16866, + 16314, + 9876, + 22773, + 20800, + 21124, + 3462, + 8651, + 4526, + 14400, + 21045, + 13972, + 22767, + 14673, + 21949, + 5874, + 12653, + 9945, + 3053, + 15598, + 14805, + 2884, + 22572, + 15900, + 16471, + 17728, + 28061, + 17225, + 26961, + 12315, + 18300, + 9588, + 10447, + 15838, + 2666, + 23592, + 15565, + 9952, + 3761, + 9423, + 5223, + 24477, + 17033, + 26391, + 11834, + 11515, + 9375, + 135, + 3399, + 9246, + 24287, + 26104, + 2766, + 13364, + 22060, + 14361, + 6623, + 14254, + 13997, + 10385, + 26899, + 18844, + 25803, + 17640, + 14349, + 29299, + 8203, + 19198, + 21450, + 15592, + 16237, + 6514, + 15936, + 10149, + 3487, + 3751, + 3971, + 6938, + 25624, + 27565, + 8384, + 26831, + 15788, + 29541, + 21235, + 13410, + 10746, + 6323, + 27278, + 25357, + 3705, + 11989, + 28844, + 26577, + 16497, + 13220, + 4852, + 12872, + 27416, + 14073, + 10407, + 27511, + 2551, + 11828, + 9851, + 12231, + 16844, + 3448, + 20343, + 5989, + 28841, + 47, + 1812, + 2902, + 812, + 8707, + 5985, + 26599, + 25774, + 17838, + 4635, + 24410, + 23260, + 7763, + 1699, + 12442, + 4630, + 10735, + 191, + 28980, + 27795, + 18274, + 5728, + 2786, + 17812, + 24326, + 15665, + 28005, + 5278, + 1978, + 10790, + 12487, + 20987, + 25736, + 5995, + 11816, + 18334, + 5108, + 20564, + 19438, + 26213, + 20265, + 1135, + 1645, + 29083, + 3061, + 6813, + 22953, + 11545, + 15009, + 1166, + 1795, + 15148, + 28713, + 27149, + 11821, + 19469, + 2590, + 12179, + 3124, + 26733, + 7629, + 26001, + 6309, + 28778, + 14290, + 16284, + 3862, + 21324, + 2309, + 11111, + 16883, + 8381, + 20467, + 7431, + 24818, + 17897, + 14977, + 25332, + 28377, + 9276, + 15863, + 5591, + 10441, + 23946, + 19690, + 14203, + 9943, + 16529, + 1526, + 16104, + 17183, + 22642, + 27288, + 21395, + 24558, + 11803, + 16488, + 9723, + 24073, + 2086, + 28660, + 12540, + 10637, + 1976, + 16177, + 28181, + 17468, + 1027, + 10134, + 9745, + 18355, + 19713, + 21984, + 23714, + 10354, + 25140, + 13369, + 10183, + 4656, + 27793, + 19994, + 2596, + 16643, + 28539, + 13595, + 6689, + 23114, + 21455, + 28368, + 2324, + 7297, + 17099, + 5392, + 28095, + 23886, + 29482, + 24313, + 7632, + 8561, + 3932, + 20749, + 3197, + 3456, + 22601, + 21958, + 11409, + 23573, + 19555, + 25141, + 16196, + 4986, + 29575, + 9009, + 13080, + 21867, + 8540, + 1210, + 29224, + 9678, + 22783, + 18693, + 15054, + 25513, + 19157, + 27221, + 22753, + 25022, + 446, + 7202, + 451, + 7762, + 14033, + 2403, + 16530, + 15008, + 21847, + 7707, + 17703, + 6132, + 19016, + 26633, + 1126, + 12401, + 15657, + 1305, + 6317, + 22853, + 71, + 23211, + 16758, + 20468, + 7384, + 10767, + 11630, + 15456, + 9704, + 21765, + 10416, + 6730, + 7468, + 19640, + 27987, + 646, + 22577, + 8517, + 26438, + 713, + 13140, + 15364, + 16498, + 6360, + 25378, + 22230, + 10798, + 10744, + 19172, + 9059, + 29107, + 5046, + 14586, + 16188, + 4512, + 25562, + 5610, + 24069, + 8198, + 2019, + 8668, + 3473, + 24789, + 20103, + 10820, + 17784, + 3636, + 11117, + 1567, + 22361, + 21795, + 22512, + 14718, + 5100, + 29833, + 6081, + 1040, + 7994, + 22635, + 11436, + 19244, + 18896, + 5424, + 27997, + 2154, + 23487, + 26075, + 6152, + 9640, + 18888, + 19838, + 5495, + 8886, + 5770, + 8003, + 17275, + 10511, + 8485, + 23203, + 3798, + 21533, + 18917, + 25276, + 10876, + 9672, + 2602, + 21959, + 609, + 19785, + 10957, + 9826, + 15619, + 9358, + 19805, + 29778, + 564, + 5140, + 19561, + 19038, + 1723, + 3934, + 20540, + 11125, + 25635, + 18735, + 1775, + 28789, + 17749, + 22554, + 17539, + 3567, + 11600, + 6066, + 22629, + 8272, + 6930, + 24609, + 9593, + 21352, + 1352, + 543, + 1435, + 2053, + 516, + 3744, + 9990, + 20078, + 15462, + 22726, + 19273, + 6148, + 24230, + 19363, + 23850, + 18963, + 29244, + 11622, + 13333, + 24689, + 24949, + 25476, + 23636, + 21831, + 23468, + 14016, + 29185, + 2879, + 10389, + 24992, + 29168, + 13619, + 8567, + 26978, + 11716, + 19550, + 26515, + 13521, + 14741, + 12447, + 10596, + 28440, + 25916, + 3831, + 10452, + 21630, + 6490, + 23369, + 6222, + 4174, + 26866, + 24422, + 14524, + 18988, + 2040, + 25095, + 1020, + 19062, + 23072, + 16960, + 2903, + 2971, + 5055, + 22049, + 20622, + 2529, + 14994, + 23835, + 26166, + 26352, + 17380, + 133, + 24603, + 13933, + 28464, + 21334, + 29051, + 4143, + 21821, + 25128, + 29314, + 16064, + 6354, + 14747, + 12507, + 8541, + 2382, + 16084, + 16542, + 24166, + 23807, + 14601, + 4298, + 26947, + 19394, + 1203, + 19152, + 5030, + 21785, + 18201, + 23349, + 25144, + 21957, + 21006, + 23019, + 20327, + 7309, + 421, + 3555, + 4638, + 10982, + 22854, + 16853, + 23326, + 16917, + 26864, + 91, + 11718, + 18501, + 20705, + 1622, + 11892, + 27250, + 13108, + 9353, + 13099, + 18681, + 8592, + 21560, + 26930, + 6232, + 29679, + 4199, + 17332, + 12848, + 7234, + 13860, + 18618, + 8407, + 27399, + 15437, + 17861, + 27575, + 18837, + 17902, + 29444, + 26578, + 11586, + 5801, + 20035, + 19598, + 3682, + 20769, + 5675, + 435, + 29808, + 25901, + 18064, + 17100, + 12965, + 12565, + 27369, + 17344, + 9845, + 20734, + 22692, + 11435, + 5697, + 6441, + 11226, + 16644, + 1763, + 3701, + 9301, + 12682, + 13358, + 1453, + 1448, + 20251, + 11050, + 14193, + 4180, + 4031, + 8076, + 19181, + 17223, + 28295, + 20647, + 29362, + 3578, + 737, + 5427, + 28526, + 17524, + 7862, + 14341, + 28272, + 16103, + 2909, + 2196, + 28736, + 15882, + 5637, + 25735, + 14558, + 12393, + 2543, + 7197, + 20576, + 21780, + 10651, + 2476, + 15106, + 28722, + 5387, + 2759, + 26330, + 3180, + 3747, + 9900, + 2492, + 14410, + 19103, + 8301, + 9866, + 14666, + 12221, + 29455, + 17170, + 6953, + 17691, + 18936, + 10884, + 27988, + 1948, + 22458, + 22979, + 6822, + 28723, + 20860, + 25035, + 26554, + 9816, + 5608, + 1716, + 18944, + 6927, + 607, + 23139, + 19897, + 3660, + 20256, + 3491, + 13192, + 22328, + 1142, + 28690, + 19328, + 19948, + 4738, + 14479, + 1682, + 23705, + 3899, + 4773, + 25464, + 24713, + 3858, + 22531, + 27177, + 2163, + 728, + 3130, + 25194, + 3923, + 9629, + 6796, + 14560, + 19243, + 22503, + 11729, + 4863, + 8850, + 3676, + 7415, + 9380, + 4087, + 26677, + 383, + 12911, + 28828, + 21752, + 8383, + 18145, + 13955, + 1931, + 12713, + 15540, + 19488, + 20902, + 23942, + 3109, + 13280, + 667, + 22021, + 24369, + 330, + 1549, + 21305, + 7687, + 22781, + 21454, + 11813, + 16364, + 647, + 26944, + 18220, + 24575, + 1954, + 6055, + 16859, + 10942, + 14075, + 28077, + 4327, + 10177, + 10926, + 15597, + 11177, + 16110, + 21698, + 27503, + 18887, + 4230, + 25126, + 23586, + 22285, + 2566, + 3635, + 15315, + 565, + 10454, + 8877, + 11496, + 24225, + 20151, + 11048, + 6973, + 2578, + 17627, + 9759, + 5032, + 18902, + 17311, + 22375, + 17932, + 22879, + 11336, + 24774, + 2827, + 24502, + 16047, + 27629, + 28210, + 2642, + 20613, + 4979, + 13153, + 26473, + 24693, + 13778, + 9026, + 21349, + 4261, + 5226, + 1602, + 9662, + 20147, + 27029, + 29500, + 3069, + 7437, + 28401, + 6188, + 11629, + 10007, + 14512, + 11921, + 6365, + 167, + 7291, + 666, + 28667, + 17591, + 23119, + 15204, + 25501, + 28589, + 27081, + 28460, + 19441, + 24913, + 15524, + 21033, + 23710, + 26404, + 17777, + 23307, + 26794, + 13767, + 17340, + 21379, + 13650, + 13023, + 15599, + 21084, + 23244, + 3745, + 18510, + 10882, + 2586, + 28805, + 28260, + 25459, + 29668, + 10990, + 1414, + 13498, + 1240, + 22868, + 20706, + 13305, + 14175, + 13396, + 7352, + 14655, + 23382, + 4644, + 16754, + 23605, + 21661, + 14825, + 10902, + 14049, + 16155, + 15316, + 13476, + 28608, + 19645, + 2234, + 14274, + 13219, + 4534, + 16792, + 18797, + 27413, + 29302, + 18286, + 8453, + 25927, + 28147, + 18491, + 18579, + 26112, + 22932, + 25044, + 22571, + 25496, + 19925, + 24379, + 10708, + 28492, + 15029, + 27491, + 22336, + 7181, + 4006, + 14345, + 29451, + 14998, + 28053, + 11419, + 10970, + 28367, + 27839, + 16090, + 20735, + 11795, + 23446, + 18200, + 13991, + 3484, + 27167, + 1277, + 23962, + 3663, + 12815, + 19936, + 15526, + 24939, + 7070, + 11948, + 28574, + 13167, + 8870, + 1268, + 19241, + 18858, + 5687, + 20732, + 25473, + 6645, + 16750, + 13546, + 13882, + 7318, + 422, + 9069, + 16728, + 22309, + 21317, + 13856, + 15739, + 5096, + 8806, + 7706, + 12332, + 15897, + 28708, + 13851, + 17174, + 28190, + 21096, + 14883, + 8867, + 15428, + 15768, + 5113, + 6098, + 21044, + 25491, + 29002, + 24277, + 4944, + 6478, + 555, + 25088, + 16295, + 19673, + 22929, + 22126, + 9485, + 18023, + 19528, + 501, + 20906, + 19680, + 28551, + 18869, + 22665, + 12644, + 15549, + 25807, + 18616, + 18513, + 7996, + 27308, + 7815, + 6177, + 7876, + 11896, + 21677, + 15556, + 13046, + 18172, + 12155, + 8067, + 6562, + 4457, + 3278, + 8969, + 8675, + 11486, + 24697, + 28046, + 11061, + 22638, + 29058, + 24557, + 12883, + 2062, + 18257, + 2361, + 9912, + 8070, + 28293, + 21104, + 7826, + 16762, + 16869, + 65, + 21310, + 15284, + 10364, + 25025, + 13626, + 24975, + 2920, + 23842, + 9303, + 5820, + 21873, + 16308, + 20392, + 19700, + 11373, + 5152, + 14593, + 4278, + 5662, + 11238, + 9141, + 28494, + 22835, + 11414, + 12574, + 2157, + 29912, + 7885, + 10108, + 3020, + 12731, + 6093, + 5766, + 13915, + 8615, + 26840, + 18120, + 13892, + 7867, + 18816, + 769, + 29735, + 21357, + 4801, + 28987, + 14944, + 27430, + 28927, + 12277, + 4578, + 27227, + 26399, + 5693, + 25471, + 27714, + 19446, + 12479, + 12378, + 203, + 1797, + 2643, + 9802, + 14209, + 17095, + 8484, + 14412, + 23537, + 24143, + 149, + 26812, + 25590, + 4755, + 12551, + 16788, + 21953, + 27200, + 10152, + 24201, + 29418, + 10142, + 27013, + 9543, + 24712, + 16092, + 4296, + 5897, + 4791, + 10221, + 19534, + 1108, + 20203, + 11450, + 17671, + 23530, + 7785, + 2287, + 18489, + 23070, + 19234, + 4525, + 6106, + 25902, + 21626, + 23177, + 8458, + 23225, + 29294, + 3185, + 16718, + 25210, + 13424, + 8052, + 16246, + 2835, + 4603, + 8057, + 20361, + 27181, + 19965, + 17370, + 14573, + 10782, + 15764, + 26791, + 25391, + 12508, + 6971, + 22639, + 20774, + 3997, + 21261, + 14784, + 5604, + 25843, + 6337, + 15239, + 27415, + 5064, + 12147, + 15793, + 7022, + 3562, + 12535, + 27633, + 4754, + 18571, + 24846, + 9611, + 7014, + 16309, + 465, + 16987, + 2356, + 16085, + 17778, + 6713, + 20606, + 6609, + 6879, + 17104, + 2131, + 11994, + 8590, + 10391, + 12831, + 27097, + 1289, + 9390, + 29498, + 22936, + 13815, + 27219, + 21856, + 6843, + 3717, + 17574, + 17757, + 17149, + 6856, + 17750, + 6264, + 23806, + 10294, + 26259, + 8111, + 1713, + 10764, + 3988, + 3420, + 23096, + 8533, + 22484, + 28009, + 18007, + 27532, + 1294, + 10257, + 18583, + 20095, + 26397, + 16160, + 26143, + 11446, + 25049, + 4758, + 7672, + 22270, + 23669, + 22277, + 10842, + 2558, + 20548, + 8341, + 11138, + 12624, + 24961, + 6629, + 10418, + 10984, + 14012, + 13057, + 3310, + 4048, + 8815, + 18162, + 4968, + 1852, + 466, + 22688, + 23261, + 18562, + 17395, + 15229, + 3692, + 8395, + 24181, + 26405, + 25003, + 12643, + 5912, + 5876, + 2863, + 26148, + 28751, + 9667, + 21249, + 29946, + 7212, + 14536, + 29648, + 11918, + 10797, + 14220, + 15132, + 17447, + 27970, + 14903, + 18909, + 23036, + 21315, + 19738, + 13178, + 14969, + 15379, + 9565, + 1191, + 13866, + 9603, + 10635, + 8566, + 21536, + 26492, + 22565, + 8029, + 9595, + 23782, + 13907, + 14190, + 22050, + 10387, + 29573, + 25708, + 21058, + 5717, + 2121, + 5527, + 16098, + 13825, + 29773, + 29401, + 25976, + 4601, + 28321, + 5899, + 20086, + 23656, + 14051, + 19106, + 20195, + 10276, + 29033, + 1845, + 16011, + 22342, + 14054, + 25777, + 29562, + 28407, + 2171, + 16787, + 6618, + 25667, + 20323, + 17141, + 28936, + 364, + 10727, + 26134, + 4346, + 7578, + 12326, + 2644, + 26625, + 4711, + 24833, + 23082, + 23250, + 14292, + 7544, + 14920, + 2076, + 1793, + 15395, + 13730, + 14936, + 12371, + 8677, + 27787, + 1316, + 747, + 24643, + 24728, + 1070, + 9192, + 8290, + 2137, + 20041, + 16952, + 8739, + 14885, + 17079, + 10107, + 29607, + 1036, + 12580, + 13629, + 28709, + 11082, + 26456, + 3418, + 27466, + 3126, + 3493, + 4781, + 14779, + 29486, + 21, + 29337, + 19289, + 5437, + 1892, + 26905, + 20765, + 11375, + 2200, + 16233, + 8618, + 27333, + 29907, + 25446, + 28497, + 28845, + 16328, + 1509, + 96, + 27738, + 9618, + 2999, + 5620, + 4456, + 28762, + 16885, + 7639, + 6975, + 26731, + 29579, + 25876, + 22802, + 10015, + 26683, + 23874, + 25638, + 21000, + 6013, + 3526, + 6122, + 24127, + 5584, + 14064, + 27476, + 18330, + 25233, + 15530, + 7362, + 6960, + 13239, + 24740, + 23823, + 138, + 17650, + 15892, + 21668, + 2412, + 11848, + 7374, + 5764, + 20729, + 8946, + 989, + 21480, + 2064, + 1886, + 21038, + 13084, + 14302, + 3540, + 2898, + 29047, + 28902, + 7150, + 17200, + 20306, + 27472, + 19457, + 6635, + 14896, + 5641, + 6571, + 7537, + 25430, + 23662, + 17360, + 8754, + 13958, + 26478, + 20563, + 5315, + 22019, + 10939, + 2063, + 10383, + 25009, + 4124, + 11925, + 7155, + 22860, + 12512, + 13523, + 10866, + 25452, + 17466, + 23258, + 15637, + 15296, + 19389, + 1496, + 26550, + 14453, + 28194, + 2820, + 12284, + 759, + 2788, + 28258, + 27320, + 29457, + 9116, + 29161, + 24388, + 13740, + 8248, + 7453, + 26387, + 21627, + 2657, + 3107, + 8606, + 25784, + 6925, + 13503, + 4805, + 261, + 25592, + 21371, + 5048, + 22166, + 24246, + 1643, + 6722, + 5952, + 2916, + 11506, + 18584, + 20112, + 28923, + 28388, + 21784, + 19304, + 10515, + 7622, + 14007, + 2953, + 17943, + 27657, + 27000, + 25350, + 2585, + 17378, + 28837, + 17629, + 23989, + 28758, + 18158, + 17700, + 7905, + 15934, + 9256, + 19252, + 16572, + 14451, + 13373, + 26672, + 23363, + 6941, + 28764, + 19140, + 5277, + 21583, + 26034, + 17115, + 14448, + 9815, + 8555, + 22072, + 4836, + 8436, + 13744, + 29677, + 18901, + 19547, + 23315, + 29092, + 20453, + 19712, + 23494, + 8401, + 11330, + 7856, + 10165, + 9773, + 20924, + 781, + 13813, + 25163, + 18436, + 28914, + 24174, + 5038, + 1844, + 23845, + 21359, + 5596, + 24162, + 23134, + 29891, + 24417, + 13438, + 17925, + 1757, + 22304, + 15571, + 29734, + 8747, + 14295, + 17628, + 23868, + 16484, + 21665, + 11263, + 15673, + 25528, + 9442, + 28118, + 22550, + 11809, + 29214, + 29041, + 6792, + 2378, + 18026, + 3770, + 18792, + 27668, + 19586, + 15065, + 21569, + 26783, + 6388, + 3219, + 20747, + 27918, + 17618, + 16040, + 2147, + 2548, + 2618, + 26726, + 21285, + 29452, + 11531, + 13555, + 27147, + 12522, + 2366, + 16961, + 12678, + 10187, + 19277, + 4566, + 5103, + 8444, + 15448, + 16967, + 5803, + 7372, + 24114, + 17418, + 21518, + 25577, + 9487, + 1754, + 12543, + 28092, + 18655, + 12997, + 26548, + 21281, + 24715, + 15072, + 28500, + 24167, + 11343, + 29440, + 21910, + 3706, + 7450, + 22840, + 19857, + 1664, + 3238, + 17239, + 16230, + 25249, + 23253, + 10224, + 22224, + 9145, + 10286, + 18829, + 24009, + 8509, + 29687, + 24250, + 15681, + 6392, + 2399, + 1708, + 13435, + 17992, + 6455, + 11455, + 13834, + 12748, + 6633, + 18903, + 16702, + 9440, + 12981, + 24658, + 9275, + 2159, + 25302, + 14958, + 22611, + 21557, + 23040, + 13086, + 26, + 5789, + 8312, + 1118, + 1712, + 21177, + 19249, + 12261, + 20485, + 8708, + 22689, + 28890, + 6244, + 59, + 2606, + 18190, + 2725, + 8046, + 12116, + 7641, + 7146, + 509, + 20742, + 6672, + 5357, + 28625, + 29240, + 21423, + 856, + 23758, + 15, + 5164, + 2581, + 20004, + 28614, + 16791, + 14851, + 12897, + 9999, + 4491, + 5612, + 2014, + 8273, + 11015, + 5246, + 24251, + 545, + 5333, + 28266, + 1561, + 9104, + 1841, + 21328, + 26856, + 8468, + 24487, + 20254, + 15207, + 13189, + 25292, + 17614, + 16482, + 1386, + 14105, + 7245, + 10717, + 4231, + 3442, + 4164, + 22165, + 1405, + 15129, + 18441, + 19260, + 21314, + 9493, + 7255, + 25005, + 25107, + 6102, + 29348, + 14537, + 6513, + 26571, + 5524, + 5688, + 7282, + 19119, + 22259, + 25787, + 13275, + 16575, + 21198, + 8637, + 15243, + 23527, + 7977, + 17487, + 26761, + 5158, + 22693, + 8463, + 29819, + 15922, + 5051, + 9707, + 22551, + 23859, + 20668, + 25963, + 4068, + 3296, + 20698, + 18422, + 25693, + 10612, + 21879, + 3764, + 26067, + 5781, + 12370, + 8358, + 6693, + 29419, + 10579, + 23288, + 2639, + 28267, + 27477, + 6280, + 2136, + 12450, + 16065, + 9214, + 24938, + 7924, + 23392, + 18799, + 3217, + 25174, + 3477, + 8619, + 1741, + 18091, + 9523, + 15156, + 20057, + 8161, + 13164, + 299, + 14508, + 2654, + 4641, + 24117, + 10505, + 969, + 20047, + 2031, + 604, + 8412, + 29226, + 10688, + 10540, + 24852, + 12776, + 9174, + 1131, + 24695, + 5369, + 3111, + 16325, + 3416, + 13877, + 10254, + 20712, + 18176, + 8788, + 22398, + 25478, + 9162, + 10610, + 5308, + 17429, + 17582, + 786, + 10821, + 13037, + 16187, + 16349, + 21299, + 5743, + 12078, + 13525, + 14946, + 4369, + 27384, + 4358, + 4044, + 22205, + 12386, + 13544, + 1604, + 10647, + 1390, + 2769, + 12613, + 4461, + 5682, + 21721, + 3818, + 19771, + 8960, + 14778, + 15988, + 7572, + 21893, + 26496, + 11129, + 26116, + 11972, + 18955, + 11775, + 12906, + 13268, + 22921, + 20512, + 11947, + 12387, + 8456, + 16745, + 24533, + 9312, + 9402, + 12036, + 7012, + 23344, + 659, + 21269, + 26522, + 13336, + 1383, + 27300, + 5510, + 26159, + 13583, + 26999, + 22765, + 11627, + 15118, + 663, + 3777, + 12922, + 2430, + 21329, + 1850, + 23670, + 19696, + 14991, + 5410, + 26174, + 26055, + 10093, + 21236, + 1964, + 27800, + 24370, + 29474, + 275, + 154, + 5600, + 24758, + 27791, + 113, + 21914, + 8004, + 25001, + 7911, + 28402, + 3348, + 1945, + 23368, + 21724, + 11854, + 5774, + 19020, + 21075, + 14632, + 18386, + 3068, + 20574, + 28105, + 26247, + 12202, + 19472, + 17704, + 18144, + 13205, + 27974, + 9793, + 21106, + 5276, + 8137, + 16711, + 9805, + 14763, + 13225, + 15588, + 3248, + 16998, + 25160, + 7452, + 13425, + 16673, + 8356, + 7305, + 21498, + 14186, + 1614, + 6399, + 19526, + 20701, + 27050, + 4029, + 20609, + 17050, + 8718, + 19944, + 4946, + 21862, + 9076, + 5523, + 19736, + 12490, + 24584, + 20314, + 21160, + 21900, + 24964, + 5371, + 8044, + 19833, + 5156, + 17625, + 3984, + 11422, + 22881, + 11184, + 3055, + 22123, + 1814, + 25129, + 1848, + 22427, + 19575, + 29917, + 16108, + 20074, + 914, + 21132, + 16243, + 17983, + 14821, + 532, + 23770, + 13957, + 72, + 17814, + 3574, + 10787, + 7152, + 25610, + 19314, + 2074, + 21356, + 18993, + 14135, + 28610, + 14446, + 15716, + 11445, + 1080, + 22036, + 7402, + 4664, + 17026, + 27671, + 24427, + 21482, + 10158, + 10029, + 5303, + 24714, + 20950, + 4909, + 22928, + 18801, + 25845, + 18945, + 25206, + 15813, + 22548, + 829, + 23256, + 8131, + 6663, + 24234, + 27710, + 2462, + 27193, + 8983, + 12938, + 22142, + 29221, + 17015, + 22607, + 6292, + 21141, + 16469, + 8994, + 5567, + 25410, + 3328, + 6950, + 2758, + 11019, + 22424, + 23443, + 1122, + 20995, + 20474, + 10227, + 26954, + 7764, + 4133, + 20129, + 13409, + 19605, + 15719, + 21520, + 5531, + 16319, + 5169, + 21250, + 24578, + 16945, + 15459, + 6744, + 11804, + 29913, + 16125, + 14078, + 28220, + 25831, + 15641, + 25293, + 10706, + 2443, + 6386, + 23583, + 27356, + 3871, + 28996, + 190, + 22408, + 19587, + 7364, + 27904, + 13614, + 12534, + 25825, + 1486, + 22815, + 16135, + 28186, + 5677, + 8801, + 8410, + 4866, + 6006, + 18165, + 21461, + 18859, + 19196, + 12684, + 5193, + 14025, + 12022, + 19772, + 16327, + 21814, + 28934, + 15202, + 11703, + 13042, + 25082, + 17494, + 12577, + 24445, + 16042, + 19766, + 4047, + 14391, + 1119, + 4579, + 11260, + 5171, + 2882, + 573, + 7752, + 28107, + 16741, + 10834, + 6495, + 14725, + 19142, + 17240, + 6117, + 4752, + 23026, + 28370, + 21242, + 16662, + 3023, + 7634, + 2288, + 11621, + 15339, + 15241, + 22208, + 17211, + 29196, + 24194, + 9867, + 8249, + 17632, + 9206, + 11657, + 406, + 18633, + 28570, + 5881, + 28702, + 6136, + 7857, + 12347, + 17255, + 22720, + 22892, + 8124, + 26734, + 2858, + 26219, + 18272, + 11894, + 18474, + 12560, + 25499, + 11339, + 21511, + 26699, + 6282, + 16267, + 27732, + 25309, + 18806, + 14366, + 24645, + 22183, + 10089, + 17770, + 19346, + 25470, + 21154, + 5338, + 4486, + 7003, + 25942, + 21515, + 18429, + 389, + 13079, + 11145, + 19514, + 9159, + 2008, + 22893, + 22005, + 10863, + 28992, + 2850, + 4426, + 4105, + 17612, + 24049, + 3101, + 27025, + 26297, + 27485, + 6873, + 2176, + 23802, + 27804, + 23208, + 2969, + 16851, + 19374, + 26510, + 28977, + 16418, + 27694, + 19622, + 18972, + 14979, + 21841, + 20608, + 19218, + 29324, + 2090, + 15422, + 17559, + 23015, + 23471, + 27170, + 23880, + 10172, + 1243, + 15507, + 11890, + 22492, + 10822, + 20257, + 25822, + 12662, + 23222, + 12300, + 105, + 13927, + 24541, + 21497, + 29022, + 26237, + 16388, + 21628, + 23030, + 29682, + 13893, + 1026, + 16995, + 16133, + 24786, + 4117, + 27199, + 14866, + 25351, + 6861, + 29411, + 12561, + 18050, + 28649, + 2023, + 22702, + 29641, + 5267, + 2177, + 2015, + 14230, + 20063, + 18614, + 1464, + 8793, + 26023, + 26835, + 14319, + 8223, + 18166, + 3551, + 9975, + 17019, + 1069, + 5725, + 15915, + 24617, + 12480, + 6787, + 16378, + 18838, + 1248, + 3002, + 26936, + 1706, + 2830, + 12459, + 18749, + 11232, + 15194, + 25808, + 3271, + 20923, + 27871, + 8944, + 12515, + 15250, + 9398, + 13732, + 18569, + 23275, + 27103, + 28557, + 5328, + 20033, + 16566, + 26642, + 8078, + 6129, + 13132, + 935, + 15576, + 14480, + 24546, + 11247, + 19104, + 19455, + 19962, + 21237, + 25458, + 10246, + 745, + 15066, + 10129, + 29270, + 837, + 18821, + 23338, + 26257, + 9572, + 9703, + 17282, + 10220, + 18563, + 29144, + 29231, + 2457, + 11679, + 7216, + 5058, + 12311, + 19796, + 26032, + 17967, + 10178, + 12645, + 12503, + 19930, + 27401, + 5630, + 28681, + 7732, + 20679, + 17118, + 2595, + 18196, + 18226, + 21537, + 12164, + 8702, + 4473, + 8967, + 16737, + 19223, + 9030, + 5381, + 15899, + 1673, + 4244, + 10607, + 4694, + 23291, + 8061, + 1761, + 5486, + 16511, + 21708, + 29745, + 22033, + 6688, + 4782, + 22272, + 26193, + 18678, + 26093, + 19311, + 17645, + 3231, + 12419, + 17224, + 24650, + 22280, + 2039, + 3927, + 21288, + 5765, + 6515, + 23830, + 44, + 11319, + 28921, + 1224, + 21101, + 13020, + 21519, + 3712, + 26059, + 14623, + 27605, + 20267, + 28761, + 1238, + 6411, + 13434, + 2494, + 11022, + 22796, + 25723, + 25552, + 28104, + 21302, + 25173, + 29762, + 17088, + 12892, + 21980, + 13338, + 5849, + 9049, + 16826, + 725, + 21024, + 10102, + 18209, + 23064, + 7403, + 7173, + 29592, + 2589, + 16351, + 11721, + 29005, + 27637, + 18484, + 29462, + 27107, + 4589, + 22990, + 4367, + 11841, + 14353, + 6331, + 22012, + 14957, + 25252, + 12352, + 19787, + 15555, + 1326, + 14083, + 28058, + 28763, + 17617, + 7738, + 21486, + 25145, + 12604, + 25341, + 13557, + 8398, + 5298, + 17939, + 8891, + 5599, + 19180, + 1718, + 1514, + 13008, + 5292, + 19268, + 28439, + 25685, + 25154, + 27440, + 14198, + 23198, + 1642, + 26570, + 18083, + 15351, + 26951, + 4539, + 20772, + 1823, + 13647, + 26046, + 14475, + 80, + 6049, + 18041, + 22218, + 3749, + 29487, + 27672, + 24611, + 15593, + 24824, + 4604, + 15080, + 11858, + 16480, + 4942, + 27244, + 11635, + 22731, + 1184, + 6519, + 25120, + 14352, + 5428, + 20301, + 14246, + 11164, + 17022, + 29121, + 23473, + 22984, + 3367, + 5135, + 16340, + 11042, + 22357, + 21809, + 18780, + 10338, + 9907, + 4150, + 9811, + 9871, + 385, + 24466, + 28535, + 19184, + 3384, + 28686, + 19262, + 4064, + 15653, + 20244, + 2275, + 20620, + 29483, + 11559, + 28533, + 23821, + 26390, + 29335, + 15334, + 19232, + 2343, + 3419, + 7355, + 9998, + 12596, + 4778, + 848, + 23624, + 11583, + 26366, + 3825, + 10846, + 388, + 921, + 7424, + 10346, + 27927, + 14160, + 24129, + 11124, + 2750, + 548, + 24550, + 29712, + 12310, + 13579, + 19816, + 9756, + 28811, + 18649, + 15430, + 13058, + 12725, + 28243, + 23152, + 6991, + 26205, + 26747, + 17006, + 12802, + 10230, + 8112, + 10001, + 6917, + 9323, + 28419, + 28022, + 18750, + 16574, + 6935, + 5105, + 12063, + 9154, + 11037, + 13918, + 23391, + 21479, + 11615, + 21347, + 19659, + 25813, + 10190, + 16030, + 15876, + 660, + 24007, + 5212, + 29731, + 15880, + 29888, + 20870, + 1593, + 28858, + 11477, + 24134, + 6348, + 10072, + 9686, + 19972, + 10535, + 8519, + 12224, + 16806, + 24347, + 3400, + 20360, + 8582, + 21529, + 18129, + 19704, + 26890, + 29349, + 1625, + 7033, + 22291, + 6970, + 10753, + 26281, + 29831, + 12031, + 3938, + 8768, + 12746, + 17621, + 10537, + 19560, + 16252, + 3648, + 10852, + 28591, + 9071, + 19076, + 13276, + 29147, + 20276, + 9428, + 12245, + 13707, + 2340, + 24518, + 15171, + 24325, + 9967, + 21932, + 23751, + 14107, + 28032, + 16609, + 16659, + 8639, + 2003, + 7072, + 3398, + 14342, + 7576, + 24154, + 21595, + 23517, + 19753, + 21397, + 20900, + 20218, + 13857, + 6964, + 21964, + 28086, + 12321, + 2742, + 15710, + 378, + 2216, + 24855, + 9655, + 18086, + 21015, + 4692, + 5295, + 8602, + 2796, + 13088, + 10894, + 22281, + 27082, + 23571, + 27784, + 21561, + 21715, + 14912, + 29232, + 13570, + 5808, + 12222, + 8405, + 1342, + 18323, + 23570, + 20152, + 18332, + 25122, + 334, + 27659, + 5588, + 13442, + 15956, + 5695, + 13755, + 27180, + 15179, + 22631, + 29849, + 12102, + 20775, + 7881, + 14893, + 26293, + 26014, + 28530, + 3740, + 1, + 9537, + 25477, + 4378, + 3304, + 17401, + 12195, + 22736, + 28634, + 1781, + 6564, + 972, + 17569, + 23540, + 26527, + 12680, + 5981, + 1732, + 8160, + 18654, + 2751, + 6943, + 23870, + 24624, + 13948, + 28044, + 9130, + 5965, + 6218, + 15455, + 28014, + 10037, + 2108, + 2968, + 21971, + 4926, + 25533, + 12260, + 19853, + 24841, + 10749, + 4416, + 844, + 20948, + 457, + 17572, + 8481, + 12720, + 9796, + 27006, + 3119, + 29205, + 28365, + 1429, + 12062, + 2575, + 8892, + 6567, + 18730, + 11376, + 9058, + 29428, + 2011, + 28141, + 11093, + 11345, + 19365, + 22212, + 3730, + 26100, + 5913, + 1876, + 240, + 27841, + 22518, + 15164, + 7332, + 23297, + 6624, + 7293, + 8093, + 86, + 9841, + 22780, + 10809, + 11933, + 23879, + 25197, + 16954, + 21092, + 15460, + 18597, + 2169, + 14757, + 11999, + 29182, + 4086, + 18818, + 16744, + 11016, + 19495, + 6409, + 6087, + 2413, + 20711, + 13227, + 28189, + 2995, + 25454, + 1103, + 22056, + 21849, + 18482, + 5722, + 23612, + 14279, + 15228, + 28466, + 28689, + 6878, + 617, + 19, + 29885, + 26064, + 6885, + 23604, + 18493, + 11825, + 5932, + 9144, + 10210, + 28333, + 13408, + 16387, + 4328, + 2712, + 14758, + 6384, + 2414, + 2352, + 13703, + 18890, + 16804, + 20432, + 1882, + 15220, + 7125, + 17920, + 14614, + 29787, + 3455, + 1819, + 26562, + 6534, + 12762, + 18665, + 20847, + 29319, + 9472, + 7708, + 18541, + 567, + 24359, + 2540, + 24657, + 10857, + 9142, + 17335, + 23582, + 12488, + 9927, + 12659, + 21468, + 14273, + 874, + 7320, + 6368, + 19956, + 8050, + 4055, + 9800, + 26815, + 28405, + 11711, + 22772, + 9044, + 12550, + 22738, + 25059, + 3609, + 28205, + 10564, + 20365, + 26494, + 3665, + 29966, + 3032, + 6914, + 23180, + 16361, + 17498, + 18146, + 12780, + 28151, + 11482, + 7396, + 17860, + 18313, + 25127, + 23955, + 21405, + 28429, + 21051, + 5418, + 18711, + 13366, + 17944, + 22963, + 27019, + 14645, + 28553, + 10045, + 6319, + 10725, + 16611, + 28438, + 9339, + 16915, + 4788, + 18249, + 14559, + 13756, + 19276, + 27447, + 29261, + 174, + 29052, + 9499, + 29700, + 12359, + 3388, + 17774, + 13053, + 3087, + 14383, + 9848, + 26849, + 6290, + 27870, + 22529, + 3537, + 21119, + 15059, + 10363, + 8064, + 27794, + 16491, + 21368, + 11792, + 28854, + 3410, + 27729, + 19409, + 18141, + 9681, + 29580, + 9948, + 3330, + 8414, + 10046, + 5406, + 5288, + 25826, + 10878, + 10674, + 26688, + 19533, + 4618, + 13516, + 1687, + 8069, + 6012, + 19718, + 25871, + 15414, + 20631, + 21212, + 16935, + 29914, + 23228, + 17782, + 21382, + 25500, + 13170, + 8240, + 26676, + 26651, + 11362, + 1153, + 11069, + 17405, + 17056, + 19161, + 13947, + 17807, + 5643, + 25757, + 6350, + 20716, + 23863, + 17407, + 4401, + 21928, + 7914, + 12611, + 11217, + 11551, + 28417, + 4720, + 21056, + 11690, + 8999, + 28493, + 1233, + 14530, + 18761, + 9294, + 1018, + 28274, + 26876, + 16802, + 23418, + 10570, + 29470, + 7000, + 5284, + 7087, + 22080, + 2526, + 5507, + 2711, + 2815, + 20058, + 15317, + 8844, + 17727, + 5366, + 2579, + 13206, + 19164, + 22812, + 15213, + 8816, + 24542, + 7226, + 6604, + 14846, + 23516, + 3604, + 19199, + 3170, + 27720, + 22192, + 18996, + 3389, + 4032, + 24340, + 10128, + 8784, + 24597, + 17297, + 19692, + 10062, + 17825, + 5878, + 4137, + 18759, + 18973, + 20380, + 10132, + 26201, + 11637, + 14703, + 3553, + 2321, + 17111, + 17082, + 29546, + 14775, + 15750, + 3054, + 19421, + 2092, + 14375, + 22006, + 18926, + 19995, + 8972, + 26896, + 13698, + 7591, + 20916, + 2305, + 20885, + 110, + 4335, + 7219, + 9863, + 18208, + 17771, + 7742, + 17699, + 3173, + 1015, + 25211, + 27240, + 2615, + 11154, + 12375, + 26341, + 26704, + 20461, + 25987, + 4099, + 937, + 9962, + 23088, + 24753, + 7478, + 3431, + 17260, + 2402, + 26081, + 20515, + 14827, + 2392, + 6176, + 4309, + 10965, + 22360, + 29062, + 25521, + 8500, + 20302, + 24444, + 24718, + 24987, + 18656, + 26444, + 27542, + 1858, + 29747, + 10514, + 21301, + 29645, + 9012, + 26229, + 28846, + 5364, + 8403, + 17927, + 2335, + 34, + 5091, + 6550, + 17355, + 15121, + 3987, + 19430, + 11715, + 2212, + 1086, + 24952, + 2281, + 10542, + 12701, + 7428, + 20206, + 62, + 8656, + 23858, + 19118, + 4837, + 977, + 15868, + 24350, + 10627, + 11535, + 18719, + 6584, + 8565, + 12799, + 23413, + 15153, + 26489, + 17472, + 17908, + 9282, + 19484, + 23020, + 22580, + 10258, + 25908, + 16053, + 28114, + 23796, + 25201, + 652, + 26778, + 760, + 15550, + 28356, + 6371, + 14672, + 19691, + 19338, + 20625, + 2248, + 10031, + 24195, + 27632, + 1817, + 13526, + 2870, + 7744, + 16948, + 10555, + 268, + 27627, + 184, + 22534, + 22074, + 18302, + 26689, + 14571, + 20837, + 29434, + 28335, + 6804, + 9234, + 16326, + 12029, + 28779, + 25839, + 23195, + 22510, + 24109, + 15461, + 22640, + 4982, + 17136, + 25688, + 13930, + 17348, + 26458, + 2950, + 4063, + 28259, + 2771, + 7655, + 26096, + 22388, + 12173, + 6373, + 8331, + 8810, + 21925, + 22995, + 3903, + 20091, + 24367, + 99, + 3947, + 11745, + 3689, + 1465, + 6091, + 18506, + 84, + 17448, + 25772, + 15469, + 18983, + 4193, + 3647, + 25030, + 13453, + 10078, + 24253, + 18291, + 27899, + 15236, + 20477, + 3978, + 5707, + 28820, + 7745, + 12941, + 18040, + 13075, + 19902, + 16331, + 15533, + 10928, + 14362, + 1866, + 15849, + 13204, + 13617, + 10379, + 21082, + 17227, + 24386, + 28444, + 1541, + 13988, + 24794, + 26960, + 4396, + 7128, + 11872, + 1391, + 227, + 6670, + 9492, + 14566, + 25947, + 3402, + 6149, + 8552, + 1060, + 16937, + 24515, + 29729, + 4119, + 5312, + 21598, + 29795, + 15580, + 20200, + 19955, + 656, + 2527, + 7852, + 26544, + 12172, + 9644, + 12500, + 29931, + 24433, + 9718, + 25816, + 1164, + 27836, + 5257, + 26384, + 9326, + 1115, + 9964, + 997, + 28978, + 23907, + 18464, + 400, + 21440, + 21977, + 9297, + 17872, + 17999, + 4760, + 6126, + 24016, + 6170, + 1282, + 25208, + 2765, + 24636, + 28496, + 14790, + 27775, + 26231, + 29733, + 26133, + 17697, + 20935, + 1439, + 11618, + 1597, + 6581, + 15033, + 19445, + 23665, + 28683, + 1836, + 20532, + 28376, + 3803, + 23904, + 8302, + 18714, + 21282, + 25273, + 37, + 20366, + 29096, + 2822, + 23695, + 23933, + 7308, + 14339, + 17962, + 19121, + 3916, + 29068, + 5653, + 882, + 9251, + 24529, + 20414, + 5449, + 2444, + 27111, + 2984, + 6565, + 429, + 2797, + 3182, + 2631, + 10225, + 20386, + 23157, + 23179, + 20733, + 6646, + 28733, + 24805, + 10080, + 15873, + 22413, + 23975, + 15508, + 10206, + 6405, + 24431, + 17075, + 12348, + 10356, + 22155, + 28840, + 27473, + 29075, + 17901, + 14517, + 27368, + 23018, + 17030, + 25628, + 26057, + 10000, + 14686, + 23745, + 21575, + 15801, + 6703, + 641, + 11029, + 21692, + 17013, + 7009, + 18694, + 26487, + 27086, + 22403, + 18590, + 1029, + 4802, + 16665, + 4017, + 21390, + 14556, + 26624, + 17043, + 538, + 21632, + 7111, + 18409, + 14804, + 5970, + 15662, + 29388, + 7046, + 19308, + 7864, + 28369, + 6903, + 27907, + 15265, + 5297, + 13139, + 23606, + 21434, + 26966, + 20696, + 11227, + 29441, + 25026, + 15815, + 15002, + 23632, + 9420, + 26357, + 10521, + 12139, + 3898, + 14399, + 5168, + 14844, + 12291, + 5839, + 1370, + 29601, + 6965, + 27676, + 13050, + 24464, + 14123, + 23138, + 22691, + 11137, + 25461, + 9854, + 20167, + 25226, + 12749, + 714, + 14001, + 25984, + 23007, + 3931, + 3779, + 25212, + 15211, + 9468, + 26590, + 5512, + 16589, + 15384, + 1337, + 1033, + 3734, + 3371, + 29927, + 15911, + 20077, + 277, + 29266, + 21691, + 12247, + 14052, + 12579, + 22432, + 26639, + 22905, + 11853, + 13945, + 7866, + 4194, + 4763, + 10911, + 6238, + 19011, + 12628, + 11416, + 2878, + 2782, + 15627, + 17353, + 27596, + 11073, + 23188, + 6910, + 23545, + 8469, + 24083, + 3893, + 13195, + 11066, + 26541, + 7057, + 8694, + 14245, + 28925, + 8774, + 26436, + 6528, + 17565, + 9743, + 16649, + 29803, + 913, + 25108, + 3414, + 17725, + 18329, + 16021, + 24596, + 4477, + 23296, + 20502, + 29351, + 1484, + 15036, + 17973, + 4303, + 7435, + 25692, + 17877, + 27770, + 7636, + 24667, + 25649, + 3536, + 3052, + 24046, + 13757, + 26234, + 23679, + 1206, + 24911, + 27513, + 2346, + 15981, + 276, + 29571, + 19506, + 11731, + 22821, + 23831, + 20372, + 16407, + 4913, + 16823, + 9557, + 718, + 5847, + 5736, + 10987, + 7813, + 462, + 23928, + 9053, + 18467, + 9765, + 20956, + 85, + 13243, + 1323, + 7918, + 19523, + 13233, + 17035, + 5733, + 12278, + 6141, + 12734, + 9680, + 25895, + 1165, + 16896, + 9370, + 3598, + 9587, + 8310, + 21087, + 2408, + 21970, + 10841, + 10623, + 24489, + 10840, + 19159, + 28145, + 21948, + 27604, + 4052, + 2442, + 13826, + 2740, + 5213, + 28319, + 22946, + 29586, + 1171, + 10047, + 15248, + 27879, + 24076, + 6543, + 28678, + 17651, + 10469, + 8086, + 5651, + 2674, + 14978, + 18960, + 23513, + 25036, + 1745, + 13464, + 20213, + 6378, + 580, + 9467, + 10247, + 22568, + 752, + 1641, + 9291, + 15298, + 2523, + 18354, + 13837, + 29832, + 8832, + 25557, + 25793, + 22279, + 6807, + 24639, + 14079, + 4697, + 11276, + 29537, + 28962, + 29417, + 11607, + 13339, + 17520, + 27516, + 6554, + 16651, + 27038, + 4772, + 16141, + 2269, + 24030, + 17517, + 25207, + 6749, + 7011, + 7039, + 8365, + 12859, + 18748, + 14228, + 10660, + 23206, + 27023, + 13501, + 4660, + 26244, + 11772, + 27429, + 23572, + 22610, + 22763, + 14127, + 1175, + 24524, + 270, + 2962, + 7037, + 2089, + 6042, + 26836, + 10684, + 12774, + 27489, + 24106, + 25271, + 3479, + 14380, + 19490, + 19471, + 29739, + 10743, + 2116, + 13552, + 13487, + 9103, + 16522, + 18311, + 3216, + 907, + 14941, + 17795, + 1003, + 13306, + 7927, + 1213, + 19768, + 8013, + 28270, + 23367, + 21148, + 27248, + 28711, + 29792, + 5522, + 14759, + 22722, + 21290, + 1998, + 28822, + 20588, + 17068, + 17389, + 14886, + 20770, + 3427, + 25900, + 12778, + 22650, + 16437, + 3733, + 28966, + 9918, + 5310, + 17787, + 12407, + 8187, + 20180, + 25600, + 26874, + 8245, + 9770, + 12160, + 8421, + 24706, + 24456, + 23067, + 3582, + 8714, + 10150, + 4277, + 23733, + 17639, + 15984, + 1500, + 12865, + 2033, + 2438, + 7032, + 14432, + 9357, + 3613, + 5544, + 17888, + 14862, + 27071, + 11842, + 16996, + 7235, + 13234, + 25418, + 8626, + 25027, + 14794, + 28726, + 26044, + 20952, + 8370, + 14567, + 25444, + 18642, + 15802, + 17898, + 24192, + 9039, + 24853, + 13218, + 15107, + 2854, + 19922, + 10720, + 7917, + 18343, + 25360, + 12091, + 791, + 17575, + 27769, + 5960, + 29133, + 11927, + 6028, + 6864, + 19957, + 29400, + 142, + 22243, + 8856, + 2869, + 7026, + 7810, + 15996, + 29715, + 21717, + 1822, + 7345, + 18746, + 1059, + 19183, + 672, + 9309, + 22048, + 25761, + 21954, + 3224, + 22378, + 23491, + 16144, + 18459, + 25670, + 7459, + 6622, + 5144, + 26580, + 17608, + 18695, + 160, + 29974, + 5477, + 163, + 11378, + 20136, + 5749, + 23246, + 27737, + 17440, + 5775, + 24447, + 5716, + 16819, + 19191, + 9280, + 9365, + 26339, + 10327, + 12, + 9807, + 7627, + 15353, + 9818, + 5383, + 22345, + 10966, + 26030, + 20641, + 8583, + 11055, + 28167, + 9926, + 15879, + 940, + 12113, + 24683, + 25753, + 11284, + 10551, + 6030, + 4974, + 23279, + 6226, + 23148, + 10804, + 1047, + 20383, + 7888, + 28099, + 18922, + 6191, + 6847, + 10361, + 26236, + 29315, + 27274, + 18404, + 25080, + 8264, + 29132, + 17711, + 6322, + 1535, + 15881, + 16938, + 27327, + 11182, + 21197, + 7103, + 2183, + 27457, + 6763, + 27279, + 6882, + 27825, + 9031, + 3954, + 6824, + 16179, + 24155, + 15096, + 24327, + 373, + 12890, + 12572, + 6842, + 24467, + 20224, + 19366, + 18056, + 11632, + 413, + 12788, + 26094, + 984, + 20465, + 97, + 20651, + 24998, + 29548, + 20910, + 13085, + 3337, + 14754, + 27275, + 24474, + 1477, + 2945, + 19868, + 28097, + 5972, + 16448, + 8908, + 29960, + 12829, + 27431, + 2251, + 20344, + 14271, + 9474, + 5546, + 14635, + 5285, + 20868, + 12661, + 22927, + 16006, + 14814, + 16483, + 11095, + 982, + 13329, + 28975, + 16204, + 26774, + 15834, + 10547, + 11779, + 27212, + 27125, + 8527, + 21436, + 26275, + 8126, + 5363, + 19668, + 14572, + 20824, + 15898, + 6626, + 22719, + 21908, + 4634, + 23169, + 24886, + 220, + 9957, + 26452, + 7529, + 2739, + 29852, + 8200, + 20336, + 12446, + 9436, + 14992, + 289, + 15833, + 11587, + 28241, + 12408, + 12281, + 3956, + 6408, + 25152, + 4349, + 18843, + 29701, + 19847, + 20329, + 29237, + 4073, + 547, + 4227, + 6150, + 25579, + 29368, + 18528, + 13820, + 4082, + 316, + 18670, + 24333, + 8188, + 14879, + 29227, + 9914, + 4649, + 4448, + 26483, + 20521, + 16358, + 22810, + 3084, + 7382, + 15616, + 29617, + 8745, + 3867, + 15785, + 29230, + 14550, + 18401, + 25250, + 8232, + 2873, + 26413, + 24068, + 26301, + 12608, + 13772, + 1598, + 13582, + 6228, + 13274, + 26154, + 25124, + 16456, + 11783, + 17349, + 15828, + 7971, + 3436, + 3900, + 9831, + 3267, + 11943, + 11855, + 23484, + 10169, + 18115, + 9257, + 20400, + 8083, + 12836, + 26228, + 22308, + 22311, + 27740, + 24353, + 15226, + 13257, + 25567, + 3638, + 6868, + 3060, + 29268, + 10285, + 6236, + 14553, + 14438, + 7759, + 1052, + 6902, + 10545, + 16980, + 18782, + 16033, + 20809, + 1005, + 10967, + 18788, + 2819, + 11897, + 19604, + 21891, + 6121, + 8746, + 21607, + 7347, + 11640, + 7986, + 15671, + 13017, + 285, + 11103, + 2470, + 4373, + 13340, + 24641, + 13542, + 21375, + 25322, + 16161, + 26652, + 7807, + 3666, + 3360, + 8857, + 4176, + 3141, + 3299, + 28149, + 4384, + 15738, + 9007, + 24415, + 24635, + 22972, + 10011, + 29395, + 7579, + 2206, + 18314, + 12806, + 16619, + 8265, + 19722, + 4454, + 18640, + 3429, + 1207, + 7322, + 2219, + 23625, + 17034, + 16380, + 12097, + 17182, + 28350, + 25251, + 10683, + 13689, + 26079, + 14152, + 21457, + 5613, + 436, + 25614, + 13320, + 29245, + 15704, + 9057, + 18352, + 7108, + 3906, + 24830, + 17796, + 20111, + 6352, + 16947, + 12975, + 22654, + 27638, + 24320, + 10649, + 12656, + 17960, + 3146, + 14376, + 7786, + 8294, + 6145, + 6638, + 955, + 540, + 19109, + 27746, + 22197, + 14577, + 18073, + 21122, + 11001, + 17937, + 22404, + 26710, + 3695, + 13351, + 27229, + 27826, + 3228, + 10491, + 18564, + 8915, + 5957, + 14437, + 28423, + 10155, + 17039, + 12464, + 605, + 10920, + 9972, + 18256, + 6281, + 27697, + 17158, + 23380, + 27649, + 14599, + 3262, + 5903, + 10557, + 7393, + 18057, + 12067, + 22447, + 5680, + 5724, + 13673, + 5699, + 1911, + 22444, + 578, + 6852, + 20396, + 1454, + 3076, + 22065, + 3277, + 25535, + 25940, + 13852, + 13738, + 14384, + 566, + 19386, + 28066, + 10154, + 22750, + 26592, + 29304, + 9457, + 14182, + 1332, + 17681, + 19512, + 19434, + 21666, + 3105, + 19548, + 6532, + 7356, + 14504, + 7628, + 23233, + 15850, + 4895, + 23993, + 21656, + 16903, + 22596, + 11935, + 263, + 6462, + 27517, + 5806, + 18722, + 12505, + 13480, + 4607, + 9352, + 21767, + 8563, + 18421, + 16274, + 14163, + 4966, + 5283, + 28802, + 14752, + 11499, + 29067, + 16451, + 14236, + 217, + 22869, + 21167, + 28062, + 26041, + 1832, + 24283, + 808, + 1766, + 17663, + 14535, + 11147, + 12485, + 22989, + 18379, + 13829, + 16317, + 25437, + 3951, + 16152, + 24838, + 5818, + 9751, + 21151, + 29930, + 13054, + 3569, + 18214, + 6793, + 14104, + 21109, + 17511, + 22318, + 15855, + 25791, + 16918, + 17997, + 23023, + 25070, + 25067, + 5417, + 19086, + 15560, + 29343, + 5975, + 15287, + 8897, + 19480, + 19621, + 29236, + 6341, + 21735, + 24525, + 8799, + 22448, + 2528, + 4582, + 11814, + 13509, + 15668, + 13845, + 12056, + 13073, + 14420, + 14641, + 2762, + 10642, + 14711, + 17775, + 16949, + 26322, + 1178, + 15277, + 26189, + 13413, + 2223, + 6107, + 18325, + 24602, + 20175, + 24158, + 29015, + 3279, + 11913, + 13285, + 14278, + 12793, + 27, + 5414, + 28477, + 3588, + 15860, + 9879, + 4561, + 3492, + 28901, + 27663, + 3313, + 26126, + 6620, + 29743, + 784, + 7669, + 15098, + 19861, + 23337, + 7410, + 24699, + 29754, + 12337, + 27295, + 12794, + 12716, + 6225, + 19460, + 12466, + 24937, + 28184, + 17892, + 9902, + 25256, + 21425, + 19215, + 25766, + 6047, + 25662, + 12619, + 19251, + 25346, + 13297, + 27205, + 29153, + 25668, + 13228, + 4650, + 26650, + 26035, + 9238, + 22164, + 26847, + 975, + 6908, + 1073, + 4173, + 27955, + 2087, + 21284, + 13920, + 1226, + 29200, + 19186, + 10644, + 6607, + 28387, + 1185, + 12234, + 21889, + 24091, + 11408, + 21833, + 19261, + 10039, + 23323, + 279, + 3944, + 20489, + 1540, + 8538, + 27908, + 18500, + 5794, + 13764, + 19888, + 16515, + 5694, + 5319, + 18773, + 9819, + 13235, + 6155, + 554, + 19353, + 4088, + 29413, + 10781, + 28880, + 10054, + 5136, + 12360, + 13680, + 22828, + 10453, + 18124, + 21103, + 12351, + 28561, + 16213, + 4675, + 28442, + 10705, + 20881, + 21431, + 8888, + 18723, + 15575, + 17264, + 25463, + 25050, + 23680, + 9670, + 13869, + 1665, + 17955, + 18591, + 8939, + 26439, + 22198, + 22864, + 11733, + 8632, + 19133, + 12236, + 20928, + 26167, + 8851, + 26889, + 11358, + 1950, + 27757, + 29674, + 2535, + 12593, + 24854, + 21817, + 506, + 12086, + 19749, + 21254, + 17037, + 7058, + 12292, + 6279, + 1880, + 20492, + 8505, + 7268, + 4291, + 4363, + 4299, + 13181, + 986, + 19663, + 5060, + 9155, + 7553, + 29893, + 11261, + 7124, + 12770, + 8031, + 29958, + 16259, + 8623, + 22916, + 29556, + 23608, + 12679, + 9429, + 19059, + 22581, + 12764, + 21890, + 23607, + 26431, + 17017, + 1258, + 17036, + 13278, + 11308, + 8769, + 549, + 13891, + 17252, + 29807, + 24819, + 15275, + 25295, + 19699, + 24245, + 17915, + 1343, + 2919, + 18163, + 12909, + 1011, + 4553, + 18454, + 17835, + 8977, + 2727, + 9015, + 22488, + 19798, + 17481, + 24665, + 7149, + 15843, + 20852, + 26298, + 28536, + 2852, + 6948, + 24926, + 14108, + 10900, + 27452, + 9638, + 18357, + 13026, + 11020, + 18776, + 19185, + 14797, + 15677, + 9832, + 14642, + 14557, + 5836, + 19875, + 15775, + 4026, + 161, + 15559, + 2721, + 25204, + 10658, + 21428, + 23141, + 9321, + 26209, + 27992, + 27852, + 28628, + 25193, + 27174, + 3240, + 7681, + 29692, + 15419, + 8298, + 7827, + 15159, + 27958, + 2075, + 20014, + 15491, + 5625, + 17350, + 16117, + 8661, + 16540, + 26084, + 13347, + 12409, + 1180, + 8269, + 6339, + 3353, + 6779, + 14708, + 9371, + 23308, + 9085, + 4615, + 28567, + 23239, + 18173, + 9798, + 9746, + 1748, + 7350, + 10475, + 12053, + 28780, + 6739, + 17455, + 4583, + 15640, + 15840, + 23452, + 1659, + 7822, + 23166, + 22662, + 1121, + 26464, + 11127, + 11134, + 9220, + 9191, + 27999, + 3307, + 29274, + 29322, + 15039, + 20205, + 9509, + 3203, + 2508, + 5183, + 4971, + 27403, + 26435, + 682, + 14195, + 3318, + 17734, + 27499, + 1249, + 12664, + 23825, + 19998, + 17546, + 6146, + 10810, + 25310, + 11987, + 27033, + 4157, + 27964, + 21478, + 9245, + 22756, + 7723, + 29311, + 26767, + 17954, + 15608, + 3235, + 9685, + 9498, + 2485, + 25996, + 12847, + 4208, + 15546, + 783, + 28855, + 27152, + 6870, + 21232, + 4167, + 23199, + 27462, + 18027, + 2501, + 16001, + 1260, + 1446, + 17683, + 24953, + 17768, + 1820, + 17054, + 4951, + 6720, + 6498, + 16653, + 10915, + 11674, + 26382, + 29737, + 15943, + 29656, + 27722, + 19666, + 2341, + 23202, + 27533, + 22118, + 13344, + 12555, + 7458, + 10937, + 14820, + 22882, + 15161, + 2775, + 7989, + 19428, + 25814, + 20801, + 24702, + 21404, + 8364, + 11431, + 20369, + 19055, + 6892, + 22180, + 711, + 872, + 23371, + 12838, + 6364, + 27653, + 11296, + 12163, + 13389, + 6418, + 23196, + 24384, + 9594, + 29465, + 9801, + 19539, + 25993, + 6248, + 22087, + 26434, + 15026, + 495, + 16039, + 2328, + 25568, + 16712, + 28345, + 21022, + 10778, + 18787, + 28982, + 29084, + 20053, + 25371, + 29379, + 29547, + 22121, + 15191, + 21233, + 12559, + 14176, + 18331, + 16627, + 13994, + 16399, + 22105, + 7021, + 2250, + 14702, + 24040, + 22257, + 19683, + 14628, + 24439, + 21619, + 16063, + 7080, + 28331, + 14387, + 2374, + 2495, + 7091, + 21838, + 17476, + 561, + 25382, + 23533, + 21029, + 1969, + 6838, + 29824, + 29942, + 27669, + 14800, + 10125, + 29310, + 12414, + 6846, + 8924, + 18485, + 19274, + 7520, + 28171, + 14695, + 28604, + 17287, + 8347, + 21035, + 12382, + 15917, + 749, + 5352, + 449, + 1933, + 22171, + 17786, + 27410, + 1752, + 3936, + 26243, + 4390, + 26351, + 24864, + 24765, + 22671, + 27829, + 28637, + 18827, + 22525, + 22445, + 13198, + 1338, + 28503, + 3025, + 19891, + 15206, + 22387, + 9749, + 12856, + 2958, + 28543, + 21572, + 10431, + 4537, + 5346, + 9931, + 7747, + 3784, + 16891, + 1961, + 11156, + 7791, + 9006, + 26020, + 3707, + 16705, + 24090, + 14418, + 17420, + 29425, + 10777, + 8066, + 20079, + 27126, + 27755, + 4110, + 24071, + 15957, + 20578, + 24344, + 2965, + 18370, + 22962, + 24315, + 10826, + 11595, + 6105, + 27486, + 2068, + 24867, + 4288, + 2112, + 3122, + 12138, + 6563, + 6866, + 3255, + 29076, + 1563, + 25014, + 13993, + 11756, + 8278, + 22425, + 14307, + 23266, + 126, + 13246, + 1237, + 17810, + 21424, + 4050, + 19719, + 24045, + 27022, + 18181, + 25867, + 27771, + 6741, + 29900, + 16100, + 2151, + 28020, + 12959, + 9278, + 13519, + 20189, + 27359, + 19203, + 6611, + 25549, + 16028, + 18371, + 3603, + 20269, + 11215, + 22478, + 3177, + 7875, + 6765, + 29169, + 23204, + 7002, + 5405, + 186, + 18767, + 8782, + 23938, + 1019, + 25078, + 4128, + 8040, + 22052, + 2841, + 12521, + 21438, + 27175, + 11668, + 12257, + 18153, + 18336, + 29501, + 2252, + 29215, + 15349, + 6353, + 19866, + 4575, + 21131, + 24898, + 13604, + 3564, + 22135, + 10174, + 9532, + 6504, + 17288, + 23262, + 13087, + 25676, + 8830, + 8392, + 8730, + 28645, + 18068, + 10451, + 26898, + 11787, + 5838, + 25265, + 5618, + 3529, + 16637, + 2588, + 11565, + 27861, + 15251, + 20144, + 14394, + 7938, + 11205, + 4234, + 9528, + 15621, + 20878, + 5656, + 2480, + 6057, + 26180, + 27507, + 26165, + 14898, + 23768, + 25407, + 2746, + 14141, + 10711, + 2256, + 27818, + 17596, + 20993, + 27234, + 558, + 7292, + 2805, + 6039, + 29529, + 11617, + 17741, + 20330, + 6123, + 24562, + 18004, + 21165, + 15312, + 12477, + 28163, + 21911, + 8574, + 8132, + 9790, + 16368, + 9287, + 21384, + 3167, + 7720, + 1200, + 5551, + 3854, + 1441, + 26670, + 58, + 3973, + 6059, + 12322, + 15458, + 9929, + 20001, + 2655, + 3497, + 10536, + 26614, + 17852, + 15012, + 18868, + 16485, + 26407, + 23849, + 6639, + 4308, + 26283, + 26088, + 18617, + 19525, + 5260, + 3314, + 11210, + 7843, + 24703, + 5993, + 13518, + 24495, + 24267, + 21565, + 17045, + 26757, + 13475, + 17098, + 1416, + 693, + 18191, + 26214, + 10913, + 16320, + 3816, + 4039, + 8159, + 1409, + 24468, + 15859, + 10362, + 6256, + 13613, + 14010, + 295, + 16921, + 16423, + 11518, + 29994, + 15388, + 6918, + 23511, + 198, + 1236, + 29339, + 14792, + 22933, + 16390, + 25785, + 17609, + 26729, + 20457, + 28801, + 26287, + 28990, + 4276, + 19775, + 5345, + 20262, + 11851, + 13533, + 26207, + 1926, + 5772, + 7661, + 25704, + 12607, + 11831, + 22405, + 15920, + 1581, + 5, + 22001, + 1678, + 16578, + 8991, + 12333, + 11957, + 26371, + 16088, + 24871, + 22694, + 1367, + 23219, + 18520, + 3317, + 27685, + 23398, + 20739, + 17381, + 19876, + 21014, + 4873, + 20856, + 18690, + 12080, + 6671, + 11108, + 89, + 23819, + 22215, + 17613, + 10203, + 223, + 9628, + 4305, + 7659, + 24248, + 14819, + 1867, + 9111, + 19674, + 12201, + 11024, + 5403, + 15553, + 24969, + 9437, + 8342, + 6690, + 17397, + 15119, + 16109, + 20237, + 5380, + 27666, + 20804, + 17008, + 26475, + 18627, + 19412, + 1284, + 7913, + 6708, + 24175, + 20663, + 19698, + 28076, + 14100, + 17131, + 24955, + 21239, + 1505, + 2198, + 22775, + 5031, + 28152, + 28755, + 7538, + 2997, + 10319, + 10950, + 13337, + 2698, + 7749, + 19452, + 24454, + 23712, + 21944, + 20566, + 7405, + 29626, + 3853, + 5452, + 10949, + 6867, + 19851, + 1499, + 17393, + 27060, + 11568, + 12075, + 8326, + 1062, + 8479, + 28732, + 3896, + 10628, + 4714, + 11741, + 11412, + 20248, + 10399, + 10368, + 16713, + 13573, + 7328, + 27617, + 5691, + 24288, + 820, + 25115, + 21982, + 18, + 29920, + 2017, + 11407, + 8035, + 51, + 8423, + 25739, + 4197, + 19895, + 27404, + 26603, + 8238, + 15942, + 12891, + 1912, + 15163, + 1239, + 20416, + 29038, + 5708, + 23867, + 19992, + 19976, + 380, + 21054, + 8362, + 23673, + 14858, + 14982, + 15013, + 3335, + 23601, + 29073, + 29568, + 17501, + 21002, + 13763, + 9425, + 3121, + 19195, + 15798, + 28772, + 27202, + 13109, + 8601, + 22943, + 27480, + 5390, + 21690, + 8106, + 14915, + 24302, + 27214, + 5458, + 18157, + 7101, + 23640, + 18718, + 15485, + 3003, + 5752, + 1007, + 20390, + 24135, + 24517, + 15937, + 20782, + 929, + 9283, + 25972, + 26163, + 2013, + 5539, + 6172, + 8981, + 23671, + 4372, + 27190, + 593, + 12323, + 4094, + 14074, + 25308, + 19920, + 9846, + 10626, + 28964, + 23978, + 14414, + 19448, + 15720, + 11087, + 7414, + 11395, + 29672, + 360, + 28653, + 13349, + 15394, + 24806, + 4333, + 24983, + 21553, + 22901, + 3883, + 21135, + 20965, + 25244, + 14251, + 19282, + 21166, + 20479, + 19570, + 702, + 4783, + 3502, + 5947, + 479, + 6853, + 22848, + 9379, + 23743, + 25405, + 18886, + 27306, + 5626, + 27099, + 3767, + 21291, + 2612, + 4506, + 17924, + 20199, + 26516, + 25537, + 10799, + 19782, + 17844, + 8843, + 13953, + 9450, + 26927, + 14256, + 11563, + 18182, + 15982, + 10216, + 8786, + 24010, + 10126, + 19060, + 5696, + 7594, + 7049, + 6390, + 11687, + 17424, + 20912, + 16939, + 23638, + 11856, + 13405, + 29752, + 29044, + 15741, + 21429, + 5548, + 28894, + 18811, + 14975, + 26194, + 29241, + 8502, + 18706, + 21451, + 26184, + 27523, + 16957, + 13446, + 10381, + 23992, + 24730, + 1422, + 18168, + 25938, + 12937, + 3104, + 29786, + 22569, + 14117, + 5165, + 25914, + 3769, + 15918, + 16150, + 23562, + 12589, + 325, + 5542, + 5166, + 24954, + 7098, + 281, + 10413, + 6580, + 11903, + 5207, + 25277, + 18949, + 20748, + 18554, + 8759, + 25880, + 7167, + 15595, + 9552, + 24334, + 11233, + 23356, + 24985, + 13818, + 2204, + 24481, + 25469, + 7969, + 2104, + 4206, + 15383, + 15247, + 26658, + 27765, + 8332, + 600, + 20059, + 12830, + 24743, + 25556, + 3924, + 27957, + 5738, + 22014, + 8217, + 13971, + 20890, + 4993, + 25365, + 1929, + 23329, + 6676, + 3677, + 5404, + 3801, + 10412, + 2734, + 17197, + 9061, + 16392, + 12824, + 19869, + 5307, + 2681, + 14217, + 13718, + 3790, + 4368, + 12482, + 654, + 11259, + 9172, + 24592, + 23808, + 9489, + 3742, + 16584, + 6113, + 5348, + 8409, + 12145, + 930, + 5433, + 9198, + 21858, + 17551, + 21608, + 21774, + 6586, + 10487, + 26068, + 23320, + 153, + 5196, + 26021, + 24798, + 4468, + 27206, + 17435, + 14494, + 27350, + 15302, + 16496, + 8169, + 4495, + 19516, + 3198, + 6446, + 27890, + 21923, + 10235, + 25282, + 10335, + 26105, + 1436, + 8819, + 2652, + 5035, + 7327, + 29688, + 7727, + 26640, + 4255, + 29902, + 493, + 13762, + 23838, + 29827, + 23103, + 20339, + 27246, + 17744, + 20630, + 23694, + 15728, + 24586, + 19148, + 21499, + 23335, + 19102, + 27995, + 14129, + 7316, + 18305, + 4502, + 15675, + 8735, + 4619, + 7419, + 28691, + 16268, + 20270, + 20093, + 25300, + 28303, + 3212, + 7951, + 15280, + 4171, + 10422, + 27756, + 12181, + 18976, + 27151, + 20797, + 27728, + 12878, + 7488, + 3876, + 4646, + 4820, + 14500, + 14870, + 6114, + 17885, + 1631, + 29323, + 2707, + 8081, + 22875, + 7587, + 10675, + 2814, + 433, + 2520, + 15835, + 2564, + 29905, + 12216, + 19378, + 13362, + 24144, + 8120, + 20450, + 11139, + 2753, + 14034, + 9691, + 4817, + 10885, + 15155, + 17951, + 17080, + 18580, + 17916, + 5422, + 26615, + 4179, + 438, + 29049, + 24418, + 13420, + 29595, + 18392, + 12747, + 26125, + 25627, + 170, + 14218, + 16608, + 29116, + 3765, + 17146, + 5248, + 20946, + 15999, + 19162, + 27089, + 21110, + 3137, + 20779, + 22150, + 24124, + 11058, + 11735, + 10308, + 20120, + 21432, + 27888, + 7343, + 5923, + 29336, + 10298, + 1987, + 14928, + 29897, + 9575, + 14187, + 29990, + 9178, + 5026, + 18557, + 24485, + 8667, + 17453, + 1889, + 10095, + 24948, + 23393, + 6472, + 28294, + 18488, + 23884, + 6094, + 12715, + 1743, + 4602, + 4470, + 15223, + 5239, + 9668, + 14407, + 24107, + 5462, + 20225, + 21922, + 5068, + 2890, + 5255, + 16225, + 23332, + 24323, + 5073, + 381, + 21265, + 23399, + 266, + 24966, + 6539, + 10042, + 15276, + 25810, + 27131, + 13491, + 14705, + 28865, + 8955, + 5118, + 3946, + 24027, + 10272, + 10643, + 11230, + 5265, + 18137, + 12217, + 18975, + 13401, + 8192, + 7588, + 3163, + 780, + 15725, + 12995, + 10526, + 13790, + 13106, + 15176, + 13458, + 18771, + 15372, + 4983, + 533, + 28831, + 23454, + 7563, + 4113, + 20504, + 19342, + 1074, + 6979, + 25743, + 16576, + 22039, + 25334, + 21610, + 29204, + 29516, + 19824, + 26320, + 28803, + 13437, + 6471, + 24052, + 22676, + 7432, + 16394, + 9374, + 12964, + 29283, + 14780, + 16191, + 17354, + 20130, + 26814, + 2720, + 14502, + 252, + 24121, + 27916, + 8501, + 4992, + 69, + 13179, + 17416, + 19063, + 29201, + 9721, + 5321, + 4434, + 5954, + 4316, + 2756, + 27734, + 17089, + 11080, + 2892, + 28334, + 2993, + 14472, + 20692, + 15088, + 5735, + 16223, + 17084, + 29183, + 14633, + 15162, + 13887, + 6834, + 17773, + 27009, + 1363, + 2372, + 9389, + 10935, + 18863, + 15215, + 26817, + 1380, + 21834, + 27590, + 10629, + 25799, + 10433, + 29399, + 20989, + 15985, + 25102, + 14831, + 27366, + 12191, + 23411, + 1377, + 11162, + 6270, + 11081, + 19623, + 18738, + 21825, + 23950, + 14071, + 6103, + 20117, + 14249, + 9264, + 17459, + 27424, + 9362, + 10662, + 18211, + 2022, + 17556, + 20249, + 11850, + 9554, + 29193, + 27514, + 2770, + 9378, + 508, + 189, + 26845, + 12795, + 16248, + 25073, + 23021, + 16686, + 3079, + 17961, + 23055, + 17904, + 15178, + 28886, + 26197, + 10569, + 17584, + 12912, + 25705, + 26756, + 4496, + 15706, + 24775, + 2611, + 3577, + 8225, + 27482, + 23822, + 20687, + 16756, + 29484, + 28666, + 640, + 28383, + 24986, + 1767, + 125, + 14785, + 8139, + 1264, + 1270, + 11613, + 14018, + 1042, + 18081, + 19679, + 6479, + 8350, + 10394, + 20780, + 11366, + 82, + 23703, + 17521, + 7602, + 6905, + 11753, + 15142, + 25029, + 27064, + 27554, + 19746, + 28757, + 20669, + 21576, + 22202, + 7771, + 9613, + 17947, + 17864, + 23875, + 3684, + 26945, + 948, + 21415, + 27012, + 2349, + 25324, + 13378, + 29938, + 18555, + 27169, + 23100, + 24539, + 27302, + 225, + 24339, + 14950, + 2845, + 9646, + 18009, + 2180, + 3746, + 4172, + 23237, + 12962, + 22959, + 11271, + 17903, + 21642, + 12342, + 7107, + 10010, + 7769, + 5983, + 17365, + 485, + 21832, + 7767, + 9614, + 28882, + 9600, + 3395, + 6032, + 20177, + 4879, + 2812, + 28154, + 176, + 19576, + 4516, + 3241, + 27396, + 21495, + 26619, + 11265, + 20895, + 5186, + 9027, + 22160, + 28613, + 26507, + 21968, + 26260, + 29822, + 23086, + 1457, + 29724, + 6616, + 13, + 18833, + 5010, + 10082, + 19330, + 26708, + 3547, + 12924, + 21743, + 18277, + 11740, + 20634, + 16105, + 17276, + 2881, + 12340, + 27777, + 11952, + 22721, + 3503, + 22452, + 7253, + 25106, + 3200, + 10588, + 15309, + 9123, + 26072, + 15311, + 10843, + 10450, + 10160, + 24646, + 23035, + 3783, + 28513, + 8140, + 962, + 21885, + 20293, + 27584, + 19900, + 3902, + 26848, + 16382, + 21067, + 12996, + 16257, + 13605, + 18232, + 10710, + 7798, + 16158, + 8993, + 264, + 11495, + 24401, + 4830, + 26406, + 5256, + 22145, + 23556, + 7408, + 18599, + 12439, + 3028, + 3852, + 22385, + 28638, + 10500, + 25805, + 1686, + 28474, + 4148, + 4908, + 24132, + 8287, + 7199, + 13288, + 624, + 26295, + 5170, + 3164, + 15736, + 7017, + 24920, + 25508, + 16079, + 11172, + 20903, + 12454, + 14344, + 22697, + 10992, + 6277, + 22004, + 23735, + 25665, + 156, + 11624, + 2418, + 12845, + 188, + 22728, + 23983, + 1859, + 4955, + 20751, + 17237, + 17419, + 4559, + 22497, + 15279, + 2843, + 24008, + 28549, + 4591, + 16759, + 15596, + 12178, + 12416, + 8575, + 21837, + 22329, + 4166, + 18913, + 3587, + 9843, + 15831, + 27572, + 15910, + 25423, + 8691, + 29740, + 9268, + 26953, + 10638, + 1938, + 8907, + 10312, + 21266, + 9724, + 22758, + 18430, + 10909, + 20803, + 13840, + 29785, + 12196, + 3375, + 2084, + 4112, + 11982, + 16710, + 7968, + 29696, + 961, + 11075, + 17690, + 10357, + 17478, + 29583, + 27773, + 7794, + 6239, + 12035, + 23303, + 24733, + 8535, + 29552, + 21325, + 15905, + 9788, + 24034, + 2937, + 21181, + 14445, + 22223, + 24483, + 14582, + 20783, + 19973, + 1318, + 26523, + 908, + 23163, + 7902, + 12759, + 10211, + 19247, + 14734, + 7836, + 15986, + 21804, + 29984, + 14486, + 13215, + 27115, + 29404, + 16647, + 8426, + 7516, + 6647, + 24897, + 6717, + 22805, + 3324, + 17334, + 8348, + 16300, + 2517, + 12364, + 27322, + 13104, + 7957, + 28137, + 29622, + 78, + 25481, + 9664, + 29627, + 1891, + 13150, + 2158, + 11222, + 7691, + 1662, + 19942, + 13530, + 671, + 3847, + 4834, + 22685, + 12880, + 13748, + 18647, + 21611, + 18970, + 15307, + 9887, + 24547, + 6981, + 7311, + 23436, + 23264, + 11181, + 9573, + 2663, + 22301, + 26108, + 27665, + 2927, + 11723, + 13232, + 1102, + 16919, + 9692, + 15554, + 4262, + 8115, + 21023, + 29843, + 1860, + 11306, + 26832, + 6456, + 11940, + 12405, + 9132, + 22156, + 6911, + 4422, + 19911, + 13599, + 15961, + 29628, + 9676, + 3768, + 10489, + 15925, + 16212, + 26429, + 2239, + 22063, + 868, + 29753, + 18416, + 24862, + 6821, + 13735, + 6934, + 13244, + 5053, + 10120, + 10917, + 15354, + 1634, + 18072, + 29190, + 26528, + 21049, + 20652, + 21919, + 3381, + 12709, + 20085, + 14541, + 4228, + 24900, + 27721, + 14770, + 17533, + 23294, + 6362, + 2607, + 24910, + 16050, + 23953, + 15639, + 87, + 27280, + 15051, + 19889, + 1709, + 10380, + 5485, + 95, + 19675, + 22831, + 6795, + 893, + 29758, + 8315, + 27171, + 19842, + 13681, + 15217, + 23469, + 15398, + 21345, + 6945, + 15854, + 19735, + 25566, + 14112, + 24552, + 23603, + 4096, + 6825, + 18044, + 6803, + 2148, + 9129, + 18079, + 29621, + 11250, + 24599, + 17717, + 4115, + 20155, + 29566, + 21878, + 20624, + 6729, + 24820, + 13063, + 29222, + 21276, + 21070, + 4775, + 27261, + 9693, + 26386, + 21079, + 7557, + 9934, + 16789, + 20571, + 17686, + 1524, + 16993, + 3836, + 19732, + 7543, + 17661, + 22710, + 15703, + 22935, + 12698, + 2473, + 7523, + 25818, + 19880, + 12629, + 9021, + 22075, + 8963, + 24421, + 25737, + 17679, + 1322, + 27140, + 28255, + 17493, + 4826, + 24156, + 19048, + 21695, + 19039, + 12006, + 21065, + 27090, + 29606, + 2322, + 7283, + 1408, + 15909, + 7513, + 13419, + 15244, + 25098, + 21726, + 28075, + 26285, + 14661, + 21830, + 23630, + 13586, + 1379, + 23284, + 12012, + 29478, + 10783, + 21723, + 6197, + 14101, + 18798, + 16269, + 8011, + 21026, + 16106, + 19740, + 1900, + 7949, + 18052, + 11041, + 26363, + 2908, + 16235, + 21277, + 9665, + 27744, + 8732, + 14882, + 23373, + 20325, + 26348, + 6011, + 6896, + 15011, + 13873, + 25790, + 16316, + 17417, + 4973, + 9400, + 29117, + 13365, + 11688, + 17452, + 11589, + 19127, + 29179, + 10316, + 22018, + 21335, + 6557, + 13563, + 7943, + 13749, + 19207, + 18631, + 12356, + 21471, + 27065, + 17855, + 27556, + 29650, + 29050, + 25409, + 28240, + 27251, + 27913, + 11006, + 2637, + 21939, + 6721, + 6474, + 150, + 17108, + 17867, + 21507, + 20891, + 7676, + 15137, + 18812, + 8073, + 6816, + 22768, + 12706, + 5843, + 17662, + 4107, + 496, + 12976, + 21185, + 2780, + 2160, + 11672, + 1458, + 17248, + 3754, + 23009, + 924, + 21421, + 11660, + 15467, + 28430, + 29150, + 3403, + 16190, + 10538, + 26819, + 28920, + 7015, + 17809, + 12647, + 22081, + 18055, + 20814, + 2584, + 16393, + 27343, + 11204, + 15711, + 28857, + 24067, + 307, + 10074, + 6267, + 29530, + 4746, + 17217, + 19451, + 11845, + 10614, + 25358, + 10270, + 23495, + 7289, + 10444, + 19358, + 23426, + 17873, + 6555, + 29421, + 19677, + 4948, + 20849, + 9152, + 14098, + 1935, + 11039, + 27426, + 8835, + 26347, + 27002, + 2981, + 1970, + 23351, + 1155, + 7505, + 13334, + 3829, + 29584, + 14247, + 12046, + 24621, + 9461, + 29212, + 15521, + 12820, + 15104, + 17894, + 6255, + 20126, + 16143, + 9122, + 9409, + 2249, + 27808, + 15272, + 21699, + 9758, + 15361, + 26462, + 22491, + 7498, + 16071, + 24828, + 26987, + 6375, + 10123, + 9556, + 20359, + 3144, + 9480, + 1967, + 21710, + 20541, + 15594, + 9271, + 27702, + 3459, + 16318, + 13267, + 271, + 16776, + 18836, + 28600, + 2197, + 10050, + 20957, + 8503, + 6691, + 12041, + 25428, + 29987, + 28304, + 17284, + 470, + 9028, + 2864, + 14346, + 6326, + 24761, + 29898, + 13553, + 27573, + 5109, + 14173, + 1329, + 599, + 10041, + 3680, + 11511, + 22528, + 5388, + 1783, + 18846, + 10365, + 571, + 28504, + 4337, + 3018, + 12564, + 14200, + 24688, + 5742, + 28871, + 19263, + 4069, + 21184, + 25969, + 26638, + 10669, + 29293, + 27172, + 8274, + 24967, + 16813, + 26252, + 18197, + 24284, + 11644, + 18473, + 26463, + 27303, + 19474, + 7776, + 6298, + 1106, + 27427, + 8738, + 21868, + 20768, + 10109, + 8773, + 19504, + 7358, + 8872, + 8388, + 7267, + 708, + 3153, + 3186, + 2481, + 11363, + 27920, + 14513, + 17467, + 3485, + 7275, + 8236, + 14922, + 25286, + 11822, + 12732, + 20005, + 27096, + 5359, + 26963, + 21048, + 15465, + 22846, + 27391, + 27654, + 16440, + 16868, + 11769, + 12220, + 24173, + 19988, + 16907, + 9803, + 28093, + 8300, + 4785, + 29136, + 16715, + 22209, + 2665, + 20466, + 9458, + 22269, + 29016, + 25068, + 21162, + 7205, + 14669, + 2888, + 28305, + 14058, + 14053, + 17732, + 18178, + 28290, + 2109, + 22673, + 2044, + 25125, + 8123, + 29608, + 16386, + 22715, + 15923, + 12135, + 9334, + 14149, + 10587, + 22564, + 4593, + 16597, + 27535, + 23273, + 13824, + 8259, + 944, + 20820, + 14972, + 2330, + 9597, + 8431, + 18475, + 16638, + 7099, + 24059, + 21036, + 13098, + 5892, + 7182, + 13118, + 2921, + 1351, + 24762, + 8542, + 12272, + 690, + 24081, + 10200, + 11504, + 25621, + 9829, + 5778, + 22799, + 28575, + 14347, + 15998, + 28712, + 5286, + 27354, + 3327, + 3681, + 11463, + 3305, + 6404, + 28595, + 19098, + 2290, + 29789, + 21309, + 483, + 1223, + 10793, + 10989, + 15350, + 6308, + 24169, + 5483, + 5258, + 18298, + 3908, + 7709, + 12009, + 17266, + 29331, + 27225, + 2435, + 738, + 5550, + 13163, + 440, + 5685, + 13671, + 18013, + 4962, + 15169, + 9830, + 7185, + 26926, + 13865, + 11575, + 27949, + 4976, + 17184, + 20135, + 13377, + 19584, + 3669, + 2726, + 28049, + 11984, + 29318, + 13427, + 10785, + 22255, + 23251, + 11067, + 1855, + 2417, + 18733, + 16732, + 6104, + 12966, + 16217, + 11460, + 8665, + 22227, + 4900, + 15411, + 20089, + 23538, + 4507, + 24061, + 11865, + 10697, + 28103, + 28696, + 22608, + 18532, + 15906, + 29290, + 9913, + 7303, + 5865, + 8971, + 23184, + 15481, + 14931, + 10689, + 24826, + 21470, + 6476, + 24472, + 28327, + 1432, + 1806, + 9456, + 28175, + 1556, + 28942, + 9042, + 23343, + 21876, + 4533, + 29725, + 26591, + 10640, + 13797, + 21684, + 16472, + 14332, + 20601, + 26855, + 498, + 22625, + 19297, + 24236, + 849, + 17496, + 28330, + 20334, + 26354, + 12895, + 8550, + 8990, + 23408, + 11044, + 11859, + 22570, + 3461, + 20675, + 5468, + 6158, + 5123, + 26786, + 9320, + 28192, + 14168, + 22394, + 12319, + 20429, + 10823, + 16271, + 24424, + 13871, + 12920, + 19250, + 19486, + 5104, + 28655, + 26111, + 2790, + 4807, + 17573, + 17135, + 17849, + 17851, + 3196, + 22755, + 17880, + 8091, + 2231, + 26381, + 2491, + 10048, + 25630, + 11341, + 5555, + 5189, + 29423, + 3377, + 24266, + 16693, + 21719, + 21144, + 28123, + 27855, + 5192, + 10548, + 18568, + 8372, + 29414, + 16365, + 29681, + 9963, + 2368, + 5029, + 10757, + 29492, + 4259, + 12974, + 14823, + 27796, + 25770, + 11681, + 27329, + 18255, + 7092, + 27028, + 20398, + 4749, + 309, + 8243, + 18875, + 9115, + 16333, + 27824, + 18461, + 8607, + 12363, + 18303, + 29276, + 26539, + 6529, + 23805, + 15959, + 3833, + 17797, + 8493, + 20665, + 20068, + 1592, + 14396, + 20308, + 27806, + 9452, + 9535, + 10024, + 15003, + 5937, + 16719, + 29519, + 6421, + 5956, + 24400, + 15117, + 22925, + 2189, + 29004, + 26724, + 21682, + 22294, + 29798, + 15016, + 12256, + 27684, + 6415, + 27811, + 24241, + 29750, + 28747, + 6304, + 24182, + 22524, + 21118, + 4586, + 16602, + 24280, + 27260, + 9016, + 12990, + 13663, + 19294, + 15901, + 16077, + 5904, + 21158, + 4425, + 26304, + 5747, + 19475, + 24637, + 2592, + 16972, + 29662, + 10096, + 1684, + 26750, + 29610, + 22407, + 12018, + 23651, + 21353, + 6573, + 1255, + 20841, + 15952, + 13572, + 29711, + 11883, + 19033, + 17823, + 10017, + 7939, + 15405, + 15603, + 17761, + 12171, + 24904, + 21702, + 29124, + 2161, + 25156, + 10406, + 14837, + 29321, + 25999, + 18017, + 12610, + 4066, + 18537, + 3865, + 358, + 13250, + 7609, + 12839, + 20598, + 2717, + 2142, + 22153, + 794, + 24696, + 22037, + 16736, + 12918, + 23042, + 21025, + 10269, + 4886, + 6397, + 17406, + 21308, + 8804, + 12784, + 21366, + 19149, + 17508, + 17298, + 12290, + 4688, + 26606, + 18494, + 26074, + 27925, + 22544, + 14521, + 17515, + 25113, + 14856, + 8340, + 7177, + 16413, + 8510, + 3298, + 18511, + 17670, + 740, + 12093, + 490, + 12888, + 17486, + 13418, + 24157, + 14854, + 5187, + 20387, + 13811, + 26818, + 15731, + 1611, + 23091, + 15023, + 28028, + 25318, + 3718, + 15697, + 4713, + 17597, + 12826, + 13728, + 1572, + 3808, + 16298, + 12258, + 16396, + 17018, + 25917, + 21704, + 27041, + 10516, + 29152, + 25071, + 10577, + 18716, + 15328, + 21912, + 25652, + 19254, + 25932, + 11369, + 2319, + 13773, + 3094, + 27379, + 13679, + 10378, + 8445, + 13823, + 6587, + 1648, + 12248, + 541, + 7368, + 23810, + 26317, + 19979, + 20046, + 19136, + 10960, + 16432, + 19701, + 18448, + 2525, + 20427, + 17647, + 18994, + 16492, + 21123, + 9585, + 7832, + 2314, + 23925, + 27739, + 27851, + 29445, + 4712, + 3059, + 23142, + 13390, + 22320, + 9753, + 13874, + 9179, + 29581, + 12180, + 22579, + 25354, + 17230, + 29678, + 24139, + 17473, + 2722, + 8288, + 3962, + 1304, + 23378, + 22761, + 4892, + 25333, + 1063, + 20045, + 28161, + 18066, + 28819, + 1399, + 19834, + 15259, + 6379, + 317, + 14496, + 12307, + 27035, + 15233, + 6593, + 3192, + 19220, + 6737, + 29454, + 10349, + 14179, + 12869, + 19411, + 16684, + 5484, + 536, + 21552, + 14370, + 6001, + 3859, + 9300, + 19739, + 19959, + 17128, + 13251, + 23976, + 26525, + 22283, + 26060, + 11625, + 120, + 17576, + 1447, + 7013, + 14660, + 13180, + 4770, + 18908, + 13817, + 8903, + 18160, + 15415, + 14880, + 18230, + 22326, + 2423, + 6438, + 25541, + 22675, + 23804, + 19678, + 3786, + 21164, + 4024, + 23111, + 25730, + 12663, + 19368, + 25433, + 4045, + 22481, + 3661, + 27580, + 17434, + 12218, + 17258, + 14115, + 7153, + 29886, + 28069, + 960, + 15450, + 1247, + 24110, + 24861, + 8145, + 29094, + 26950, + 16803, + 24310, + 14516, + 17361, + 8277, + 27341, + 5376, + 26083, + 5473, + 29980, + 18005, + 4554, + 12400, + 2246, + 14728, + 6899, + 11493, + 23778, + 1809, + 10098, + 18271, + 20212, + 3618, + 5785, + 27067, + 25829, + 13252, + 11886, + 26292, + 2010, + 4342, + 15423, + 22653, + 2007, + 27623, + 3073, + 594, + 18934, + 17064, + 14009, + 13854, + 13461, + 12602, + 13995, + 18078, + 24395, + 2083, + 8390, + 3585, + 25370, + 18121, + 6523, + 16740, + 9443, + 22473, + 21782, + 14281, + 12365, + 6318, + 8722, + 28479, + 1225, + 22867, + 20880, + 15452, + 20140, + 5079, + 5793, + 3913, + 1350, + 3333, + 9295, + 24358, + 26069, + 6735, + 10877, + 29603, + 26270, + 27774, + 8373, + 11332, + 19670, + 2451, + 23990, + 14789, + 16525, + 14213, + 15574, + 28810, + 25199, + 14409, + 11899, + 2489, + 17446, + 17987, + 4185, + 14491, + 29667, + 5560, + 18076, + 15245, + 4513, + 1035, + 10734, + 18290, + 6466, + 3148, + 27003, + 23224, + 28425, + 21658, + 5984, + 20233, + 7541, + 2150, + 23306, + 25219, + 23558, + 29804, + 24531, + 12516, + 13019, + 9148, + 17781, + 11878, + 10603, + 18425, + 25918, + 5678, + 17209, + 22636, + 1660, + 15724, + 19169, + 18479, + 9527, + 8987, + 8548, + 22845, + 14164, + 8904, + 7315, + 7780, + 20648, + 19347, + 2472, + 25771, + 21720, + 14219, + 29661, + 25480, + 19025, + 20700, + 9424, + 1884, + 22825, + 2415, + 2522, + 16516, + 19826, + 26289, + 7865, + 5634, + 8366, + 19270, + 10288, + 22567, + 24361, + 18293, + 17092, + 10336, + 20422, + 16994, + 24191, + 2405, + 18445, + 24408, + 28084, + 25164, + 24530, + 1285, + 1887, + 5098, + 24316, + 9610, + 18122, + 7462, + 3142, + 10847, + 7829, + 25087, + 18830, + 18364, + 9983, + 17821, + 2117, + 21700, + 965, + 20313, + 19227, + 18764, + 3086, + 26423, + 23872, + 4353, + 8689, + 24825, + 9837, + 6667, + 28230, + 27380, + 20355, + 27367, + 8762, + 4446, + 24336, + 2816, + 26003, + 19237, + 28325, + 3012, + 402, + 2724, + 21869, + 11394, + 8189, + 25299, + 27887, + 13636, + 9933, + 26114, + 4894, + 5930, + 14881, + 28523, + 20858, + 27832, + 6434, + 7370, + 3810, + 10605, + 24997, + 28989, + 11882, + 6939, + 25544, + 5188, + 8522, + 8838, + 21381, + 2258, + 26878, + 25964, + 27645, + 27346, + 4987, + 26825, + 850, + 15019, + 27008, + 11242, + 24995, + 2735, + 9684, + 22161, + 2333, + 7679, + 11610, + 22134, + 21673, + 1368, + 7409, + 3286, + 18608, + 4314, + 15174, + 20289, + 14089, + 22910, + 16202, + 1372, + 27900, + 6961, + 16594, + 7739, + 7916, + 27364, + 8446, + 1612, + 21586, + 28816, + 14103, + 11056, + 15908, + 22114, + 29412, + 23357, + 18472, + 26338, + 24084, + 9337, + 12674, + 11294, + 16367, + 3345, + 9394, + 20785, + 4706, + 7612, + 2653, + 8449, + 7494, + 3631, + 25074, + 20291, + 19849, + 25475, + 2293, + 28518, + 17980, + 6410, + 18717, + 9190, + 15678, + 28263, + 14850, + 20092, + 26376, + 21175, + 25149, + 25403, + 9787, + 18394, + 27173, + 2364, + 12243, + 27530, + 7637, + 23565, + 1061, + 13388, + 20605, + 24567, + 3218, + 15271, + 14465, + 27066, + 4759, + 6485, + 20051, + 6254, + 15049, + 29551, + 29867, + 16255, + 8720, + 15431, + 7596, + 15196, + 20685, + 4381, + 927, + 8554, + 414, + 5572, + 24391, + 2456, + 2661, + 14580, + 10252, + 27046, + 29278, + 25857, + 9296, + 10228, + 24709, + 28963, + 6464, + 3100, + 6954, + 17817, + 5726, + 7561, + 22760, + 20792, + 1354, + 15370, + 8634, + 14631, + 9105, + 23421, + 5445, + 5218, + 8686, + 11413, + 16629, + 15082, + 2662, + 24180, + 16569, + 12832, + 21145, + 28550, + 4420, + 5195, + 29334, + 19541, + 10251, + 10755, + 8922, + 14815, + 4750, + 1834, + 18345, + 27155, + 29407, + 1842, + 23302, + 3644, + 14395, + 1831, + 19885, + 26660, + 21292, + 14539, + 5001, + 24432, + 2449, + 22089, + 11790, + 16734, + 17800, + 28165, + 14110, + 22852, + 9067, + 17123, + 6203, + 5534, + 18301, + 15777, + 16535, + 14239, + 25834, + 12423, + 320, + 9643, + 12755, + 10944, + 24488, + 12242, + 2748, + 11031, + 25013, + 12073, + 3143, + 18956, + 6325, + 26970, + 7041, + 14291, + 14937, + 13048, + 24232, + 22494, + 20123, + 12436, + 4192, + 3702, + 27593, + 20462, + 19279, + 19239, + 16976, + 4623, + 22543, + 9987, + 27378, + 3970, + 17363, + 20506, + 8814, + 15477, + 22985, + 22307, + 5128, + 776, + 581, + 8989, + 353, + 22449, + 7511, + 13055, + 20971, + 25866, + 3505, + 16012, + 24638, + 1894, + 23948, + 2254, + 23789, + 29887, + 25032, + 5652, + 16795, + 3667, + 18620, + 3031, + 24795, + 26698, + 25317, + 15073, + 8866, + 4204, + 12132, + 365, + 22656, + 4960, + 12306, + 29461, + 12443, + 19329, + 7201, + 11221, + 29764, + 19144, + 9207, + 14860, + 17975, + 18542, + 13795, + 28158, + 26564, + 25394, + 8338, + 18657, + 16512, + 3645, + 7266, + 15214, + 2045, + 14270, + 21972, + 26042, + 10339, + 4104, + 20381, + 6262, + 13902, + 21296, + 8883, + 13737, + 3339, + 23985, + 5076, + 836, + 29802, + 11131, + 898, + 1735, + 7851, + 20823, + 18413, + 12951, + 19926, + 25982, + 18424, + 13194, + 29874, + 9088, + 11566, + 7120, + 16828, + 6599, + 12600, + 3605, + 2630, + 950, + 4483, + 28408, + 28113, + 5254, + 25835, + 2671, + 3807, + 23031, + 11092, + 21401, + 597, + 10657, + 7936, + 25674, + 559, + 20736, + 27960, + 19054, + 5301, + 696, + 23287, + 28023, + 14509, + 367, + 29830, + 29989, + 25671, + 6140, + 16746, + 20667, + 10091, + 15330, + 11300, + 7726, + 17857, + 24878, + 10008, + 27079, + 23851, + 12185, + 18310, + 19093, + 11128, + 10280, + 8640, + 9218, + 1473, + 14443, + 23683, + 15042, + 24914, + 28007, + 13690, + 1744, + 28985, + 5946, + 2691, + 18419, + 16306, + 18294, + 29345, + 864, + 10485, + 14808, + 23154, + 17005, + 5024, + 9559, + 11047, + 5412, + 6594, + 20389, + 2168, + 10248, + 10779, + 14128, + 3285, + 1279, + 14404, + 2114, + 27789, + 24625, + 20491, + 22334, + 8386, + 26388, + 8089, + 22508, + 16003, + 6335, + 10317, + 25092, + 17733, + 27919, + 4340, + 20138, + 4323, + 3880, + 26586, + 8155, + 2350, + 11802, + 26225, + 20599, + 9566, + 16698, + 27161, + 27544, + 11806, + 12739, + 25820, + 24301, + 24792, + 13101, + 20261, + 15382, + 21115, + 8492, + 4114, + 14118, + 29784, + 8464, + 22480, + 7351, + 4922, + 20176, + 25941, + 5850, + 16397, + 19202, + 13653, + 1157, + 24684, + 25789, + 12494, + 28580, + 7942, + 21907, + 15256, + 7325, + 18921, + 14578, + 26170, + 16371, + 18142, + 20211, + 21373, + 25847, + 24279, + 28774, + 27040, + 16138, + 14466, + 13665, + 15895, + 6875, + 9710, + 23101, + 10025, + 27005, + 875, + 13402, + 23059, + 24357, + 3075, + 4911, + 7623, + 20185, + 3046, + 6367, + 15210, + 24187, + 13889, + 3597, + 27752, + 24781, + 20802, + 237, + 28812, + 7868, + 20623, + 4546, + 29329, + 8028, + 29156, + 26555, + 25812, + 27100, + 24405, + 9163, + 29969, + 8330, + 12023, + 122, + 20976, + 25117, + 10698, + 24207, + 8562, + 7631, + 12978, + 20507, + 5935, + 20125, + 22878, + 10506, + 7586, + 6211, + 15257, + 8605, + 12745, + 26303, + 4919, + 3814, + 6947, + 28847, + 16301, + 6200, + 23664, + 7373, + 3849, + 18995, + 13295, + 21409, + 7442, + 5702, + 9351, + 7052, + 28599, + 29851, + 27660, + 2826, + 29273, + 4595, + 9868, + 7455, + 74, + 11386, + 9860, + 2285, + 13872, + 29081, + 238, + 13077, + 28361, + 4612, + 1451, + 27978, + 24663, + 3430, + 29497, + 28373, + 27418, + 29027, + 16841, + 9518, + 26119, + 24377, + 17926, + 22133, + 22471, + 1538, + 3446, + 8797, + 6453, + 19287, + 29378, + 29355, + 28139, + 13712, + 10736, + 3359, + 15268, + 6468, + 12072, + 9416, + 23410, + 25925, + 22894, + 25645, + 4935, + 22703, + 18558, + 27058, + 29370, + 6246, + 10886, + 24128, + 23969, + 8263, + 9908, + 27673, + 29828, + 17516, + 10524, + 29561, + 13903, + 8284, + 3719, + 9935, + 24249, + 4947, + 4263, + 27375, + 25404, + 3608, + 28793, + 15695, + 21731, + 21047, + 11398, + 3508, + 11819, + 10131, + 7781, + 10287, + 5914, + 23379, + 14654, + 6134, + 25416, + 23034, + 21042, + 4462, + 13177, + 17469, + 2437, + 2266, + 7803, + 14803, + 3527, + 26593, + 14714, + 236, + 7814, + 15679, + 28668, + 2398, + 13666, + 24726, + 19769, + 23750, + 21523, + 25192, + 25551, + 5701, + 15396, + 8307, + 1871, + 25200, + 18984, + 7717, + 26553, + 5671, + 7651, + 2202, + 29690, + 4769, + 27419, + 17061, + 16401, + 5780, + 28988, + 15487, + 17745, + 4689, + 28809, + 14908, + 22476, + 15406, + 26513, + 14030, + 18156, + 21808, + 795, + 14088, + 15358, + 16901, + 17956, + 27217, + 6814, + 26807, + 4350, + 5961, + 19236, + 5813, + 17076, + 9716, + 15100, + 20160, + 9609, + 26948, + 28483, + 884, + 20658, + 13776, + 10147, + 18828, + 24285, + 25012, + 11009, + 8579, + 16941, + 8285, + 26251, + 19684, + 18253, + 27835, + 17312, + 19074, + 16817, + 20234, + 1490, + 6161, + 1864, + 14518, + 1286, + 27451, + 4617, + 28525, + 15590, + 15950, + 10724, + 26011, + 25019, + 23272, + 24935, + 27209, + 1292, + 13254, + 15299, + 20570, + 15623, + 29684, + 28579, + 16657, + 15924, + 4343, + 19578, + 21481, + 20368, + 18366, + 8375, + 24623, + 21245, + 23403, + 16770, + 20411, + 16824, + 12150, + 19919, + 22667, + 10415, + 26517, + 6711, + 17896, + 18854, + 4310, + 29512, + 19018, + 3752, + 18779, + 28965, + 25529, + 12514, + 2484, + 24720, + 26717, + 14947, + 8633, + 28851, + 16989, + 26010, + 3342, + 22242, + 28482, + 16258, + 2545, + 29480, + 16130, + 13976, + 20534, + 2133, + 48, + 17791, + 19022, + 23611, + 21983, + 7140, + 29088, + 1747, + 22022, + 4864, + 1835, + 26389, + 7992, + 24990, + 2532, + 7119, + 20438, + 25426, + 28160, + 23932, + 9605, + 29100, + 3266, + 22423, + 16043, + 9645, + 13831, + 1956, + 18192, + 23053, + 137, + 21524, + 3423, + 899, + 7480, + 16087, + 1373, + 25695, + 8825, + 8313, + 21262, + 681, + 6223, + 1944, + 29346, + 22841, + 21412, + 24877, + 17172, + 21136, + 5804, + 24453, + 23242, + 20201, + 28054, + 6079, + 4868, + 25058, + 15442, + 6037, + 29901, + 7144, + 8415, + 23918, + 14174, + 7312, + 2144, + 23883, + 20531, + 11089, + 3078, + 5416, + 19916, + 7638, + 21452, + 21304, + 3498, + 4640, + 14261, + 28242, + 28999, + 7186, + 23901, + 14188, + 14124, + 24383, + 11312, + 4995, + 17710, + 24160, + 26294, + 25232, + 12983, + 22437, + 19951, + 20127, + 6009, + 3264, + 14656, + 507, + 12902, + 14069, + 973, + 27057, + 6422, + 23788, + 7495, + 23677, + 8940, + 17868, + 11053, + 20407, + 25063, + 2625, + 8874, + 16781, + 24229, + 7552, + 3959, + 5517, + 27052, + 10293, + 4871, + 22930, + 24822, + 9418, + 25603, + 8549, + 26239, + 8576, + 28039, + 4828, + 1710, + 16201, + 12575, + 18567, + 8389, + 26974, + 13303, + 14554, + 9434, + 3390, + 12946, + 20476, + 24471, + 17169, + 3824, + 351, + 27330, + 23813, + 22891, + 2942, + 4269, + 13809, + 12368, + 10760, + 6261, + 7934, + 27178, + 24916, + 25779, + 280, + 28571, + 14211, + 20304, + 20109, + 24895, + 11580, + 26031, + 14619, + 14490, + 7987, + 18553, + 2432, + 9504, + 18883, + 3453, + 24479, + 29596, + 21018, + 28534, + 22296, + 23820, + 26124, + 25553, + 15973, + 29986, + 6394, + 8641, + 9346, + 20363, + 20170, + 27390, + 20533, + 25306, + 28179, + 25792, + 13296, + 11365, + 29540, + 1384, + 13843, + 1362, + 2233, + 5831, + 5754, + 11967, + 4531, + 29600, + 28869, + 4850, + 15301, + 9038, + 13497, + 11364, + 28618, + 21142, + 22967, + 6533, + 16517, + 8521, + 11404, + 16416, + 24153, + 519, + 13216, + 24642, + 11043, + 24337, + 14649, + 16726, + 5092, + 19617, + 750, + 23659, + 15722, + 3250, + 13000, + 25400, + 9727, + 1353, + 19084, + 6884, + 19433, + 11514, + 23331, + 16871, + 4789, + 1756, + 14351, + 20402, + 4748, + 8183, + 28622, + 8962, + 10417, + 7657, + 29708, + 19883, + 8138, + 25479, + 26053, + 23045, + 6898, + 16605, + 6951, + 25169, + 28804, + 4741, + 11538, + 16534, + 9988, + 11344, + 14729, + 5478, + 14736, + 25559, + 2885, + 15290, + 26518, + 7800, + 8156, + 5761, + 8695, + 7251, + 21083, + 2085, + 6151, + 14485, + 14933, + 26206, + 29285, + 686, + 416, + 14596, + 2141, + 10934, + 11338, + 17984, + 15808, + 18453, + 5856, + 18327, + 3890, + 13965, + 3523, + 1856, + 8780, + 9317, + 14306, + 20404, + 12189, + 10668, + 11835, + 23551, + 22293, + 29006, + 3169, + 18708, + 28162, + 25811, + 15429, + 16462, + 7580, + 2182, + 21571, + 10460, + 27455, + 24376, + 10144, + 29848, + 28090, + 274, + 20585, + 7662, + 23324, + 7650, + 22440, + 8008, + 28984, + 1280, + 25615, + 9712, + 10463, + 9079, + 28512, + 14257, + 21332, + 29070, + 16405, + 28754, + 27897, + 22083, + 4201, + 22189, + 22966, + 21727, + 2821, + 23660, + 23980, + 2049, + 4521, + 7170, + 21354, + 19505, + 9293, + 215, + 19501, + 29464, + 22701, + 15527, + 3113, + 16944, + 7109, + 21419, + 12209, + 28136, + 9412, + 17644, + 3280, + 21100, + 15103, + 12666, + 29316, + 23621, + 12797, + 16455, + 10146, + 24133, + 13584, + 112, + 9702, + 14668, + 2496, + 19240, + 12972, + 6984, + 7218, + 21981, + 21566, + 7314, + 11829, + 19651, + 15916, + 9669, + 9955, + 26445, + 4168, + 11992, + 9889, + 1345, + 14863, + 26468, + 1104, + 4407, + 5706, + 14431, + 15278, + 14761, + 25325, + 24029, + 27680, + 14369, + 1594, + 8923, + 6, + 24270, + 10264, + 25780, + 23075, + 7430, + 17513, + 29439, + 15359, + 13754, + 29037, + 20536, + 23687, + 318, + 10374, + 23958, + 20321, + 28824, + 16334, + 3679, + 23628, + 5529, + 4842, + 24228, + 685, + 20660, + 3772, + 10871, + 26635, + 22542, + 9626, + 11944, + 2907, + 28578, + 18757, + 6302, + 3675, + 21693, + 8756, + 11840, + 27078, + 27986, + 21936, + 11331, + 22013, + 16570, + 22680, + 25804, + 14682, + 16598, + 468, + 24554, + 5776, + 11709, + 18390, + 17966, + 8343, + 26073, + 7354, + 13535, + 24807, + 932, + 2016, + 10664, + 19780, + 3417, + 24649, + 10656, + 2851, + 22054, + 11355, + 25696, + 8227, + 29981, + 20142, + 14476, + 19173, + 28727, + 22107, + 24450, + 17195, + 22038, + 22923, + 5541, + 29976, + 13779, + 399, + 28490, + 1393, + 9989, + 26076, + 15626, + 21367, + 28835, + 17658, + 12007, + 22275, + 18171, + 25467, + 29342, + 1546, + 28969, + 1172, + 2559, + 7682, + 14099, + 1216, + 15400, + 14589, + 26630, + 10358, + 21555, + 23420, + 28297, + 24633, + 16345, + 24509, + 26504, + 7746, + 11860, + 11209, + 13462, + 24443, + 7257, + 27524, + 16784, + 21852, + 10977, + 11993, + 23168, + 10300, + 20264, + 23283, + 9549, + 1506, + 12305, + 5921, + 1259, + 21221, + 1551, + 9410, + 3797, + 25104, + 3370, + 21102, + 21027, + 24977, + 24958, + 352, + 16922, + 25983, + 8700, + 27388, + 19968, + 17387, + 4430, + 5528, + 8785, + 24513, + 1410, + 7884, + 7357, + 23734, + 18971, + 15125, + 707, + 17696, + 29103, + 4924, + 7595, + 26164, + 26722, + 14901, + 20637, + 3659, + 29491, + 13609, + 28815, + 11986, + 22712, + 6396, + 26485, + 21650, + 13137, + 10941, + 14949, + 5008, + 22245, + 18848, + 19705, + 20560, + 25641, + 26393, + 20991, + 11636, + 8196, + 8704, + 21653, + 970, + 23278, + 22684, + 12268, + 23447, + 8201, + 19255, + 22502, + 17216, + 22045, + 29779, + 7700, + 25137, + 17132, + 23406, + 1992, + 25121, + 4923, + 802, + 4279, + 16796, + 19278, + 22714, + 27310, + 25894, + 19859, + 16041, + 199, + 26894, + 19393, + 16667, + 16332, + 14090, + 29801, + 24108, + 14282, + 18556, + 19426, + 4071, + 18346, + 8045, + 25202, + 5176, + 28759, + 16860, + 5087, + 28547, + 23322, + 24004, + 26372, + 7444, + 6673, + 22047, + 19258, + 7407, + 5549, + 23165, + 24754, + 25672, + 22292, + 1111, + 11866, + 15993, + 14510, + 23097, + 18391, + 1261, + 226, + 18809, + 13591, + 3438, + 18353, + 5880, + 13032, + 10858, + 10988, + 26025, + 6202, + 28861, + 25166, + 8382, + 24343, + 26701, + 5054, + 8397, + 24416, + 18813, + 1778, + 19087, + 3602, + 18407, + 21615, + 26883, + 2377, + 21089, + 11304, + 6802, + 22981, + 19132, + 17220, + 4564, + 15792, + 26002, + 9930, + 2755, + 397, + 25632, + 18794, + 18689, + 29366, + 18367, + 18549, + 29772, + 28629, + 19405, + 12768, + 20065, + 798, + 3591, + 22175, + 10136, + 24189, + 8191, + 14719, + 22129, + 27640, + 16543, + 26414, + 12863, + 14532, + 15200, + 19644, + 3412, + 26208, + 18179, + 6576, + 5322, + 16219, + 25905, + 19923, + 3532, + 23648, + 21392, + 9981, + 19977, + 27980, + 6144, + 23313, + 8868, + 6465, + 3624, + 195, + 1084, + 24440, + 25733, + 20023, + 10670, + 3912, + 21528, + 5686, + 20917, + 28004, + 23299, + 4235, + 19633, + 25975, + 28125, + 18444, + 23839, + 17656, + 14422, + 22526, + 21999, + 29949, + 29275, + 23437, + 1144, + 24670, + 415, + 12827, + 25924, + 8559, + 18090, + 21223, + 9778, + 25524, + 5854, + 3191, + 12390, + 15488, + 16477, + 17706, + 15089, + 9092, + 12188, + 3714, + 18276, + 15385, + 21312, + 7279, + 28717, + 26745, + 23784, + 9550, + 3464, + 16344, + 17667, + 19568, + 23440, + 5964, + 17801, + 10066, + 29675, + 10347, + 16663, + 9620, + 18032, + 18786, + 1544, + 4722, + 17756, + 23954, + 1527, + 20894, + 26895, + 6024, + 10342, + 7802, + 27766, + 3208, + 17071, + 18575, + 4417, + 526, + 15693, + 17767, + 17009, + 23214, + 7603, + 18839, + 3220, + 19381, + 19027, + 10574, + 1425, + 4170, + 8657, + 11911, + 9244, + 17695, + 9855, + 1396, + 9836, + 8697, + 29936, + 3246, + 13929, + 7766, + 7683, + 27742, + 9407, + 24892, + 23617, + 10462, + 13639, + 5966, + 6785, + 20861, + 12182, + 9607, + 24105, + 8039, + 21090, + 22093, + 18437, + 4270, + 18743, + 29632, + 13758, + 23914, + 18907, + 13287, + 14151, + 3915, + 13603, + 16875, + 5006, + 15660, + 8921, + 5313, + 25389, + 5851, + 6805, + 24311, + 5180, + 922, + 626, + 11076, + 29559, + 2301, + 6247, + 26827, + 1449, + 19206, + 4654, + 3939, + 1661, + 8553, + 25419, + 13394, + 24497, + 14543, + 16123, + 3878, + 5672, + 25563, + 9306, + 22214, + 20610, + 18544, + 26319, + 6458, + 3016, + 14155, + 1983, + 2785, + 21694, + 15499, + 28703, + 1591, + 8807, + 152, + 15705, + 26216, + 22643, + 15805, + 1459, + 3963, + 27799, + 22707, + 14830, + 18395, + 5244, + 3009, + 25008, + 19806, + 10482, + 7931, + 5944, + 15723, + 10373, + 16831, + 23175, + 7123, + 8726, + 9687, + 22231, + 5075, + 1771, + 26138, + 26199, + 11008, + 7269, + 29967, + 7145, + 13452, + 20006, + 25487, + 991, + 7940, + 11919, + 17653, + 12884, + 11158, + 15141, + 26490, + 11846, + 6542, + 3693, + 21439, + 12223, + 1012, + 22310, + 22969, + 6391, + 15503, + 15113, + 6997, + 16136, + 26674, + 5869, + 21629, + 19529, + 933, + 5658, + 28088, + 26911, + 12733, + 16410, + 10709, + 8237, + 27856, + 12205, + 22344, + 13682, + 3071, + 22533, + 19649, + 18920, + 18177, + 16018, + 5217, + 4625, + 21903, + 15032, + 18132, + 25633, + 10922, + 23618, + 12282, + 21771, + 12531, + 18498, + 20767, + 6166, + 10212, + 20231, + 11313, + 24981, + 28507, + 6740, + 20337, + 16346, + 12658, + 16313, + 11447, + 23803, + 17323, + 2427, + 20942, + 10069, + 5374, + 19219, + 27754, + 1837, + 11285, + 21631, + 27620, + 19820, + 9439, + 2557, + 5056, + 57, + 23963, + 27383, + 19459, + 28452, + 25546, + 19952, + 7254, + 13985, + 19456, + 29223, + 27226, + 7400, + 10553, + 28148, + 614, + 16197, + 7389, + 5222, + 12121, + 27522, + 98, + 5997, + 6677, + 5737, + 28501, + 11122, + 13103, + 4929, + 24874, + 13978, + 12751, + 29350, + 27351, + 15408, + 20855, + 24787, + 10848, + 9545, + 19981, + 18586, + 6692, + 2115, + 9997, + 27223, + 861, + 7376, + 12642, + 7222, + 5821, + 5834, + 12262, + 17196, + 19499, + 10881, + 151, + 14951, + 9448, + 15327, + 1639, + 12711, + 16343, + 8953, + 21410, + 14024, + 1470, + 16924, + 24577, + 24087, + 25450, + 20986, + 6249, + 25205, + 5324, + 24070, + 5994, + 8250, + 14026, + 5074, + 7378, + 27705, + 28120, + 11367, + 8534, + 26929, + 14044, + 15542, + 23248, + 20795, + 16549, + 4853, + 15160, + 1653, + 2272, + 23952, + 6681, + 12060, + 21772, + 3225, + 1139, + 3374, + 18096, + 29396, + 4160, + 12312, + 15067, + 13445, + 134, + 19882, + 2424, + 14894, + 21754, + 2641, + 9942, + 17283, + 1853, + 2211, + 29797, + 13255, + 15344, + 2627, + 117, + 28888, + 4079, + 1421, + 11620, + 8336, + 8796, + 7555, + 247, + 23917, + 27700, + 29825, + 23309, + 9444, + 9411, + 16134, + 15293, + 23588, + 10185, + 21516, + 25015, + 26368, + 5162, + 7188, + 28070, + 15800, + 20810, + 5042, + 1991, + 5461, + 1816, + 3907, + 18075, + 9623, + 7083, + 9663, + 6220, + 11744, + 26140, + 437, + 14316, + 6501, + 25294, + 5252, + 26884, + 7457, + 17091, + 28891, + 2373, + 20403, + 21530, + 19873, + 18470, + 29816, + 22456, + 4325, + 9453, + 26535, + 8353, + 4704, + 7734, + 4084, + 5594, + 10827, + 12120, + 2126, + 29209, + 24092, + 13289, + 29625, + 687, + 11064, + 14060, + 9109, + 8416, + 21568, + 21725, + 4839, + 5788, + 16675, + 8737, + 13005, + 14159, + 5797, + 1306, + 529, + 24356, + 24378, + 19717, + 14498, + 14265, + 5432, + 21930, + 11314, + 3607, + 1037, + 1428, + 26240, + 13367, + 19910, + 20165, + 12703, + 14568, + 2956, + 29689, + 5261, + 25738, + 26179, + 19536, + 3521, + 28234, + 4684, + 14693, + 5578, + 15172, + 17687, + 26985, + 1999, + 16815, + 9742, + 19850, + 1731, + 6771, + 28620, + 16699, + 15189, + 11258, + 20288, + 7515, + 8351, + 27578, + 13722, + 11852, + 18632, + 13398, + 24292, + 294, + 5200, + 26269, + 24815, + 16685, + 1485, + 9619, + 23520, + 1297, + 17426, + 13761, + 11383, + 24328, + 1705, + 5938, + 6967, + 7831, + 17603, + 2893, + 11334, + 28052, + 28324, + 9992, + 7321, + 851, + 20003, + 15062, + 23431, + 28776, + 17210, + 16971, + 19530, + 19209, + 24673, + 18775, + 12458, + 2009, + 14997, + 4238, + 12014, + 12478, + 11766, + 2565, + 22169, + 11867, + 11322, + 26573, + 12170, + 21688, + 23747, + 16755, + 4200, + 319, + 10974, + 24438, + 20898, + 11692, + 25669, + 1674, + 9971, + 3039, + 14268, + 19108, + 1090, + 26809, + 8443, + 14477, + 14878, + 19269, + 24793, + 5290, + 12977, + 15175, + 22644, + 1971, + 5395, + 24707, + 8467, + 29859, + 10003, + 12246, + 13628, + 24209, + 10952, + 10792, + 20811, + 3424, + 17073, + 17427, + 9242, + 2809, + 649, + 5084, + 17705, + 24909, + 10608, + 14197, + 4121, + 22606, + 10328, + 4324, + 2099, + 9187, + 7228, + 17865, + 24054, + 12428, + 8719, + 14162, + 1720, + 24364, + 9228, + 12381, + 10421, + 26955, + 12916, + 11503, + 5636, + 22994, + 28524, + 24561, + 24984, + 5336, + 13380, + 29280, + 25644, + 28687, + 15896, + 11519, + 10924, + 3804, + 27385, + 8898, + 21697, + 22362, + 13231, + 13383, + 185, + 27235, + 19778, + 14194, + 12143, + 9490, + 18161, + 23974, + 24741, + 20277, + 29358, + 8901, + 11133, + 9263, + 25242, + 21647, + 7998, + 20415, + 2760, + 27148, + 29748, + 26521, + 1253, + 23486, + 19848, + 17190, + 13580, + 1072, + 3050, + 11591, + 7748, + 21172, + 22520, + 25985, + 11223, + 21462, + 9675, + 1097, + 11862, + 21589, + 19535, + 14602, + 24866, + 16005, + 18576, + 8600, + 11324, + 9973, + 17442, + 24827, + 11912, + 13841, + 15094, + 17081, + 22699, + 21584, + 26480, + 19703, + 16905, + 28150, + 18223, + 28426, + 23931, + 5052, + 8834, + 15305, + 5269, + 11820, + 16289, + 4667, + 27937, + 2560, + 29694, + 8729, + 7658, + 3135, + 26663, + 16389, + 15995, + 23844, + 9108, + 20137, + 26129, + 13928, + 21545, + 13110, + 28832, + 23564, + 26707, + 1847, + 6190, + 15225, + 25933, + 7296, + 17359, + 12675, + 9173, + 11638, + 27827, + 5811, + 10498, + 11060, + 28502, + 29018, + 21298, + 13018, + 24, + 11924, + 12556, + 5543, + 4301, + 11359, + 26901, + 29048, + 6617, + 10630, + 23353, + 15519, + 6359, + 4320, + 419, + 2685, + 25158, + 16445, + 22046, + 10028, + 11302, + 16209, + 17913, + 2348, + 28907, + 15605, + 22106, + 2370, + 24151, + 24017, + 16096, + 26869, + 5817, + 20050, + 17301, + 18826, + 25929, + 3755, + 13807, + 10060, + 29195, + 28582, + 9741, + 25457, + 19146, + 8992, + 25445, + 29141, + 13724, + 6230, + 15630, + 715, + 19414, + 7323, + 20002, + 2935, + 27265, + 5577, + 18262, + 1008, + 19588, + 16099, + 20884, + 26418, + 11094, + 7492, + 17911, + 26012, + 4736, + 21013, + 2227, + 25052, + 19862, + 19035, + 19419, + 19971, + 1231, + 1150, + 834, + 3531, + 27996, + 9503, + 4674, + 25701, + 27483, + 10678, + 24746, + 26157, + 6996, + 587, + 17166, + 18320, + 21238, + 23814, + 534, + 16886, + 15732, + 17832, + 11074, + 6480, + 2140, + 26612, + 24501, + 10111, + 13949, + 22727, + 13465, + 18891, + 23935, + 11666, + 7560, + 11556, + 855, + 1620, + 8369, + 23465, + 22439, + 18685, + 10457, + 29818, + 19760, + 27763, + 3204, + 7618, + 13683, + 8001, + 26508, + 10811, + 18815, + 14976, + 21186, + 10563, + 28322, + 27512, + 246, + 12557, + 5191, + 26861, + 18043, + 1170, + 10606, + 5130, + 27137, + 12875, + 22836, + 20927, + 1908, + 18881, + 13173, + 29619, + 1583, + 13627, + 1041, + 4089, + 19932, + 12894, + 27727, + 29489, + 8624, + 2135, + 22646, + 2379, + 17994, + 20879, + 5375, + 25749, + 6889, + 13697, + 7007, + 20303, + 26821, + 8638, + 20584, + 19940, + 11167, + 29631, + 25956, + 7919, + 7416, + 21905, + 18227, + 21641, + 18309, + 11231, + 14482, + 4285, + 9344, + 11115, + 4284, + 23269, + 26127, + 4004, + 7004, + 6300, + 4874, + 9225, + 9215, + 2948, + 9340, + 28131, + 18388, + 7434, + 18133, + 14942, + 8478, + 17339, + 20845, + 22818, + 7183, + 27252, + 11444, + 25381, + 6808, + 23459, + 16486, + 15493, + 29187, + 22104, + 18985, + 1359, + 10083, + 9690, + 6662, + 14629, + 20183, + 24797, + 12015, + 17604, + 25800, + 27844, + 18063, + 25675, + 645, + 7689, + 9438, + 27921, + 23561, + 2463, + 3979, + 10692, + 13982, + 2778, + 1174, + 2134, + 22454, + 29080, + 1668, + 14084, + 9859, + 5206, + 22034, + 22090, + 7621, + 26307, + 6219, + 25456, + 25962, + 24172, + 15600, + 14899, + 22017, + 25555, + 15669, + 24437, + 9366, + 28427, + 16887, + 20973, + 10494, + 5320, + 9035, + 8006, + 16603, + 25247, + 18383, + 205, + 12985, + 23675, + 2874, + 5996, + 29054, + 10645, + 1495, + 10929, + 1728, + 17822, + 8995, + 12655, + 19139, + 24507, + 4620, + 12421, + 28895, + 4636, + 21951, + 13183, + 15978, + 20832, + 9156, + 14782, + 11929, + 25161, + 23052, + 16829, + 14201, + 8087, + 27141, + 371, + 7903, + 22679, + 22470, + 27838, + 14207, + 19953, + 831, + 4972, + 2533, + 22187, + 10303, + 2452, + 22897, + 14926, + 901, + 25379, + 21826, + 13387, + 7757, + 29308, + 19013, + 27102, + 19331, + 14829, + 6467, + 29247, + 14392, + 22996, + 19402, + 13514, + 25965, + 27318, + 16481, + 17996, + 7517, + 7824, + 22838, + 23083, + 20025, + 8251, + 7104, + 19779, + 4726, + 12528, + 8292, + 27761, + 12495, + 23826, + 797, + 1613, + 28404, + 26598, + 2434, + 22785, + 996, + 16017, + 23744, + 19348, + 14389, + 12992, + 27334, + 4945, + 26863, + 3072, + 12372, + 9166, + 22158, + 1205, + 21187, + 21414, + 10073, + 10217, + 12988, + 25747, + 1483, + 9824, + 1548, + 27091, + 13440, + 16933, + 17605, + 18845, + 2257, + 9514, + 2932, + 5917, + 11099, + 16116, + 20024, + 23025, + 24768, + 22268, + 9631, + 3656, + 6417, + 4680, + 4021, + 9000, + 14795, + 8750, + 11107, + 21229, + 27968, + 14142, + 22163, + 5444, + 16857, + 6268, + 7209, + 20926, + 5933, + 16211, + 14890, + 28626, + 22584, + 19170, + 1364, + 7722, + 25349, + 11526, + 9180, + 28627, + 8976, + 7213, + 24223, + 8451, + 8917, + 5679, + 16002, + 2621, + 8855, + 14463, + 4761, + 6416, + 11698, + 5358, + 28682, + 18111, + 2877, + 10814, + 20812, + 19899, + 19745, + 23352, + 14677, + 11149, + 18572, + 27021, + 19515, + 16751, + 8649, + 12785, + 21522, + 2910, + 4386, + 21818, + 4254, + 2210, + 2260, + 18968, + 27656, + 28605, + 2371, + 26891, + 27922, + 20066, + 17972, + 3179, + 8890, + 23818, + 11528, + 21447, + 21616, + 11975, + 29473, + 13842, + 9013, + 10049, + 24006, + 12652, + 18610, + 13500, + 27450, + 5955, + 12638, + 7548, + 10164, + 17086, + 11917, + 1300, + 26915, + 29609, + 20790, + 3579, + 12673, + 13115, + 28566, + 17358, + 29685, + 23645, + 26358, + 16442, + 9941, + 1769, + 17294, + 2129, + 5748, + 13561, + 14150, + 2704, + 19724, + 23667, + 8105, + 7646, + 20819, + 26255, + 5800, + 4735, + 29594, + 12961, + 13496, + 22618, + 29841, + 9119, + 14138, + 15625, + 9932, + 15027, + 14403, + 26622, + 10442, + 19594, + 22028, + 17305, + 25264, + 9083, + 18560, + 16402, + 6283, + 18574, + 18629, + 9240, + 3334, + 16089, + 8885, + 28612, + 22472, + 13081, + 9599, + 17805, + 562, + 5323, + 26613, + 9080, + 20115, + 25375, + 5027, + 5877, + 16943, + 24494, + 3614, + 27525, + 3794, + 28130, + 12660, + 28873, + 9473, + 11606, + 25189, + 10831, + 16867, + 14877, + 6685, + 6628, + 9956, + 21336, + 6829, + 147, + 24532, + 25564, + 21652, + 20562, + 15273, + 6548, + 28644, + 15974, + 14796, + 17163, + 14605, + 6286, + 25832, + 25601, + 15057, + 25241, + 15308, + 9923, + 12122, + 10398, + 16375, + 24978, + 27285, + 11954, + 1134, + 25196, + 5750, + 17804, + 25402, + 22103, + 26935, + 6983, + 13515, + 23135, + 9481, + 24412, + 83, + 19731, + 8118, + 25162, + 7855, + 26862, + 17560, + 24200, + 1619, + 19687, + 24492, + 5611, + 27747, + 3512, + 20469, + 15751, + 15242, + 345, + 19791, + 8717, + 25510, + 8127, + 4899, + 27417, + 10249, + 8100, + 11686, + 24442, + 3178, + 16808, + 20830, + 4302, + 8261, + 28067, + 26958, + 376, + 29443, + 27299, + 13322, + 20375, + 20961, + 8447, + 5007, + 10226, + 5498, + 10578, + 20421, + 22120, + 9769, + 9084, + 29106, + 5649, + 12586, + 5925, + 22170, + 28434, + 16930, + 29643, + 27048, + 15606, + 25582, + 28742, + 8483, + 11549, + 10194, + 18512, + 2648, + 638, + 12431, + 14791, + 13798, + 17906, + 1004, + 12796, + 12377, + 8212, + 10153, + 3694, + 442, + 11974, + 6245, + 8781, + 18630, + 28281, + 15513, + 18048, + 6583, + 29019, + 10794, + 17203, + 610, + 23358, + 21374, + 24915, + 15707, + 1339, + 5773, + 6728, + 8588, + 13045, + 21947, + 8811, + 10323, + 25488, + 10745, + 15930, + 3699, + 26563, + 18636, + 8012, + 28830, + 2569, + 7020, + 12708, + 28640, + 5240, + 16335, + 22920, + 1302, + 29937, + 1857, + 26188, + 27437, + 29160, + 6801, + 17593, + 4239, + 9985, + 4757, + 16677, + 19147, + 14000, + 2355, + 8359, + 3249, + 17772, + 7295, + 8477, + 7777, + 5545, + 24013, + 29879, + 22138, + 11641, + 2992, + 7420, + 8889, + 7333, + 29298, + 978, + 23058, + 11956, + 6525, + 19795, + 2861, + 11466, + 12128, + 19156, + 25754, + 19647, + 661, + 16809, + 2801, + 3649, + 4101, + 16816, + 8655, + 11661, + 5763, + 21913, + 15955, + 7379, + 18729, + 1068, + 869, + 18552, + 23065, + 9901, + 3022, + 28515, + 18382, + 21120, + 6169, + 2800, + 11780, + 11173, + 282, + 16940, + 14547, + 15208, + 4875, + 29502, + 9847, + 2944, + 14363, + 11299, + 15110, + 21877, + 9581, + 13370, + 20232, + 22265, + 3664, + 6369, + 24652, + 4808, + 19332, + 28473, + 8770, + 9516, + 7616, + 655, + 21525, + 29706, + 10490, + 15664, + 1266, + 20463, + 8593, + 29756, + 5595, + 5632, + 8255, + 2941, + 2446, + 8882, + 21081, + 15569, + 22615, + 18959, + 19420, + 26684, + 22530, + 21365, + 26755, + 3082, + 16890, + 24803, + 27923, + 9810, + 1001, + 8690, + 5898, + 16184, + 3254, + 10105, + 7508, + 28993, + 28347, + 7135, + 8053, + 14965, + 1770, + 18194, + 27909, + 8604, + 26959, + 16208, + 15045, + 7990, + 10541, + 26941, + 569, + 21711, + 27481, + 4663, + 19750, + 19089, + 4695, + 21270, + 5385, + 1515, + 10800, + 4081, + 27435, + 23525, + 859, + 4655, + 21811, + 13112, + 5016, + 23448, + 21504, + 5799, + 7533, + 19752, + 28597, + 1075, + 4700, + 23241, + 19424, + 19145, + 17179, + 4007, + 23940, + 24345, + 18399, + 6718, + 5161, + 26332, + 13602, + 3161, + 1949, + 23490, + 3017, + 4223, + 25838, + 28413, + 21226, + 5262, + 12925, + 208, + 12943, + 12842, + 8899, + 14939, + 26493, + 12873, + 16687, + 11297, + 18106, + 12525, + 21986, + 6306, + 27699, + 28651, + 14721, + 1361, + 6968, + 5674, + 17528, + 408, + 6407, + 520, + 1395, + 379, + 17192, + 21671, + 7736, + 28970, + 22061, + 27222, + 20228, + 16304, + 14867, + 26977, + 12279, + 26470, + 25076, + 12467, + 5299, + 17503, + 6806, + 6901, + 23614, + 9569, + 27675, + 16532, + 25246, + 27238, + 6766, + 24039, + 15288, + 28038, + 21271, + 762, + 23877, + 15754, + 19257, + 2143, + 23927, + 13862, + 3356, + 2261, + 21722, + 19413, + 1222, + 5178, + 3287, + 19117, + 443, + 21857, + 10872, + 1274, + 2441, + 11805, + 3138, + 2181, + 5768, + 20510, + 22219, + 677, + 15170, + 18483, + 13699, + 20807, + 15883, + 10420, + 27526, + 13190, + 8705, + 2613, + 27187, + 25497, + 7339, + 17069, + 7983, + 18242, + 8047, + 2768, + 8794, + 3789, + 20281, + 10059, + 13990, + 24729, + 18516, + 20121, + 13240, + 16706, + 2938, + 10613, + 2810, + 10700, + 28799, + 21161, + 19050, + 21819, + 22793, + 26594, + 11633, + 2209, + 14966, + 12882, + 22637, + 1310, + 10113, + 25613, + 23811, + 20793, + 29364, + 19214, + 224, + 21840, + 14555, + 6442, + 13600, + 26637, + 3127, + 10861, + 5293, + 1427, + 6640, + 28362, + 21244, + 11140, + 10908, + 18471, + 17590, + 10067, + 12692, + 775, + 9925, + 13133, + 18446, + 8262, + 19508, + 27792, + 21674, + 19513, + 10262, + 11153, + 6536, + 7210, + 18126, + 27454, + 11453, + 14304, + 17376, + 19281, + 18283, + 27311, + 7692, + 11282, + 2036, + 24314, + 5202, + 20968, + 26249, + 4883, + 12117, + 3657, + 2912, + 10816, + 7036, + 13911, + 7703, + 26077, + 29751, + 16888, + 6956, + 24394, + 12932, + 489, + 12198, + 16769, + 14076, + 26195, + 13091, + 20084, + 11961, + 27142, + 22522, + 11771, + 23290, + 16276, + 15612, + 22182, + 20524, + 11752, + 24837, + 4762, + 24899, + 12814, + 3640, + 24446, + 25091, + 17665, + 6370, + 4295, + 4106, + 11448, + 7554, + 25326, + 6545, + 14986, + 23898, + 18344, + 12380, + 12297, + 16839, + 1965, + 17742, + 20522, + 17168, + 8712, + 5907, + 14442, + 3566, + 13212, + 3651, + 15006, + 6398, + 14125, + 6517, + 1327, + 28740, + 8609, + 11788, + 21220, + 22999, + 1776, + 14574, + 28277, + 9414, + 10081, + 23014, + 28563, + 19097, + 3517, + 13147, + 2855, + 25516, + 13622, + 3450, + 23560, + 24843, + 11253, + 26448, + 27049, + 15948, + 26333, + 18986, + 23376, + 24065, + 11869, + 6173, + 21369, + 9683, + 26061, + 3616, + 1632, + 68, + 28946, + 19655, + 24465, + 12064, + 9259, + 26917, + 23360, + 20636, + 28911, + 4379, + 12566, + 3792, + 7984, + 10236, + 612, + 18202, + 14046, + 29616, + 3595, + 20182, + 12399, + 2889, + 18234, + 19357, + 20351, + 21570, + 26273, + 24239, + 21812, + 4881, + 20446, + 29522, + 6944, + 26176, + 17392, + 689, + 26051, + 10765, + 28814, + 28877, + 1697, + 18879, + 9582, + 11523, + 26497, + 102, + 3376, + 15817, + 27191, + 990, + 11459, + 18820, + 24686, + 6221, + 5264, + 22200, + 10057, + 21590, + 17554, + 11722, + 29605, + 6760, + 27371, + 9302, + 7340, + 25440, + 27117, + 6120, + 22053, + 23698, + 8367, + 21803, + 1644, + 13262, + 8144, + 11645, + 155, + 13783, + 20364, + 24876, + 28247, + 13539, + 10197, + 17737, + 23855, + 14240, + 14905, + 29235, + 26019, + 14095, + 22748, + 368, + 19729, + 5576, + 5143, + 12148, + 23945, + 22094, + 1397, + 7695, + 29950, + 2155, + 10313, + 14715, + 140, + 9205, + 7889, + 21275, + 258, + 24857, + 193, + 27509, + 343, + 16369, + 10661, + 1217, + 27014, + 23815, + 10145, + 15052, + 9764, + 1440, + 9522, + 9446, + 2792, + 10981, + 4243, + 17432, + 5327, + 28949, + 3422, + 1293, + 9496, + 9373, + 29598, + 26191, + 25434, + 21974, + 7460, + 17637, + 1872, + 13493, + 25483, + 18020, + 16414, + 1916, + 19887, + 10127, + 8775, + 12761, + 21430, + 6097, + 23550, + 16166, + 17819, + 18605, + 28457, + 4527, + 14700, + 25651, + 22983, + 5642, + 7231, + 10304, + 27087, + 11734, + 11778, + 28768, + 26329, + 21263, + 18368, + 2519, + 18601, + 8763, + 7425, + 6208, + 28569, + 10325, + 4967, + 2486, + 22455, + 14600, + 18450, + 15078, + 19599, + 27639, + 27848, + 21170, + 13168, + 4580, + 23666, + 11085, + 27249, + 7232, + 4932, + 20110, + 3671, + 23359, + 17137, + 6832, + 18978, + 14459, + 29233, + 10672, + 17218, + 107, + 7473, + 8760, + 24912, + 12052, + 20444, + 27281, + 5561, + 9682, + 26141, + 6750, + 13711, + 16636, + 18428, + 15058, + 12609, + 8172, + 392, + 14120, + 5474, + 7178, + 14328, + 8260, + 25183, + 25406, + 14262, + 19395, + 20388, + 8612, + 28756, + 20615, + 15887, + 8674, + 4080, + 16121, + 4161, + 18529, + 24687, + 9521, + 17268, + 9153, + 2318, + 315, + 25897, + 15544, + 16956, + 9369, + 26425, + 11748, + 27425, + 29862, + 16029, + 8205, + 9909, + 25920, + 2552, + 8524, + 1825, + 16164, + 15649, + 5615, + 28956, + 15389, + 18547, + 19783, + 5080, + 3004, + 29297, + 22365, + 1276, + 13714, + 22346, + 10499, + 3311, + 24902, + 18363, + 29143, + 27007, + 8376, + 12420, + 14317, + 25304, + 12159, + 12329, + 27875, + 29264, + 23763, + 7893, + 26326, + 11051, + 15807, + 9896, + 25988, + 11464, + 6336, + 15269, + 28960, + 3571, + 19293, + 19983, + 24303, + 4188, + 12841, + 24252, + 28006, + 19465, + 6382, + 29815, + 17041, + 16022, + 14452, + 3925, + 27075, + 13835, + 11542, + 1328, + 28448, + 15763, + 18619, + 21178, + 5967, + 23215, + 19597, + 1874, + 25869, + 25275, + 15021, + 15830, + 19470, + 2860, + 17161, + 20194, + 18378, + 13311, + 24500, + 22955, + 6463, + 5050, + 25110, + 5049, + 22130, + 28701, + 4221, + 28468, + 591, + 29217, + 7812, + 16624, + 25870, + 28209, + 11807, + 25677, + 16536, + 1651, + 5828, + 18803, + 16837, + 8758, + 5496, + 23079, + 11421, + 5281, + 22086, + 6680, + 26300, + 13127, + 11555, + 26822, + 13804, + 20471, + 2365, + 19007, + 10430, + 27670, + 16126, + 27083, + 2360, + 9553, + 24950, + 22619, + 1141, + 17206, + 17611, + 24889, + 28292, + 2369, + 10907, + 7838, + 6895, + 22399, + 2688, + 13551, + 10382, + 7887, + 15034, + 5231, + 7043, + 5575, + 20983, + 27704, + 15120, + 17875, + 5915, + 20062, + 18961, + 29178, + 16159, + 21293, + 21396, + 10888, + 17167, + 6696, + 11962, + 14812, + 24257, + 18102, + 17308, + 7069, + 22809, + 22195, + 17547, + 21973, + 29999, + 4307, + 8320, + 2891, + 17794, + 23090, + 17952, + 15306, + 20759, + 5071, + 7448, + 8696, + 12133, + 28202, + 22332, + 26597, + 20332, + 8283, + 967, + 18466, + 9833, + 1366, + 6605, + 6004, + 7788, + 18438, + 27377, + 28489, + 12866, + 6844, + 21311, + 28538, + 10740, + 1434, + 24858, + 21963, + 11397, + 22201, + 27979, + 18136, + 9011, + 20204, + 20586, + 26013, + 5131, + 262, + 9099, + 16978, + 17271, + 13203, + 20581, + 5209, + 2276, + 20825, + 4225, + 28456, + 15332, + 17899, + 19658, + 20049, + 27156, + 18350, + 20872, + 18524, + 3650, + 18097, + 21979, + 10925, + 18420, + 1734, + 20094, + 23387, + 6566, + 25165, + 6531, + 1897, + 26582, + 14781, + 27232, + 29250, + 10575, + 342, + 6940, + 19607, + 18100, + 16249, + 14004, + 7775, + 881, + 13049, + 10156, + 18933, + 28950, + 16010, + 24168, + 12901, + 27661, + 16968, + 968, + 23647, + 14258, + 11157, + 18381, + 24999, + 14081, + 15410, + 6887, + 18175, + 3352, + 7981, + 13273, + 25966, + 26801, + 3612, + 3625, + 2587, + 28721, + 20345, + 15439, + 5515, + 26912, + 3205, + 2493, + 22742, + 16004, + 2556, + 27459, + 8215, + 11144, + 11002, + 5896, + 20929, + 2906, + 19233, + 29207, + 450, + 19946, + 22415, + 4523, + 5344, + 4209, + 28155, + 18109, + 5714, + 12854, + 20611, + 9648, + 21994, + 26503, + 25626, + 2709, + 28337, + 11256, + 16847, + 12545, + 5840, + 23127, + 6235, + 15620, + 5019, + 3796, + 25327, + 13821, + 11567, + 27362, + 18025, + 12168, + 21046, + 26921, + 5756, + 6022, + 21540, + 21945, + 10671, + 8043, + 15844, + 13182, + 1039, + 16768, + 16438, + 14250, + 6060, + 7694, + 7062, + 1701, + 1534, + 10238, + 23736, + 23997, + 14381, + 28863, + 26998, + 24722, + 3230, + 19288, + 21872, + 6340, + 7816, + 13686, + 870, + 21514, + 12361, + 12927, + 13543, + 9804, + 19906, + 5482, + 21460, + 17623, + 22745, + 22623, + 11757, + 22177, + 17314, + 25431, + 21587, + 1782, + 13245, + 10619, + 15607, + 29975, + 658, + 21437, + 20299, + 10733, + 26080, + 23809, + 24490, + 29964, + 20268, + 25840, + 20484, + 13769, + 23596, + 1621, + 18805, + 4187, + 23133, + 29839, + 11755, + 18281, + 6704, + 11432, + 15632, + 16347, + 25413, + 25798, + 744, + 22139, + 7157, + 26569, + 24812, + 24079, + 7512, + 55, + 18931, + 28286, + 550, + 5802, + 29814, + 26185, + 10370, + 24455, + 25661, + 2510, + 24506, + 11697, + 2194, + 24606, + 11456, + 15336, + 24538, + 24122, + 25222, + 24666, + 24131, + 5396, + 25503, + 16000, + 3594, + 15954, + 17254, + 24300, + 28974, + 8529, + 15573, + 25575, + 25842, + 7342, + 7097, + 5233, + 25650, + 20543, + 2428, + 5134, + 28475, + 19596, + 29691, + 25773, + 11374, + 23492, + 14457, + 26736, + 19627, + 10410, + 10622, + 27625, + 22489, + 1758, + 22490, + 13908, + 23678, + 8193, + 25973, + 16461, + 17470, + 23783, + 5194, + 21418, + 17302, + 13846, + 20682, + 21149, + 20822, + 19852, + 1262, + 24202, + 7532, + 20179, + 4717, + 28784, + 13021, + 11990, + 29086, + 24355, + 9055, + 15071, + 20245, + 21031, + 28671, + 6799, + 432, + 4076, + 4718, + 17941, + 12426, + 8577, + 568, + 1474, + 29591, + 9097, + 26596, + 17721, + 20969, + 4917, + 10896, + 21909, + 9113, + 2684, + 3841, + 24773, + 18099, + 8157, + 10135, + 21728, + 3856, + 21355, + 27994, + 22734, + 12366, + 6065, + 19577, + 17769, + 28224, + 22806, + 20031, + 27622, + 14816, + 3386, + 16037, + 26430, + 25681, + 18218, + 27201, + 7211, + 11626, + 12501, + 15686, + 3627, + 9650, + 11200, + 15463, + 28611, + 7714, + 25148, + 7530, + 8308, + 11505, + 20704, + 18715, + 21961, + 25279, + 1657, + 7392, + 9466, + 29658, + 4970, + 9395, + 14730, + 23541, + 19264, + 941, + 11013, + 18710, + 25726, + 19762, + 17152, + 26880, + 14859, + 21617, + 22043, + 1148, + 26130, + 9219, + 25237, + 1095, + 26705, + 8258, + 6700, + 8504, + 4803, + 13674, + 11588, + 28458, + 23576, + 10314, + 2410, + 13935, + 27692, + 14367, + 9486, + 13044, + 10483, + 20146, + 11295, + 9993, + 14131, + 1824, + 6969, + 15158, + 8176, + 628, + 29053, + 12548, + 24945, + 8328, + 5859, + 20399, + 13395, + 3199, + 19517, + 12076, + 10845, + 17185, + 5710, + 629, + 2110, + 3787, + 19177, + 24965, + 23176, + 18131, + 19827, + 10375, + 14301, + 13901, + 21546, + 3780, + 18772, + 7845, + 5684, + 27287, + 12457, + 6273, + 10309, + 14067, + 17633, + 11728, + 10034, + 8647, + 6412, + 27301, + 13223, + 29356, + 24038, + 17449, + 24264, + 26245, + 21420, + 14772, + 13802, + 6553, + 17830, + 16206, + 13612, + 7730, + 8486, + 7151, + 4382, + 4127, + 24368, + 12027, + 11279, + 5777, + 8680, + 19210, + 328, + 5028, + 20943, + 5446, + 1401, + 27132, + 11544, + 27434, + 6044, + 12175, + 7978, + 11560, + 12254, + 28576, + 19321, + 25718, + 14365, + 9401, + 1683, + 21866, + 28015, + 2499, + 27272, + 2139, + 11963, + 12668, + 2818, + 6082, + 25362, + 22890, + 20187, + 22885, + 12040, + 16975, + 28664, + 12601, + 5225, + 21558, + 12617, + 19002, + 5132, + 8149, + 15699, + 18645, + 28767, + 15261, + 3129, + 4040, + 28633, + 1877, + 14935, + 14563, + 12886, + 15748, + 7147, + 5160, + 26875, + 4666, + 6257, + 8324, + 111, + 4569, + 7369, + 9797, + 24048, + 18662, + 6068, + 10466, + 27613, + 2989, + 6817, + 5990, + 21108, + 11059, + 21138, + 18884, + 25253, + 7589, + 5720, + 17682, + 13027, + 26623, + 13685, + 21854, + 10137, + 1656, + 22258, + 19767, + 17624, + 3894, + 26432, + 29194, + 26678, + 1569, + 18754, + 17523, + 12313, + 1833, + 5593, + 9882, + 14876, + 19318, + 23767, + 5931, + 5460, + 29705, + 8297, + 7988, + 25221, + 3372, + 18943, + 5420, + 1334, + 5245, + 635, + 29983, + 3811, + 9096, + 24148, + 22229, + 785, + 21358, + 9877, + 27731, + 18704, + 29533, + 22913, + 7835, + 4500, + 6702, + 12687, + 24430, + 10933, + 28893, + 18061, + 13318, + 19554, + 9822, + 7207, + 28488, + 15064, + 28528, + 20826, + 24994, + 20537, + 22904, + 21214, + 17719, + 3171, + 10299, + 17989, + 5382, + 22873, + 1777, + 7674, + 24142, + 15424, + 19947, + 4424, + 13913, + 20787, + 28128, + 127, + 16674, + 24164, + 23766, + 4271, + 14368, + 9368, + 6494, + 25691, + 23221, + 8142, + 1753, + 15124, + 22042, + 18615, + 26602, + 29292, + 20452, + 2334, + 18279, + 25690, + 29755, + 27456, + 27395, + 22865, + 18038, + 14643, + 3570, + 3879, + 17548, + 5506, + 15613, + 26693, + 24100, + 6812, + 7102, + 8679, + 7121, + 23274, + 7391, + 5175, + 12728, + 5425, + 8895, + 20839, + 25725, + 22819, + 5368, + 20105, + 29507, + 20981, + 14040, + 17630, + 28697, + 4857, + 13731, + 1725, + 17262, + 25517, + 16604, + 6349, + 14499, + 18853, + 23549, + 24060, + 16468, + 10560, + 8021, + 28011, + 28527, + 878, + 21128, + 11550, + 892, + 8448, + 6387, + 3089, + 592, + 23327, + 4041, + 18526, + 18107, + 17509, + 1803, + 2946, + 20296, + 15684, + 9314, + 9316, + 17229, + 11969, + 7760, + 22238, + 29868, + 22009, + 15320, + 12552, + 7863, + 12124, + 13266, + 27315, + 3711, + 6052, + 2738, + 16115, + 17242, + 12850, + 13562, + 26908, + 10679, + 26616, + 29059, + 26150, + 25656, + 6658, + 23493, + 1228, + 25707, + 24193, + 2991, + 21114, + 6987, + 1462, + 24604, + 5094, + 5585, + 15889, + 27560, + 9290, + 9888, + 15852, + 25990, + 27195, + 19453, + 4893, + 993, + 28838, + 16568, + 4399, + 18851, + 28961, + 25591, + 806, + 18164, + 23434, + 6932, + 3172, + 513, + 8166, + 24478, + 3014, + 7575, + 25155, + 17096, + 6963, + 28842, + 7874, + 7733, + 18067, + 6165, + 21458, + 5894, + 14687, + 8926, + 27237, + 10867, + 12702, + 6127, + 7286, + 10999, + 24785, + 20567, + 23501, + 5795, + 29511, + 2406, + 3407, + 6921, + 5562, + 7262, + 8631, + 13640, + 24402, + 16958, + 20684, + 3066, + 11218, + 10631, + 19697, + 14147, + 21594, + 17856, + 11558, + 26900, + 464, + 5579, + 12496, + 27324, + 29811, + 3610, + 4702, + 4428, + 7926, + 23365, + 1615, + 22695, + 11653, + 28394, + 9515, + 11945, + 22401, + 25896, + 18024, + 6187, + 12298, + 15024, + 4139, + 1547, + 971, + 7277, + 132, + 13959, + 13043, + 10395, + 2539, + 4155, + 3743, + 11642, + 13527, + 26161, + 11400, + 4219, + 13450, + 22314, + 16007, + 9403, + 18683, + 28212, + 10721, + 19823, + 26694, + 24235, + 11046, + 20428, + 5341, + 3642, + 5429, + 475, + 20408, + 27159, + 6668, + 12379, + 5739, + 12513, + 29840, + 1071, + 3041, + 8740, + 18170, + 22855, + 7801, + 14650, + 28341, + 15007, + 28603, + 18499, + 24933, + 3494, + 6470, + 12639, + 19339, + 7671, + 1789, + 20721, + 4956, + 9164, + 23292, + 27471, + 15264, + 18213, + 6591, + 15407, + 14699, + 21926, + 29060, + 28973, + 18687, + 6980, + 21534, + 28285, + 4205, + 13136, + 21517, + 3820, + 7065, + 28602, + 29791, + 17020, + 23623, + 20871, + 8652, + 9237, + 21686, + 5514, + 8482, + 19410, + 9624, + 3404, + 8841, + 11062, + 7259, + 9813, + 24601, + 4042, + 24744, + 24835, + 7562, + 104, + 6056, + 15715, + 16894, + 3535, + 1633, + 4705, + 29289, + 5909, + 18585, + 28081, + 14310, + 16207, + 8683, + 10409, + 19938, + 14288, + 12544, + 25038, + 11604, + 6278, + 2507, + 28344, + 5730, + 10849, + 29992, + 7025, + 29613, + 25631, + 25138, + 19908, + 29255, + 22539, + 2546, + 10552, + 12654, + 17942, + 25580, + 12523, + 3090, + 26938, + 10712, + 434, + 10163, + 19336, + 19907, + 11207, + 14914, + 19369, + 7806, + 17802, + 21159, + 5962, + 19671, + 5305, + 13641, + 19637, + 11106, + 4814, + 23840, + 12207, + 20639, + 15494, + 9430, + 6338, + 21995, + 5402, + 7551, + 11789, + 17181, + 13035, + 15093, + 23563, + 20621, + 27709, + 6756, + 29514, + 9732, + 3237, + 4696, + 22971, + 2046, + 28080, + 9332, + 22000, + 15341, + 24879, + 27256, + 4902, + 27807, + 3643, + 18774, + 14171, + 3239, + 27602, + 7134, + 27874, + 16668, + 6790, + 29381, + 6427, + 5220, + 20528, + 25806, + 8580, + 19439, + 16889, + 15628, + 5067, + 26378, + 19829, + 9856, + 5430, + 18319, + 19083, + 21427, + 25028, + 24814, + 12232, + 6819, + 17510, + 12809, + 25570, + 14225, + 18727, + 6189, + 9534, + 20377, + 8175, + 7361, + 7094, + 16228, + 26501, + 5311, + 19217, + 407, + 2166, + 10384, + 10704, + 20626, + 14755, + 21712, + 14987, + 18092, + 24756, + 15303, + 13914, + 18919, + 11922, + 12437, + 7599, + 19878, + 26344, + 15563, + 6753, + 20310, + 27790, + 8511, + 26050, + 22844, + 19115, + 20021, + 374, + 28913, + 21278, + 26202, + 20309, + 3812, + 366, + 17648, + 7024, + 7360, + 20393, + 8027, + 28445, + 28317, + 12127, + 8798, + 1112, + 16821, + 11130, + 13400, + 3357, + 16186, + 15941, + 7982, + 5085, + 17991, + 18292, + 26519, + 9356, + 16955, + 9869, + 29943, + 24461, + 28397, + 16893, + 23400, + 26692, + 22097, + 9167, + 29376, + 428, + 6499, + 29034, + 15342, + 8589, + 25898, + 445, + 2122, + 4848, + 27893, + 28036, + 18351, + 20394, + 3775, + 15773, + 11926, + 11254, + 17669, + 13559, + 23330, + 23539, + 5568, + 21503, + 19290, + 29955, + 2320, + 25266, + 24836, + 4952, + 1325, + 14995, + 14868, + 13157, + 5639, + 6381, + 14740, + 11169, + 3623, + 17055, + 19197, + 27543, + 12736, + 5723, + 6937, + 27877, + 15518, + 21287, + 25781, + 25489, + 6789, + 1271, + 27307, + 7265, + 19813, + 5929, + 11349, + 14252, + 28193, + 17530, + 14066, + 28276, + 22433, + 7028, + 21541, + 27840, + 221, + 11417, + 1512, + 23164, + 18481, + 15636, + 19014, + 2571, + 28173, + 19793, + 19327, + 19799, + 22380, + 16878, + 14323, + 27358, + 10964, + 4202, + 19303, + 13656, + 6357, + 10058, + 370, + 27460, + 27314, + 21383, + 6632, + 26531, + 12125, + 27614, + 5078, + 29126, + 19893, + 5829, + 6488, + 24227, + 4392, + 23522, + 2469, + 23395, + 7686, + 14739, + 14280, + 3265, + 19819, + 16661, + 29159, + 20603, + 3472, + 25859, + 19720, + 14017, + 16556, + 13541, + 4608, + 24976, + 18969, + 20055, + 22735, + 13354, + 27758, + 10353, + 9729, + 20159, + 28041, + 28623, + 18110, + 18582, + 4189, + 9752, + 27539, + 4596, + 19317, + 22084, + 28216, + 2354, + 21258, + 26924, + 24661, + 26241, + 20672, + 2500, + 16454, + 8676, + 20744, + 16032, + 17, + 5796, + 472, + 21343, + 4668, + 28264, + 7075, + 1219, + 2294, + 14667, + 6636, + 21463, + 23987, + 6569, + 8246, + 4218, + 17246, + 25622, + 11786, + 29279, + 19812, + 19078, + 17636, + 20573, + 4397, + 21563, + 23690, + 14021, + 25797, + 25240, + 21493, + 1417, + 7506, + 4409, + 6204, + 24783, + 19137, + 16181, + 11049, + 24469, + 23186, + 4876, + 1993, + 24480, + 20962, + 12982, + 26780, + 21146, + 5039, + 16168, + 3496, + 21076, + 3405, + 21017, + 1273, + 705, + 27443, + 13833, + 28729, + 27220, + 18396, + 21846, + 21738, + 10963, + 24523, + 17585, + 18215, + 18265, + 19595, + 24243, + 20500, + 24176, + 4835, + 2230, + 20905, + 16645, + 4319, + 28431, + 29175, + 22327, + 4000, + 12989, + 25640, + 13598, + 11579, + 14178, + 3344, + 15562, + 27127, + 25809, + 18953, + 8765, + 22317, + 12114, + 15615, + 3704, + 24769, + 3415, + 29892, + 26355, + 23951, + 26601, + 25016, + 14057, + 16696, + 9551, + 10077, + 11995, + 20752, + 25021, + 25146, + 15983, + 25182, + 4078, + 16076, + 19653, + 28588, + 8611, + 16198, + 14871, + 11270, + 24240, + 1772, + 24033, + 15147, + 20433, + 5367, + 17526, + 24473, + 17755, + 8664, + 3401, + 6315, + 1829, + 29838, + 26187, + 29746, + 23500, + 14923, + 25608, + 4445, + 8218, + 11298, + 12244, + 26065, + 23615, + 6263, + 3211, + 18962, + 29726, + 20464, + 5844, + 25862, + 7702, + 2339, + 16036, + 23649, + 21998, + 17680, + 8252, + 7570, + 20132, + 24205, + 19921, + 16353, + 22779, + 5565, + 11494, + 25571, + 4498, + 3868, + 27348, + 11727, + 25175, + 18149, + 3940, + 18517, + 23412, + 2509, + 26144, + 2983, + 5249, + 9621, + 1542, + 14737, + 23268, + 11123, + 712, + 510, + 18285, + 25061, + 21897, + 23424, + 10473, + 5532, + 3292, + 8491, + 18094, + 1953, + 6156, + 20738, + 13880, + 13801, + 9404, + 14199, + 26008, + 21176, + 1702, + 29896, + 10993, + 21544, + 19487, + 9396, + 24072, + 13970, + 805, + 139, + 21600, + 27816, + 21071, + 27529, + 14588, + 21300, + 6857, + 25921, + 17443, + 29447, + 27780, + 4410, + 26450, + 13858, + 2894, + 15538, + 1818, + 1324, + 1309, + 28169, + 11100, + 17112, + 7907, + 28531, + 26227, + 2048, + 983, + 10833, + 8820, + 18543, + 25539, + 18443, + 19500, + 19531, + 5573, + 2477, + 27428, + 11371, + 8896, + 28435, + 14845, + 6428, + 1110, + 24568, + 9739, + 23848, + 2395, + 813, + 18469, + 24644, + 1522, + 16157, + 20410, + 24893, + 22900, + 17338, + 7377, + 2976, + 11438, + 17858, + 300, + 21402, + 12553, + 3445, + 6912, + 28159, + 15964, + 1606, + 28395, + 5814, + 2021, + 14921, + 10334, + 9946, + 17331, + 18675, + 4248, + 2274, + 23631, + 24036, + 14735, + 8034, + 1779, + 29409, + 21799, + 21339, + 14732, + 2362, + 11847, + 15504, + 8662, + 3543, + 5758, + 14696, + 29995, + 1738, + 4639, + 21730, + 20490, + 8546, + 20107, + 6062, + 22849, + 11670, + 13300, + 10525, + 25290, + 11079, + 23172, + 4129, + 6955, + 1927, + 14440, + 10036, + 16634, + 2834, + 16864, + 20887, + 15478, + 16852, + 17285, + 27296, + 623, + 28343, + 9072, + 16086, + 21190, + 17876, + 7750, + 24348, + 25047, + 18095, + 19603, + 4023, + 6284, + 20694, + 9248, + 22115, + 28481, + 20901, + 23455, + 14575, + 20419, + 24610, + 8937, + 29615, + 13669, + 26288, + 17222, + 25259, + 8986, + 7477, + 9666, + 28308, + 25054, + 10531, + 26222, + 2741, + 29864, + 20544, + 9143, + 23895, + 6461, + 13138, + 4613, + 25311, + 11887, + 26427, + 23791, + 23972, + 18015, + 5435, + 5480, + 11399, + 15683, + 19034, + 22603, + 5535, + 12044, + 29123, + 15746, + 17375, + 22498, + 22462, + 23404, + 1785, + 18433, + 19362, + 27020, + 23450, + 1099, + 9308, + 27488, + 3056, + 11654, + 4236, + 8147, + 16411, + 1113, + 15246, + 22517, + 12960, + 19913, + 26198, + 13292, + 16962, + 11900, + 988, + 2733, + 7208, + 2037, + 14462, + 26969, + 12388, + 24946, + 8216, + 5272, + 19422, + 13568, + 1580, + 22519, + 28639, + 25858, + 19213, + 20102, + 19231, + 28219, + 19759, + 10730, + 1476, + 10213, + 19520, + 15025, + 840, + 27695, + 10936, + 22157, + 18534, + 22392, + 12899, + 6265, + 26149, + 27571, + 3174, + 11536, + 1265, + 3091, + 19242, + 770, + 904, + 9651, + 26173, + 10476, + 2703, + 28, + 16612, + 16070, + 29472, + 29710, + 28866, + 81, + 12061, + 4476, + 18990, + 24810, + 24382, + 10991, + 9262, + 5014, + 17490, + 27745, + 7761, + 12904, + 15994, + 24226, + 16222, + 7171, + 5470, + 16577, + 21676, + 9949, + 29380, + 6661, + 7782, + 26972, + 255, + 18672, + 11508, + 13808, + 12016, + 17450, + 21992, + 23936, + 9755, + 12105, + 12947, + 10481, + 12693, + 10803, + 27959, + 12001, + 1914, + 12453, + 26383, + 19811, + 22354, + 11248, + 27947, + 24979, + 273, + 25366, + 25589, + 10994, + 10529, + 22757, + 29560, + 23543, + 16929, + 290, + 16642, + 19854, + 369, + 5062, + 28091, + 23174, + 28455, + 1392, + 22717, + 29325, + 18589, + 3826, + 17178, + 11368, + 29979, + 27984, + 28948, + 26400, + 23534, + 3723, + 14238, + 11837, + 11434, + 2203, + 22464, + 2915, + 12085, + 14888, + 27163, + 8571, + 27896, + 20846, + 7142, + 20153, + 8318, + 17507, + 24705, + 16897, + 648, + 24296, + 27453, + 13455, + 11262, + 28748, + 27292, + 7491, + 1839, + 5538, + 27506, + 6933, + 28302, + 27113, + 4753, + 10182, + 28601, + 15365, + 5296, + 14869, + 5782, + 731, + 21464, + 19188, + 18508, + 19867, + 28115, + 16055, + 25343, + 7395, + 2028, + 19929, + 26982, + 17085, + 22751, + 15913, + 10296, + 11561, + 12790, + 14337, + 13298, + 26262, + 15755, + 1566, + 832, + 21435, + 22441, + 10860, + 2069, + 9200, + 8827, + 3541, + 29599, + 22143, + 29426, + 20724, + 18885, + 13468, + 1995, + 6698, + 21346, + 12269, + 29256, + 611, + 688, + 25515, + 4212, + 29757, + 25083, + 10807, + 27823, + 13684, + 10904, + 4329, + 14932, + 3686, + 6862, + 5172, + 22954, + 27070, + 5009, + 19225, + 17186, + 9223, + 24406, + 12151, + 1002, + 7023, + 23718, + 25849, + 694, + 20198, + 13171, + 15990, + 7585, + 9482, + 1085, + 10550, + 26772, + 28232, + 28710, + 17436, + 11520, + 22096, + 28396, + 20547, + 26824, + 29985, + 23727, + 25698, + 15102, + 16581, + 21139, + 28680, + 29154, + 22917, + 3690, + 23340, + 5431, + 8731, + 12397, + 10290, + 1726, + 3223, + 4125, + 19657, + 5457, + 9318, + 7948, + 27110, + 13399, + 17247, + 11054, + 9584, + 4058, + 19571, + 18924, + 11488, + 10425, + 15977, + 3857, + 19865, + 21341, + 5602, + 454, + 24963, + 20060, + 20508, + 20316, + 14458, + 25486, + 27817, + 5227, + 11923, + 17549, + 8077, + 28096, + 16600, + 21472, + 17463, + 27736, + 21490, + 20919, + 11569, + 11910, + 871, + 23106, + 2931, + 28590, + 23442, + 22911, + 3875, + 17307, + 7031, + 9114, + 25042, + 18966, + 27253, + 12648, + 7411, + 1048, + 12259, + 28144, + 29876, + 22762, + 18307, + 28316, + 29686, + 27973, + 29260, + 27849, + 27788, + 1966, + 14751, + 2574, + 8056, + 6877, + 18089, + 4628, + 20673, + 1418, + 28203, + 23773, + 9625, + 28707, + 6849, + 719, + 12142, + 26823, + 14651, + 16926, + 14359, + 2098, + 13534, + 15231, + 27197, + 9924, + 5011, + 8935, + 3030, + 24278, + 19407, + 16260, + 22216, + 6989, + 3911, + 17905, + 26813, + 17940, + 314, + 16270, + 1194, + 29057, + 13951, + 24921, + 5986, + 20555, + 21153, + 25919, + 19564, + 28760, + 9478, + 21225, + 20328, + 27449, + 3302, + 1461, + 5271, + 7606, + 10715, + 21783, + 22239, + 16238, + 20677, + 14900, + 12019, + 824, + 16499, + 22363, + 5070, + 13974, + 4391, + 4146, + 19990, + 25997, + 21660, + 16226, + 22506, + 14294, + 4829, + 29951, + 4009, + 23594, + 879, + 28559, + 2710, + 28619, + 29505, + 17789, + 6596, + 25951, + 28441, + 114, + 10240, + 20545, + 499, + 25352, + 28454, + 19804, + 16531, + 6603, + 10035, + 19058, + 10434, + 17272, + 5556, + 1468, + 15319, + 13560, + 7713, + 9849, + 25313, + 19773, + 15867, + 11084, + 28078, + 15634, + 336, + 15329, + 28048, + 6552, + 9355, + 7805, + 804, + 29649, + 9958, + 9757, + 25560, + 1810, + 9589, + 4542, + 17666, + 19877, + 20815, + 24870, + 11257, + 16140, + 3545, + 24840, + 826, + 6231, + 3678, + 3917, + 6385, + 27502, + 18832, + 7116, + 15629, + 5823, + 25024, + 29922, + 3524, + 3226, + 17324, + 8450, + 27708, + 21613, + 1700, + 22545, + 8361, + 11264, + 18198, + 27687, + 2120, + 8910, + 7719, + 14255, + 10634, + 28788, + 18709, + 24595, + 25134, + 15420, + 12350, + 20252, + 24608, + 29284, + 2238, + 20662, + 14750, + 13277, + 18895, + 23453, + 17319, + 1340, + 23947, + 17127, + 13486, + 13528, + 1980, + 24159, + 7751, + 4556, + 25907, + 3727, + 17871, + 5185, + 21861, + 9839, + 10232, + 29216, + 9736, + 1287, + 28728, + 3049, + 26764, + 22091, + 28585, + 24734, + 16743, + 28043, + 28511, + 9018, + 6551, + 6549, + 5890, + 26099, + 23797, + 27479, + 23526, + 241, + 7849, + 13805, + 20896, + 13160, + 28529, + 18860, + 2073, + 5871, + 21621, + 26753, + 14221, + 27092, + 29620, + 22977, + 23523, + 18581, + 9335, + 5043, + 21489, + 27093, + 23912, + 15435, + 18728, + 6005, + 26561, + 26054, + 517, + 27843, + 28903, + 17815, + 18335, + 19463, + 18410, + 17122, + 2716, + 14624, + 158, + 12499, + 7817, + 16614, + 16478, + 27938, + 28389, + 24869, + 6893, + 1169, + 25617, + 23078, + 6193, + 2656, + 9065, + 26007, + 706, + 9051, + 18295, + 18849, + 15884, + 16527, + 3160, + 7206, + 10972, + 20654, + 28229, + 22298, + 18372, + 20116, + 8337, + 17964, + 26530, + 22627, + 21593, + 4452, + 29988, + 1442, + 16112, + 64, + 26990, + 11186, + 22602, + 6929, + 9699, + 17245, + 17413, + 2867, + 4767, + 16192, + 1055, + 14597, + 29353, + 29225, + 23145, + 23390, + 22582, + 5036, + 26829, + 5399, + 16449, + 18468, + 14832, + 19894, + 27061, + 2979, + 11530, + 24335, + 4408, + 8753, + 18463, + 9175, + 13121, + 27850, + 17489, + 19747, + 18980, + 2506, + 9046, + 15453, + 29242, + 17862, + 28051, + 26655, + 20284, + 8177, + 8244, + 20808, + 22111, + 26091, + 26230, + 3622, + 20666, + 4809, + 4317, + 302, + 7584, + 5767, + 24064, + 26810, + 2883, + 24018, + 26800, + 12986, + 18245, + 12750, + 27475, + 28085, + 23137, + 28238, + 8980, + 12088, + 6425, + 19208, + 15790, + 15581, + 24711, + 16275, + 28540, + 3696, + 10947, + 2240, + 26022, + 27536, + 23112, + 11098, + 14312, + 9101, + 5373, + 18159, + 28900, + 1046, + 912, + 15046, + 2093, + 26902, + 5941, + 4642, + 19786, + 25387, + 5066, + 11614, + 1096, + 28676, + 27655, + 29855, + 29673, + 10456, + 11770, + 23132, + 29894, + 2638, + 22250, + 12226, + 17286, + 12136, + 16273, + 11183, + 22168, + 25203, + 4682, + 15561, + 24028, + 23676, + 5922, + 169, + 13123, + 25482, + 19928, + 18393, + 13788, + 18264, + 10166, + 21531, + 1573, + 9636, + 3449, + 26183, + 15056, + 6181, + 24024, + 5873, + 2057, + 10625, + 20730, + 23057, + 12699, + 20331, + 24146, + 29506, + 25356, + 20081, + 15753, + 27555, + 14617, + 18898, + 19388, + 13076, + 8214, + 24123, + 22514, + 9820, + 23956, + 20221, + 18275, + 29911, + 27305, + 15283, + 27810, + 3490, + 12095, + 657, + 25658, + 13885, + 12429, + 18316, + 24780, + 19961, + 26359, + 10222, + 20186, + 14954, + 18650, + 3480, + 23772, + 28592, + 23968, + 1212, + 26754, + 13564, + 3572, + 23704, + 21844, + 16898, + 25198, + 26575, + 2359, + 7486, + 28766, + 2363, + 26690, + 19128, + 14086, + 23878, + 13456, + 15975, + 6449, + 3863, + 20882, + 27935, + 25886, + 16024, + 7789, + 6614, + 23217, + 16900, + 24198, + 23160, + 4033, + 27106, + 2001, + 3926, + 8808, + 25538, + 14315, + 10654, + 1947, + 23433, + 10168, + 17722, + 17385, + 16838, + 19201, + 17579, + 14961, + 2728, + 1087, + 26000, + 10337, + 17083, + 10921, + 15053, + 25689, + 26017, + 21211, + 9265, + 1788, + 3548, + 5127, + 11997, + 23521, + 9315, + 22605, + 19391, + 22957, + 18244, + 14338, + 4501, + 22870, + 15416, + 25187, + 27541, + 26879, + 14161, + 28704, + 20778, + 23674, + 24458, + 7778, + 9073, + 11198, + 14263, + 21759, + 24821, + 17025, + 3739, + 19354, + 2232, + 8470, + 2923, + 9782, + 28298, + 2225, + 22393, + 28685, + 19113, + 19733, + 13095, + 701, + 9157, + 23708, + 6035, + 11938, + 13567, + 846, + 21010, + 27179, + 3152, + 19744, + 12903, + 26325, + 12448, + 2259, + 1430, + 4600, + 2955, + 14430, + 17759, + 29391, + 27750, + 19996, + 13124, + 14042, + 15987, + 20595, + 13704, + 4812, + 1488, + 15260, + 2502, + 1870, + 6184, + 6952, + 17087, + 20210, + 23709, + 28236, + 25037, + 9032, + 29652, + 3685, + 3210, + 25751, + 14260, + 9150, + 344, + 833, + 26018, + 4885, + 4930, + 14909, + 16714, + 15212, + 25950, + 25844, + 2038, + 10075, + 19151, + 19801, + 16185, + 4693, + 22273, + 11516, + 26238, + 24505, + 27822, + 7399, + 28199, + 21196, + 1828, + 8429, + 12594, + 13832, + 26706, + 16095, + 1182, + 26392, + 6775, + 29639, + 26316, + 12735, + 9249, + 18641, + 17189, + 20709, + 9022, + 9708, + 27188, + 27441, + 22690, + 15827, + 23479, + 6900, + 15495, + 26103, + 1385, + 18152, + 16520, + 20272, + 23843, + 1640, + 12493, + 14671, + 771, + 17713, + 17929, + 18341, + 3766, + 5558, + 24231, + 18977, + 12893, + 11171, + 22964, + 28031, + 7100, + 7964, + 5583, + 26685, + 7698, + 29635, + 25714, + 19017, + 17552, + 22467, + 9823, + 5547, + 28839, + 27598, + 11534, + 26986, + 18587, + 21501, + 2284, + 23655, + 13241, + 8167, + 7647, + 17753, + 17066, + 4283, + 26728, + 2761, + 26286, + 942, + 15230, + 10439, + 16707, + 21567, + 26858, + 3937, + 18623, + 29809, + 6101, + 25392, + 14382, + 361, + 14170, + 26984, + 2651, + 22814, + 8928, + 5519, + 19682, + 12835, + 26203, + 7779, + 20757, + 17408, + 8869, + 20907, + 10519, + 6334, + 23934, + 4949, + 3067, + 8071, + 13894, + 292, + 2713, + 5934, + 17869, + 7841, + 16128, + 2029, + 22436, + 18269, + 28047, + 13131, + 1433, + 16078, + 26360, + 19642, + 29192, + 21005, + 13504, + 19544, + 26802, + 29557, + 12789, + 28213, + 11381, + 10703, + 8787, + 10277, + 21469, + 28564, + 601, + 426, + 29655, + 5112, + 15484, + 3691, + 25981, + 28750, + 25270, + 24571, + 12404, + 2846, + 12737, + 14094, + 24551, + 2187, + 11316, + 8060, + 15075, + 650, + 5469, + 15696, + 3519, + 634, + 26632, + 2020, + 16621, + 28791, + 29085, + 27814, + 16019, + 23793, + 25023, + 3828, + 7673, + 17879, + 26340, + 23716, + 29709, + 19846, + 25841, + 11941, + 29098, + 992, + 1189, + 1694, + 14545, + 25710, + 5237, + 4999, + 8701, + 3331, + 7236, + 8097, + 24924, + 13906, + 28382, + 26595, + 3586, + 10796, + 5377, + 25228, + 2802, + 15038, + 22261, + 25904, + 18604, + 24224, + 16763, + 333, + 16856, + 16834, + 21260, + 14960, + 17049, + 5586, + 8741, + 27719, + 15935, + 3444, + 27934, + 363, + 26336, + 13899, + 24801, + 26605, + 23887, + 27768, + 5386, + 13319, + 6224, + 2218, + 26113, + 25992, + 9706, + 17702, + 16946, + 13775, + 25301, + 17205, + 6840, + 24704, + 7900, + 17522, + 21927, + 22797, + 11693, + 16526, + 29657, + 24407, + 3654, + 25274, + 27298, + 10844, + 10401, + 15318, + 20319, + 27567, + 12462, + 11472, + 10938, + 9579, + 9635, + 23721, + 19817, + 3774, + 24282, + 11669, + 173, + 22263, + 24363, + 1669, + 7935, + 22939, + 21635, + 26842, + 12723, + 23639, + 24749, + 4610, + 14296, + 10484, + 15945, + 1939, + 5088, + 6694, + 6444, + 16167, + 29768, + 18402, + 21933, + 6138, + 9388, + 7307, + 3646, + 2672, + 9186, + 26952, + 13265, + 23004, + 19285, + 23108, + 16062, + 9202, + 2483, + 9195, + 21484, + 6928, + 18340, + 22843, + 23348, + 12156, + 16374, + 1365, + 22594, + 2599, + 7194, + 7081, + 22997, + 8247, + 9570, + 25504, + 8010, + 11112, + 12161, + 9574, + 10114, + 25043, + 27498, + 29932, + 24947, + 7915, + 12346, + 20317, + 11501, + 21859, + 12971, + 14765, + 6512, + 16920, + 8164, + 24918, + 24449, + 26433, + 23536, + 19532, + 14777, + 11211, + 11973, + 20657, + 6469, + 15108, + 24782, + 24233, + 23531, + 23130, + 3233, + 7550, + 25, + 19458, + 2312, + 15014, + 1038, + 19836, + 25490, + 7721, + 14333, + 23125, + 4418, + 4652, + 19031, + 8512, + 27635, + 19914, + 10386, + 22469, + 24399, + 14742, + 20373, + 11321, + 2947, + 26538, + 22940, + 21776, + 12410, + 26669, + 25980, + 23374, + 10112, + 29570, + 7417, + 8520, + 2103, + 24622, + 17482, + 1774, + 20728, + 6503, + 2886, + 27504, + 4207, + 2100, + 6137, + 7725, + 23161, + 24664, + 29782, + 8017, + 12587, + 8706, + 17327, + 22686, + 26455, + 11474, + 20713, + 523, + 20788, + 23028, + 21898, + 7844, + 26686, + 4856, + 3596, + 6402, + 1481, + 14688, + 16882, + 22011, + 24654, + 73, + 23282, + 2146, + 18212, + 25717, + 21794, + 11592, + 13838, + 6092, + 14689, + 27381, + 10693, + 6487, + 22803, + 9541, + 14036, + 12635, + 2659, + 12430, + 9081, + 12537, + 2353, + 5489, + 39, + 8644, + 11710, + 14569, + 4737, + 7784, + 13750, + 26830, + 29365, + 16120, + 3347, + 27528, + 24043, + 21662, + 4577, + 7220, + 17107, + 9563, + 14528, + 15875, + 23785, + 21703, + 1695, + 5347, + 28279, + 2789, + 17497, + 5976, + 3202, + 23190, + 26484, + 11908, + 15742, + 26058, + 15541, + 6448, + 26913, + 602, + 15534, + 6595, + 3778, + 1815, + 4555, + 26588, + 29431, + 29108, + 20217, + 19784, + 7190, + 916, + 29765, + 1801, + 7078, + 754, + 8742, + 4123, + 4631, + 20702, + 5126, + 2282, + 24256, + 21063, + 1977, + 28868, + 13481, + 16904, + 1523, + 9915, + 5351, + 19901, + 5704, + 7608, + 27574, + 22337, + 16507, + 1475, + 19228, + 3058, + 14065, + 2416, + 17735, + 16324, + 27863, + 21609, + 22030, + 25509, + 22247, + 23722, + 26299, + 11328, + 21064, + 17854, + 16321, + 29287, + 20975, + 26342, + 26870, + 3213, + 5236, + 8208, + 17423, + 13039, + 5241, + 28929, + 20695, + 27985, + 2730, + 20255, + 9641, + 8818, + 14522, + 8231, + 18053, + 27342, + 8150, + 21753, + 28843, + 20866, + 13222, + 14180, + 29039, + 16122, + 6074, + 16261, + 77, + 22070, + 335, + 7301, + 12631, + 2347, + 14723, + 20511, + 19566, + 18758, + 3151, + 13213, + 11135, + 4520, + 900, + 8242, + 9982, + 27563, + 13001, + 21657, + 6839, + 15368, + 20920, + 2640, + 29202, + 9991, + 7264, + 17299, + 27716, + 29991, + 29970, + 26979, + 6217, + 25531, + 19521, + 3057, + 23451, + 29880, + 118, + 1272, + 28675, + 4002, + 11906, + 9310, + 11601, + 1116, + 4450, + 1466, + 4645, + 18527, + 24731, + 24534, + 15436, + 16303, + 23209, + 20857, + 19511, + 4249, + 7626, + 2095, + 22661, + 8018, + 10333, + 8658, + 26918, + 12126, + 20818, + 24375, + 4707, + 7158, + 15765, + 2828, + 20108, + 21253, + 29446, + 29944, + 25396, + 23616, + 23595, + 2505, + 9827, + 17372, + 5467, + 19110, + 13363, + 19155, + 1843, + 11596, + 25543, + 15692, + 6891, + 26529, + 3549, + 12475, + 12667, + 17180, + 5650, + 27664, + 15609, + 852, + 2188, + 26004, + 13967, + 18770, + 883, + 20424, + 14748, + 20096, + 24319, + 2247, + 20763, + 9118, + 28001, + 13105, + 6615, + 9004, + 28879, + 4085, + 19970, + 5868, + 7869, + 23900, + 23559, + 12287, + 27284, + 2124, + 21363, + 4847, + 29612, + 6195, + 8985, + 23050, + 6869, + 12204, + 29717, + 26721, + 18825, + 19010, + 27950, + 14272, + 2454, + 2186, + 27537, + 8506, + 24739, + 11663, + 15282, + 3319, + 19406, + 26581, + 4536, + 26777, + 7670, + 17078, + 28862, + 19843, + 2111, + 23041, + 21491, + 22057, + 25576, + 17831, + 10179, + 15475, + 21669, + 28635, + 22140, + 4331, + 8949, + 29369, + 8325, + 4315, + 3439, + 857, + 16428, + 26120, + 28411, + 18952, + 23833, + 4479, + 22729, + 7241, + 29229, + 11152, + 8776, + 15127, + 18688, + 8281, + 25879, + 16774, + 13443, + 12881, + 4552, + 23627, + 27337, + 8459, + 20013, + 20583, + 25472, + 20253, + 6608, + 23185, + 26261, + 7660, + 24210, + 15325, + 10864, + 8490, + 5230, + 14121, + 12413, + 3855, + 24305, + 2295, + 177, + 17982, + 11457, + 1630, + 14776, + 19436, + 11824, + 3795, + 2175, + 13782, + 1078, + 5703, + 9874, + 2600, + 18260, + 25911, + 10617, + 21062, + 387, + 9285, + 24884, + 3972, + 16311, + 16490, + 8411, + 13379, + 11720, + 27421, + 4815, + 26264, + 23893, + 13742, + 21733, + 16735, + 23314, + 27445, + 17425, + 10461, + 11175, + 17824, + 29029, + 4543, + 6321, + 1736, + 2833, + 1129, + 26200, + 503, + 29128, + 19064, + 8102, + 13078, + 23923, + 18819, + 6372, + 28065, + 3291, + 28262, + 9336, + 26888, + 20075, + 17675, + 14746, + 14253, + 7388, + 16814, + 6142, + 14788, + 26620, + 5148, + 2536, + 20671, + 13345, + 20859, + 23598, + 27259, + 6723, + 1942, + 22951, + 17544, + 10663, + 6578, + 29078, + 23006, + 3029, + 2503, + 29149, + 28971, + 3528, + 7921, + 625, + 15803, + 3840, + 24580, + 8934, + 16031, + 6701, + 27363, + 23388, + 18765, + 20840, + 995, + 4136, + 9188, + 17907, + 12685, + 29415, + 7770, + 7956, + 10584, + 20645, + 27254, + 16350, + 17622, + 14584, + 15650, + 4925, + 22645, + 722, + 20335, + 19715, + 16310, + 19099, + 12283, + 3320, + 9005, + 12618, + 19898, + 29095, + 20851, + 21990, + 10472, + 23515, + 119, + 1117, + 4134, + 7768, + 27895, + 25062, + 18577, + 4671, + 1244, + 17208, + 27085, + 24352, + 4988, + 1518, + 5866, + 10032, + 10784, + 12089, + 11420, + 24737, + 19130, + 11333, + 6920, + 8663, + 28237, + 29889, + 218, + 13411, + 5948, + 13328, + 9921, + 15730, + 10345, + 3188, + 23965, + 6048, + 20568, + 12775, + 4049, + 17724, + 13581, + 18545, + 1455, + 108, + 20070, + 2162, + 4648, + 4103, + 1050, + 5951, + 17793, + 8681, + 2311, + 20835, + 16229, + 17808, + 19612, + 25353, + 23555, + 28688, + 24058, + 12193, + 17965, + 11185, + 14910, + 298, + 7653, + 13184, + 23881, + 16545, + 13230, + 10436, + 12115, + 13859, + 1314, + 22998, + 15583, + 5453, + 28034, + 22235, + 11936, + 7148, + 4984, + 29490, + 25181, + 7945, + 5842, + 7755, + 21077, + 10916, + 13036, + 9247, + 27392, + 27242, + 18087, + 10479, + 7549, + 29119, + 7300, + 24170, + 16811, + 630, + 3986, + 9392, + 25345, + 2570, + 14153, + 3626, + 2448, + 23401, + 1278, + 1341, + 3698, + 1985, + 8982, + 4522, + 25594, + 28195, + 14419, + 7614, + 25581, + 6516, + 20827, + 15128, + 9491, + 3085, + 21791, + 8941, + 22151, + 27615, + 1010, + 3821, + 19915, + 26168, + 14709, + 27561, + 5927, + 16460, + 9974, + 9319, + 7467, + 15441, + 27196, + 700, + 12210, + 1679, + 15376, + 5400, + 20298, + 29239, + 13459, + 23756, + 16553, + 24441, + 28027, + 9397, + 405, + 4810, + 9066, + 19399, + 3364, + 15947, + 14489, + 4937, + 7422, + 18042, + 17343, + 10690, + 1508, + 4182, + 12636, + 18143, + 24632, + 10022, + 15791, + 23396, + 5411, + 17646, + 10718, + 21588, + 16459, + 23713, + 3037, + 28214, + 21827, + 18948, + 24398, + 18698, + 28896, + 12874, + 3165, + 16965, + 20575, + 20166, + 21810, + 2400, + 15781, + 15480, + 430, + 16533, + 25648, + 179, + 14340, + 22540, + 27860, + 14760, + 12777, + 29857, + 1088, + 6675, + 19226, + 9740, + 6978, + 20454, + 4016, + 14665, + 9531, + 20162, + 143, + 27658, + 15399, + 28790, + 17373, + 11652, + 29948, + 6080, + 18783, + 2998, + 1804, + 10268, + 24922, + 26560, + 7133, + 7502, + 6366, + 5061, + 18856, + 841, + 11023, + 6164, + 5141, + 29458, + 8943, + 11623, + 27258, + 500, + 15037, + 14335, + 29869, + 7089, + 2277, + 286, + 10397, + 20727, + 23700, + 3881, + 20294, + 21055, + 24032, + 14701, + 29952, + 11105, + 4102, + 8693, + 29915, + 27948, + 28583, + 20708, + 1800, + 21133, + 25398, + 25664, + 12427, + 10019, + 10979, + 12438, + 24585, + 12758, + 16444, + 9090, + 4059, + 16892, + 27168, + 1529, + 6761, + 21886, + 13271, + 1215, + 15292, + 2675, + 3329, + 19765, + 17175, + 26687, + 12325, + 1415, + 22032, + 741, + 2179, + 29720, + 17842, + 10306, + 7060, + 19613, + 546, + 18204, + 14227, + 28222, + 196, + 17151, + 3340, + 29738, + 28315, + 21605, + 22863, + 17032, + 2050, + 16835, + 21157, + 12742, + 25722, + 12862, + 14824, + 10033, + 6570, + 1510, + 19088, + 6589, + 14710, + 13715, + 1552, + 22669, + 24583, + 24848, + 14917, + 28300, + 27326, + 2478, + 29112, + 24605, + 3949, + 6660, + 9182, + 25794, + 4015, + 2042, + 23702, + 29781, + 19415, + 1378, + 16291, + 23470, + 15378, + 3964, + 8598, + 11696, + 28122, + 8864, + 19763, + 26846, + 1990, + 26939, + 17606, + 3921, + 10919, + 27933, + 28808, + 6786, + 13634, + 12570, + 10865, + 29024, + 14680, + 1077, + 19669, + 25885, + 25372, + 18957, + 19286, + 18778, + 1941, + 5905, + 6192, + 5494, + 6212, + 28554, + 29933, + 20430, + 9637, + 25084, + 13596, + 24717, + 15397, + 22919, + 6754, + 9717, + 10815, + 5978, + 2875, + 20726, + 5421, + 21508, + 26711, + 29845, + 17219, + 18019, + 6931, + 24185, + 19809, + 18741, + 9281, + 18565, + 15192, + 19310, + 28126, + 18375, + 24435, + 16026, + 15446, + 27837, + 6460, + 13796, + 354, + 3533, + 13662, + 10305, + 11570, + 1984, + 1403, + 284, + 18065, + 5916, + 24521, + 21091, + 8015, + 10097, + 23897, + 13853, + 6526, + 27409, + 10322, + 4698, + 4252, + 21806, + 25796, + 15809, + 9431, + 27901, + 596, + 25130, + 25827, + 7214, + 12084, + 28121, + 20056, + 25760, + 14691, + 19158, + 23590, + 10052, + 18239, + 23110, + 28291, + 19193, + 9279, + 710, + 18237, + 6798, + 20798, + 25229, + 28821, + 22895, + 8098, + 17746, + 18822, + 22770, + 6154, + 8185, + 10191, + 29089, + 18240, + 13406, + 13839, + 7008, + 1851, + 16849, + 7975, + 12724, + 20243, + 3889, + 17599, + 4854, + 3565, + 20376, + 5332, + 7110, + 16505, + 21342, + 6014, + 27582, + 8879, + 6826, + 28532, + 25944, + 15759, + 5040, + 7772, + 22396, + 15939, + 15812, + 1707, + 17377, + 9197, + 10696, + 10956, + 9852, + 21975, + 9608, + 26659, + 25438, + 1675, + 7925, + 5199, + 13844, + 2549, + 4715, + 17798, + 6437, + 6038, + 23852, + 5712, + 23889, + 15240, + 25048, + 10997, + 14904, + 22141, + 28420, + 1925, + 27331, + 4334, + 15661, + 7853, + 21649, + 25663, + 9475, + 16, + 19176, + 9019, + 5787, + 1543, + 7470, + 12367, + 9107, + 183, + 25850, + 16280, + 24115, + 3232, + 21333, + 23167, + 22003, + 20259, + 9576, + 26029, + 7859, + 21634, + 2380, + 6002, + 12649, + 14015, + 29090, + 4481, + 24258, + 25386, + 8211, + 5998, + 28329, + 26558, + 27977, + 959, + 28233, + 25620, + 23775, + 21899, + 7027, + 4599, + 1251, + 13729, + 3257, + 171, + 18635, + 530, + 1021, + 11695, + 1792, + 25912, + 3125, + 29134, + 23441, + 27501, + 19728, + 17113, + 8783, + 27783, + 19497, + 29234, + 25258, + 24925, + 21548, + 8335, + 11581, + 27224, + 14743, + 11930, + 3409, + 9324, + 24956, + 10209, + 6637, + 2208, + 3256, + 5760, + 11497, + 13014, + 8743, + 5454, + 29312, + 9128, + 9850, + 14985, + 7783, + 17970, + 13942, + 5676, + 8573, + 25213, + 14234, + 21021, + 8805, + 7001, + 16565, + 28416, + 9501, + 24263, + 6774, + 28100, + 10295, + 14325, + 10486, + 2465, + 27484, + 1227, + 28806, + 22194, + 4751, + 16049, + 11799, + 12695, + 21716, + 3773, + 28094, + 29197, + 11148, + 24613, + 3350, + 28246, + 3969, + 28885, + 15635, + 18138, + 27553, + 26609, + 1317, + 22241, + 3866, + 19167, + 24351, + 12754, + 3584, + 15512, + 14551, + 18312, + 16051, + 25411, + 28943, + 5597, + 29829, + 23771, + 3919, + 25819, + 12303, + 5275, + 5436, + 6890, + 25873, + 5224, + 28164, + 25217, + 28003, + 27931, + 19476, + 21824, + 18432, + 792, + 13876, + 19652, + 22352, + 11110, + 20290, + 28437, + 19565, + 9928, + 2429, + 7503, + 18284, + 16666, + 8267, + 4784, + 26156, + 28042, + 21086, + 20340, + 28516, + 29359, + 9919, + 26852, + 5012, + 7298, + 28848, + 12738, + 14137, + 3460, + 5835, + 25598, + 3471, + 2357, + 26543, + 11427, + 17998, + 15254, + 22788, + 19748, + 13258, + 2297, + 9330, + 12816, + 24919, + 20131, + 22355, + 12944, + 17674, + 22887, + 14002, + 21896, + 13083, + 1654, + 11490, + 7204, + 15656, + 4916, + 11901, + 5564, + 12885, + 7539, + 12846, + 26664, + 24113, + 11004, + 7540, + 21052, + 6592, + 27558, + 25821, + 1493, + 12025, + 29109, + 29623, + 4366, + 4183, + 13693, + 26587, + 19123, + 26608, + 20955, + 28506, + 25269, + 13747, + 21257, + 9441, + 21267, + 4920, + 18791, + 20227, + 5005, + 23919, + 15122, + 24149, + 13574, + 7390, + 29881, + 10215, + 401, + 22713, + 23153, + 24760, + 14562, + 12987, + 17488, + 9539, + 28849, + 24627, + 1267, + 6178, + 24390, + 26175, + 27652, + 7445, + 11791, + 16132, + 4858, + 18250, + 16805, + 3189, + 29165, + 1805, + 16220, + 5505, + 4003, + 28558, + 8616, + 4898, + 17685, + 7196, + 20190, + 11765, + 19096, + 16694, + 26973, + 18595, + 4008, + 28363, + 3001, + 27868, + 1923, + 13417, + 12717, + 4838, + 29835, + 6644, + 10573, + 18872, + 3832, + 7808, + 29794, + 2614, + 6727, + 4677, + 26572, + 8037, + 4038, + 29531, + 5520, + 22718, + 28102, + 10121, + 3378, + 10507, + 27344, + 21822, + 29328, + 23654, + 8146, + 22599, + 6183, + 537, + 23755, + 22184, + 23456, + 20475, + 6876, + 6252, + 4414, + 5607, + 210, + 17985, + 6502, + 15676, + 28200, + 12451, + 3965, + 1609, + 12214, + 20561, + 10868, + 29450, + 21295, + 24244, + 27630, + 12241, + 17281, + 729, + 13746, + 10266, + 26691, + 5571, + 619, + 23191, + 19619, + 27467, + 2933, + 27108, + 5117, + 8413, + 29858, + 16561, + 10424, + 13558, + 14948, + 1281, + 2668, + 23967, + 11946, + 12718, + 18324, + 28967, + 27884, + 17818, + 13692, + 18085, + 21601, + 1975, + 12994, + 26937, + 9910, + 22465, + 18135, + 16630, + 16537, + 18140, + 16827, + 16554, + 26765, + 20209, + 6447, + 23429, + 21651, + 12983, + 13706, + 23384, + 19154, + 3762, + 20963, + 4402, + 1145, + 22434, + 779, + 26220, + 10582, + 3275, + 9307, + 20472, + 27636, + 23318, + 7175, + 12273, + 8849, + 11402, + 8670, + 22186, + 5493, + 2367, + 12599, + 28875, + 16013, + 3753, + 27339, + 18915, + 10495, + 9647, + 13658, + 13878, + 25159, + 19665, + 21672, + 3722, + 20300, + 22117, + 8837, + 27357, + 12004, + 4395, + 28135, + 18002, + 11676, + 6820, + 8275, + 15866, + 7059, + 12898, + 9673, + 19072, + 25837, + 13433, + 1994, + 9029, + 28881, + 22299, + 27080, + 5580, + 3131, + 25018, + 14549, + 3735, + 12549, + 29921, + 16447, + 25485, + 25424, + 13998, + 17788, + 10599, + 23010, + 26668, + 26723, + 27733, + 10151, + 21459, + 1443, + 13343, + 21222, + 1652, + 20628, + 9571, + 3554, + 5719, + 27121, + 11351, + 11881, + 10581, + 16672, + 1064, + 7086, + 23033, + 15933, + 3447, + 25235, + 23728, + 29077, + 7937, + 15907, + 6020, + 2245, + 1599, + 17957, + 12353, + 2082, + 21820, + 6045, + 25682, + 296, + 8829, + 11996, + 8344, + 18387, + 6075, + 23892, + 29288, + 14647, + 17959, + 10686, + 6210, + 25314, + 11372, + 21294, + 16264, + 18151, + 2425, + 26946, + 4441, + 800, + 14450, + 23944, + 552, + 13760, + 20517, + 11650, + 7276, + 13116, + 1550, + 4010, + 20617, + 17474, + 11684, + 29554, + 23171, + 8645, + 4643, + 25195, + 6227, + 1450, + 14548, + 1049, + 22829, + 16767, + 16339, + 17244, + 9470, + 3819, + 19066, + 19559, + 4458, + 16189, + 14836, + 14070, + 24653, + 24057, + 11120, + 10828, + 17641, + 26242, + 4013, + 11454, + 14745, + 1536, + 17570, + 22749, + 21510, + 10893, + 11356, + 8030, + 22597, + 21370, + 19546, + 1601, + 4796, + 20764, + 18967, + 6855, + 15333, + 26872, + 18763, + 13321, + 18661, + 22754, + 18148, + 26412, + 28030, + 15836, + 25875, + 19625, + 6355, + 26641, + 2336, + 21997, + 12417, + 1349, + 27360, + 25186, + 23183, + 27932, + 26361, + 15903, + 9138, + 22513, + 19755, + 26186, + 17846, + 10176, + 12190, + 12059, + 23762, + 6071, + 16560, + 27857, + 28505, + 18755, + 13200, + 23432, + 3561, + 22830, + 25085, + 27892, + 22776, + 17228, + 10393, + 5999, + 28556, + 12879, + 3015, + 25959, + 11396, + 22323, + 24217, + 23652, + 763, + 25114, + 3035, + 2831, + 17619, + 20796, + 7680, + 5398, + 24199, + 6522, + 8584, + 10376, + 639, + 27989, + 15486, + 18495, + 21747, + 7688, + 5711, + 4028, + 29919, + 14806, + 8219, + 9169, + 10923, + 6827, + 9542, + 11146, + 3839, + 4260, + 29982, + 20676, + 29488, + 26131, + 19178, + 20633, + 11010, + 28631, + 10402, + 20405, + 28253, + 18169, + 23249, + 11241, + 20746, + 16245, + 15234, + 29585, + 2391, + 8379, + 28453, + 23123, + 21769, + 12461, + 25066, + 23903, + 13895, + 19797, + 25072, + 8748, + 18707, + 14093, + 21664, + 6715, + 22297, + 15806, + 12463, + 26118, + 3948, + 24656, + 3558, + 18248, + 18127, + 2936, + 5110, + 11212, + 6962, + 22586, + 1724, + 7932, + 21137, + 14613, + 14329, + 12101, + 18318, + 11712, + 8779, + 13739, + 4247, + 2474, + 26892, + 28060, + 9211, + 9078, + 19958, + 21527, + 4258, + 4118, + 29367, + 4466, + 16470, + 16928, + 29238, + 15291, + 15289, + 28064, + 4306, + 16193, + 6307, + 21805, + 6185, + 18486, + 28818, + 12919, + 5969, + 17607, + 3007, + 7242, + 22040, + 15701, + 17067, + 8377, + 16538, + 26617, + 29741, + 11045, + 23054, + 4210, + 8956, + 29555, + 25097, + 26328, + 20357, + 14604, + 27706, + 21441, + 19125, + 4070, + 27606, + 8394, + 11310, + 19776, + 22217, + 18074, + 4357, + 24860, + 13197, + 4165, + 3632, + 20892, + 17738, + 20529, + 29341, + 4344, + 14515, + 4727, + 26441, + 3592, + 6541, + 598, + 1670, + 14694, + 13540, + 24581, + 20352, + 11776, + 27847, + 22744, + 2032, + 22909, + 4184, + 18965, + 9161, + 21072, + 13585, + 23419, + 19758, + 10862, + 16670, + 5121, + 4679, + 17386, + 15222, + 8594, + 7834, + 13888, + 14014, + 19864, + 10201, + 16142, + 17701, + 18857, + 14429, + 6716, + 25768, + 25542, + 1114, + 22527, + 8065, + 9870, + 29139, + 14989, + 13186, + 4990, + 8629, + 9427, + 15735, + 12676, + 8136, + 20353, + 13332, + 21618, + 1863, + 13556, + 1575, + 11180, + 25868, + 20181, + 21850, + 11864, + 1256, + 3019, + 25506, + 3968, + 29854, + 2242, + 8930, + 4825, + 27712, + 11725, + 29940, + 17739, + 26098, + 5125, + 7842, + 29, + 5463, + 26965, + 21385, + 17106, + 25281, + 9977, + 15888, + 17811, + 2776, + 23593, + 11423, + 23658, + 2466, + 12967, + 21797, + 14531, + 481, + 6508, + 9558, + 9548, + 7270, + 28594, + 19507, + 11393, + 19040, + 26246, + 2636, + 616, + 20163, + 8684, + 16360, + 17527, + 23686, + 5807, + 17277, + 17029, + 8058, + 14259, + 14717, + 15848, + 9911, + 13126, + 27815, + 20149, + 25678, + 15203, + 1406, + 5592, + 17421, + 27264, + 8311, + 17316, + 2715, + 29693, + 5360, + 4576, + 25315, + 16239, + 2541, + 12969, + 24851, + 26416, + 13466, + 19015, + 2823, + 23271, + 5247, + 7129, + 3510, + 26584, + 4436, + 26881, + 15567, + 4903, + 1407, + 9483, + 26128, + 14398, + 15969, + 26481, + 7820, + 3190, + 20771, + 20042, + 21882, + 28796, + 1426, + 9577, + 9350, + 13890, + 15529, + 12107, + 20279, + 22124, + 24545, + 5479, + 25578, + 14277, + 13652, + 21701, + 22302, + 4393, + 4257, + 14478, + 7898, + 11746, + 28909, + 15951, + 24537, + 5526, + 7137, + 20710, + 2316, + 21542, + 24844, + 2839, + 15766, + 18403, + 10104, + 27651, + 13940, + 19134, + 7225, + 22108, + 27496, + 12683, + 7398, + 16593, + 14134, + 3396, + 1786, + 16476, + 3901, + 23774, + 28254, + 29188, + 25776, + 21074, + 1796, + 17780, + 16688, + 10802, + 19707, + 15970, + 17165, + 29102, + 29375, + 20913, + 7666, + 11857, + 29790, + 22282, + 13926, + 16137, + 10198, + 28288, + 21554, + 7439, + 888, + 11151, + 13315, + 29870, + 13066, + 6344, + 4429, + 28922, + 29499, + 21200, + 5783, + 24085, + 3435, + 4940, + 26308, + 10586, + 15535, + 12597, + 1946, + 23609, + 20239, + 16879, + 2838, + 12130, + 945, + 2957, + 12252, + 29459, + 9212, + 25342, + 24428, + 8428, + 21192, + 28371, + 12110, + 19361, + 22100, + 2658, + 14212, + 28312, + 27845, + 216, + 29158, + 9345, + 4653, + 8, + 29097, + 29114, + 18282, + 28035, + 18440, + 21193, + 12030, + 27290, + 22945, + 12568, + 26785, + 8572, + 20307, + 8713, + 25703, + 6651, + 6424, + 8893, + 5721, + 16307, + 5279, + 7179, + 28318, + 4376, + 13308, + 12285, + 15953, + 28410, + 21775, + 13781, + 7965, + 29326, + 18505, + 9171, + 24276, + 13910, + 26415, + 24309, + 20951, + 18905, + 20482, + 9994, + 23047, + 9940, + 9653, + 10243, + 22341, + 24409, + 5598, + 28340, + 1671, + 10805, + 14768, + 979, + 25926, + 19073, + 18941, + 7522, + 23862, + 28471, + 13964, + 23613, + 10773, + 35, + 14683, + 4725, + 9135, + 26145, + 25596, + 22174, + 7974, + 13069, + 11976, + 27967, + 22051, + 19912, + 14764, + 5870, + 1986, + 3653, + 26653, + 11736, + 19818, + 27053, + 398, + 18219, + 28657, + 822, + 4710, + 4318, + 14720, + 21204, + 4091, + 12779, + 7684, + 2389, + 1120, + 6561, + 7227, + 24618, + 12858, + 3530, + 13283, + 21303, + 3283, + 90, + 25507, + 8909, + 3996, + 22210, + 12389, + 16959, + 4253, + 943, + 3260, + 28379, + 13992, + 17048, + 25153, + 8570, + 347, + 29429, + 4764, + 1957, + 10162, + 26749, + 20286, + 3064, + 11500, + 11426, + 19334, + 17752, + 7697, + 20863, + 25263, + 6440, + 22416, + 4508, + 21073, + 29148, + 3272, + 23480, + 5635, + 27352, + 2623, + 5666, + 22978, + 9433, + 11114, + 11479, + 9177, + 28421, + 13569, + 28462, + 26460, + 11388, + 23518, + 23960, + 6977, + 6153, + 22672, + 18850, + 494, + 12871, + 24549, + 14408, + 9203, + 1906, + 26665, + 15263, + 8096, + 22144, + 21445, + 8859, + 5273, + 12320, + 28749, + 22486, + 29517, + 1467, + 26310, + 22359, + 10716, + 819, + 25384, + 7260, + 24790, + 18781, + 30, + 13702, + 25979, + 21444, + 2970, + 9341, + 6363, + 27162, + 3013, + 10742, + 14136, + 5159, + 8108, + 11132, + 27133, + 22024, + 4217, + 853, + 1168, + 14520, + 12039, + 14364, + 8596, + 1888, + 25786, + 15729, + 24629, + 63, + 23688, + 28565, + 5208, + 12354, + 1666, + 11063, + 16669, + 16323, + 10359, + 14756, + 7239, + 11546, + 19160, + 14974, + 26799, + 25687, + 21648, + 27965, + 2165, + 3715, + 23462, + 15757, + 27872, + 5638, + 2649, + 20501, + 7790, + 2054, + 21734, + 20670, + 7310, + 13290, + 2516, + 11750, + 3166, + 16752, + 29659, + 28250, + 23235, + 8133, + 17837, + 8932, + 8054, + 27183, + 20850, + 18487, + 27045, + 11931, + 13209, + 24220, + 21453, + 29826, + 29012, + 9408, + 9120, + 3974, + 2899, + 19774, + 19574, + 14061, + 5282, + 2132, + 16057, + 18417, + 11451, + 28951, + 19815, + 25588, + 19686, + 14080, + 10329, + 7165, + 22499, + 19518, + 28798, + 12174, + 13477, + 5689, + 28378, + 21585, + 1603, + 29257, + 4799, + 3247, + 16656, + 27340, + 19312, + 3486, + 3830, + 16465, + 19192, + 50, + 21219, + 25143, + 29918, + 9538, + 8306, + 15589, + 4347, + 13348, + 7879, + 22251, + 13479, + 19567, + 26153, + 20015, + 26585, + 8727, + 4794, + 13886, + 4592, + 23201, + 13472, + 14916, + 10738, + 27991, + 17279, + 11026, + 29306, + 29385, + 25778, + 25634, + 26837, + 29151, + 9737, + 12276, + 20385, + 19012, + 3215, + 15743, + 2794, + 21741, + 25176, + 9372, + 12263, + 9627, + 23267, + 9898, + 26495, + 22319, + 4503, + 27439, + 25255, + 9124, + 24362, + 16551, + 4246, + 2798, + 22902, + 11267, + 27597, + 4872, + 20247, + 12945, + 17506, + 14818, + 19449, + 8419, + 23044, + 10527, + 16464, + 11524, + 5893, + 20435, + 2914, + 18458, + 28652, + 3506, + 29890, + 20119, + 15614, + 22430, + 3443, + 10355, + 20984, + 19360, + 2939, + 4658, + 3568, + 19082, + 24772, + 21906, + 23864, + 15618, + 28414, + 12289, + 8599, + 4888, + 18893, + 1308, + 5744, + 19299, + 3782, + 27534, + 15390, + 20725, + 16290, + 15967, + 1312, + 8931, + 14208, + 3942, + 7413, + 11483, + 17828, + 13637, + 10245, + 19694, + 5614, + 9014, + 427, + 10731, + 4651, + 5426, + 26498, + 14378, + 18374, + 67, + 1420, + 7044, + 12672, + 25611, + 23916, + 17368, + 29010, + 144, + 16932, + 22641, + 3634, + 4286, + 11040, + 27898, + 14059, + 16014, + 12536, + 11160, + 21121, + 8455, + 16780, + 4849, + 24883, + 1229, + 14003, + 11292, + 18497, + 12844, + 542, + 5179, + 486, + 11562, + 20451, + 28018, + 4678, + 11199, + 15515, + 28112, + 4132, + 2302, + 17309, + 28986, + 26967, + 10680, + 13621, + 24118, + 3392, + 7067, + 6610, + 9947, + 24023, + 6100, + 29695, + 6393, + 24847, + 911, + 23554, + 1827, + 20106, + 19364, + 25532, + 13536, + 25702, + 18550, + 14210, + 7274, + 8920, + 10691, + 17563, + 29246, + 5250, + 22562, + 2215, + 25939, + 6995, + 6497, + 2844, + 14809, + 15885, + 1235, + 2439, + 14753, + 13631, + 18030, + 23277, + 1585, + 27361, + 11283, + 17171, + 13713, + 12184, + 24414, + 23706, + 20164, + 17504, + 15346, + 5316, + 25147, + 9906, + 17140, + 14109, + 2041, + 11907, + 26759, + 26885, + 10237, + 7329, + 7933, + 20113, + 24614, + 9968, + 4989, + 12524, + 25872, + 16973, + 24222, + 24141, + 8099, + 3975, + 10116, + 21562, + 22871, + 7581, + 22826, + 25910, + 13293, + 16171, + 9598, + 11288, + 22101, + 14235, + 28537, + 26803, + 1875, + 8171, + 11136, + 20740, + 29011, + 27001, + 4062, + 7051, + 3425, + 25616, + 18507, + 16322, + 18611, + 21580, + 15528, + 19614, + 6299, + 25408, + 6168, + 12491, + 5287, + 21297, + 21206, + 4092, + 1347, + 21762, + 26703, + 12045, + 8271, + 28928, + 24208, + 28860, + 18602, + 11142, + 24247, + 27257, + 2562, + 1196, + 27129, + 26087, + 396, + 26215, + 2963, + 27433, + 21532, + 6459, + 15514, + 9304, + 13196, + 7825, + 7138, + 26506, + 22992, + 362, + 12705, + 25514, + 22991, + 4756, + 17601, + 20202, + 12330, + 11557, + 7338, + 10055, + 25558, + 23347, + 19432, + 6654, + 24674, + 17065, + 26857, + 11800, + 522, + 27717, + 11208, + 839, + 5645, + 17863, + 24555, + 4065, + 1348, + 24849, + 12103, + 17564, + 7754, + 15433, + 25415, + 4833, + 19266, + 23760, + 22725, + 2840, + 13447, + 27993, + 26600, + 4823, + 4471, + 24710, + 5727, + 13983, + 16848, + 27323, + 22587, + 8378, + 26009, + 8973, + 1854, + 4233, + 5949, + 2128, + 24145, + 15255, + 13828, + 17059, + 4766, + 20756, + 15946, + 23482, + 17194, + 29398, + 7667, + 22842, + 13114, + 25724, + 27297, + 16153, + 12264, + 3321, + 17142, + 22159, + 26788, + 15190, + 23996, + 29545, + 4997, + 6058, + 16615, + 23795, + 10199, + 29030, + 14032, + 14864, + 19427, + 2667, + 15744, + 29008, + 29722, + 23602, + 20650, + 17110, + 17934, + 10478, + 2344, + 23423, + 11272, + 27373, + 13187, + 6942, + 29761, + 21234, + 3063, + 18982, + 5302, + 313, + 10853, + 2706, + 5504, + 28669, + 25100, + 24675, + 28386, + 22877, + 26769, + 28311, + 28800, + 25291, + 12444, + 17162, + 17708, + 15861, + 21268, + 6000, + 16559, + 733, + 17684, + 27853, + 1501, + 13799, + 19245, + 12630, + 16111, + 18561, + 28436, + 23519, + 9862, + 29220, + 16406, + 3482, + 3183, + 8293, + 15548, + 5077, + 25728, + 535, + 4538, + 20600, + 9243, + 7048, + 16101, + 12197, + 8049, + 24685, + 16914, + 27570, + 10788, + 11025, + 22613, + 16925, + 10940, + 8488, + 17315, + 16801, + 10687, + 23354, + 28692, + 22076, + 6034, + 1520, + 1517, + 46, + 1719, + 28823, + 24698, + 3687, + 13436, + 20215, + 8833, + 10910, + 6240, + 14092, + 8425, + 10592, + 12200, + 4387, + 1159, + 17893, + 15611, + 15624, + 460, + 14786, + 5860, + 13630, + 15839, + 2515, + 27779, + 21208, + 3093, + 20391, + 24776, + 12083, + 19387, + 18267, + 23094, + 5139, + 11639, + 28636, + 3546, + 2119, + 16421, + 20192, + 8471, + 5129, + 3441, + 6159, + 17160, + 8079, + 28545, + 18912, + 6376, + 33, + 3985, + 13505, + 21411, + 16283, + 664, + 20439, + 16986, + 22453, + 8487, + 10234, + 20150, + 25260, + 4708, + 25468, + 21543, + 5266, + 10480, + 24275, + 1972, + 1066, + 20546, + 43, + 14045, + 18000, + 18278, + 3716, + 6017, + 18752, + 13470, + 5184, + 27682, + 26714, + 18637, + 15138, + 1714, + 19392, + 19205, + 21407, + 10014, + 29771, + 9062, + 7302, + 7156, + 22552, + 21675, + 14455, + 24748, + 15663, + 12622, + 24308, + 6242, + 15712, + 23216, + 17024, + 27365, + 15928, + 13565, + 20934, + 17461, + 24056, + 13067, + 2094, + 25305, + 23095, + 14390, + 10528, + 14983, + 239, + 27461, + 3844, + 24680, + 6111, + 20741, + 15702, + 27444, + 21929, + 7162, + 20242, + 4686, + 7263, + 29021, + 4144, + 24476, + 6272, + 18270, + 27336, + 19770, + 5755, + 12870, + 13507, + 3713, + 27797, + 29374, + 6859, + 15674, + 9284, + 13071, + 28897, + 20034, + 5023, + 16985, + 25447, + 14215, + 456, + 9377, + 17595, + 9711, + 821, + 25851, + 10244, + 15135, + 21028, + 15357, + 17723, + 11005, + 21195, + 23476, + 8042, + 5221, + 14618, + 13904, + 20071, + 11251, + 22149, + 2774, + 9944, + 910, + 17910, + 1498, + 23910, + 18566, + 2268, + 23099, + 12153, + 11763, + 27338, + 23074, + 29971, + 16131, + 278, + 16862, + 5456, + 9364, + 8420, + 12229, + 3998, + 23939, + 29836, + 5111, + 4691, + 22609, + 18289, + 6483, + 26991, + 3982, + 7897, + 27936, + 15991, + 11303, + 28745, + 8282, + 11469, + 18810, + 7985, + 20401, + 2620, + 6982, + 25512, + 12798, + 26925, + 21966, + 22899, + 16058, + 6752, + 4978, + 16127, + 21008, + 26871, + 9327, + 27059, + 14840, + 17657, + 27781, + 14810, + 4025, + 816, + 18625, + 22377, + 3207, + 21163, + 22116, + 3301, + 12741, + 880, + 24451, + 10702, + 15366, + 20266, + 13709, + 9343, + 2887, + 20972, + 1208, + 7387, + 9338, + 27982, + 11429, + 6007, + 9892, + 21828, + 24089, + 7854, + 20569, + 2795, + 11329, + 29463, + 20909, + 20072, + 11960, + 2482, + 11101, + 4361, + 21526, + 22739, + 7741, + 27592, + 17580, + 11891, + 9359, + 5746, + 21467, + 3181, + 29820, + 21129, + 15380, + 25331, + 583, + 3469, + 29166, + 3989, + 25287, + 11888, + 28271, + 25443, + 788, + 9311, + 6003, + 16500, + 22914, + 25257, + 15980, + 18418, + 14843, + 862, + 28892, + 18299, + 19639, + 11612, + 10130, + 21098, + 17589, + 8617, + 7313, + 18653, + 10770, + 8024, + 10259, + 13575, + 9536, + 21283, + 157, + 28906, + 5242, + 18117, + 4326, + 8023, + 12998, + 25376, + 27588, + 27432, + 12760, + 11109, + 5943, + 164, + 18434, + 16895, + 17499, + 28852, + 1557, + 1065, + 12740, + 16494, + 10850, + 1588, + 28010, + 12637, + 15201, + 6332, + 7203, + 26248, + 14275, + 27786, + 17882, + 7385, + 3941, + 2289, + 26779, + 19978, + 24993, + 4027, + 28239, + 13495, + 16180, + 8228, + 272, + 21009, + 14744, + 19351, + 1469, + 29776, + 10027, + 16544, + 14122, + 1456, + 6683, + 14902, + 10835, + 21330, + 3434, + 6863, + 28908, + 22356, + 16439, + 13524, + 16969, + 13375, + 26868, + 10756, + 4661, + 14884, + 27971, + 10758, + 18049, + 10766, + 5415, + 18935, + 1022, + 10311, + 1729, + 4433, + 3869, + 18578, + 14402, + 12646, + 22125, + 8213, + 16660, + 17274, + 12753, + 28045, + 12119, + 12616, + 11096, + 13176, + 909, + 7895, + 12317, + 17649, + 24682, + 9347, + 20931, + 7848, + 7840, + 14590, + 8007, + 3070, + 27723, + 13912, + 13002, + 4906, + 25584, + 21623, + 7899, + 28520, + 14533, + 11793, + 24589, + 26903, + 20338, + 2279, + 4447, + 9445, + 20156, + 28981, + 15145, + 23364, + 5409, + 7095, + 4950, + 1919, + 15921, + 7531, + 16162, + 2836, + 26265, + 5837, + 11971, + 1768, + 11667, + 2634, + 4389, + 25089, + 26469, + 12058, + 9657, + 11730, + 17677, + 1389, + 25261, + 4551, + 23375, + 7130, + 3724, + 28937, + 13324, + 26981, + 3500, + 219, + 6162, + 8724, + 5142, + 15111, + 26122, + 23071, + 6174, + 20333, + 13785, + 24392, + 18008, + 18766, + 13792, + 14309, + 21273, + 21213, + 5325, + 25131, + 20216, + 22199, + 9184, + 29997, + 10903, + 29023, + 16748, + 2436, + 6076, + 7010, + 26696, + 7818, + 3991, + 8646, + 22764, + 13922, + 13861, + 11774, + 7534, + 4889, + 10408, + 11425, + 5119, + 25860, + 459, + 5253, + 7371, + 23435, + 18447, + 23293, + 23498, + 21564, + 13122, + 5569, + 10371, + 9844, + 23891, + 23483, + 26190, + 14038, + 24261, + 29903, + 5536, + 29390, + 2811, + 22041, + 6854, + 6736, + 13962, + 1089, + 22777, + 13113, + 14039, + 15846, + 4412, + 27394, + 9828, + 16830, + 3150, + 1689, + 28674, + 19543, + 10969, + 3576, + 24813, + 18559, + 29611, + 15691, + 14300, + 23339, + 15858, + 16798, + 2127, + 19440, + 10761, + 7215, + 8547, + 27266, + 3354, + 27842, + 15566, + 10694, + 16580, + 26534, + 7045, + 1156, + 2241, + 8360, + 29823, + 20937, + 8495, + 18673, + 4077, + 25906, + 26618, + 13107, + 19248, + 20240, + 15114, + 19417, + 1290, + 28221, + 16501, + 2244, + 29564, + 17293, + 5690, + 4846, + 8295, + 3362, + 18258, + 24371, + 28146, + 1545, + 774, + 11090, + 25218, + 3781, + 10219, + 22737, + 8299, + 14713, + 21039, + 14970, + 2542, + 25523, + 24097, + 26398, + 18938, + 19903, + 27500, + 23170, + 24690, + 29637, + 7326, + 26169, + 17451, + 10632, + 24075, + 2563, + 159, + 6450, + 9017, + 6791, + 1181, + 15870, + 3851, + 7654, + 14773, + 22225, + 14130, + 18997, + 17930, + 2317, + 27830, + 129, + 11611, + 13768, + 235, + 20104, + 27153, + 14501, + 28647, + 22986, + 11951, + 6128, + 5771, + 1028, + 21599, + 511, + 6275, + 19325, + 12677, + 11415, + 20949, + 8170, + 16974, + 20503, + 17655, + 25536, + 14981, + 16288, + 7509, + 17202, + 16194, + 7035, + 9781, + 18991, + 22176, + 9525, + 13162, + 1577, + 10446, + 11648, + 811, + 24708, + 25474, + 23298, + 5081, + 26887, + 10340, + 18006, + 18835, + 1076, + 23194, + 13199, + 4560, + 13355, + 4380, + 3088, + 19171, + 1907, + 27946, + 3799, + 22944, + 13174, + 27674, + 25909, + 21592, + 26461, + 15252, + 20346, + 16966, + 13350, + 13986, + 128, + 17399, + 11950, + 27372, + 19067, + 29961, + 3358, + 7519, + 27998, + 23720, + 26811, + 14706, + 29386, + 16678, + 10133, + 25238, + 13867, + 4152, + 27247, + 21477, + 206, + 17199, + 9415, + 15402, + 8942, + 2591, + 7792, + 20036, + 22274, + 1307, + 19909, + 228, + 18954, + 8544, + 22260, + 28684, + 9253, + 5228, + 15718, + 17040, + 27924, + 25289, + 8840, + 27189, + 17460, + 11699, + 24342, + 2911, + 28705, + 9601, + 14377, + 17958, + 22500, + 13939, + 23355, + 16953, + 7737, + 13148, + 15069, + 20642, + 24295, + 27128, + 19000, + 20591, + 8558, + 24959, + 9305, + 22181, + 11286, + 22874, + 26793, + 22112, + 11554, + 24268, + 23012, + 28654, + 15403, + 13024, + 1269, + 5294, + 25683, + 4541, + 11121, + 3542, + 22649, + 28546, + 29174, + 3034, + 5812, + 2609, + 18546, + 20022, + 22207, + 14348, + 13214, + 14388, + 8109, + 13655, + 2799, + 28415, + 15167, + 7605, + 10722, + 5197, + 29017, + 6329, + 24215, + 1101, + 25673, + 8789, + 4242, + 25893, + 17718, + 23740, + 29524, + 14350, + 5356, + 20661, + 5397, + 2862, + 386, + 17105, + 12020, + 7716, + 13875, + 26066, + 24393, + 15417, + 27325, + 23959, + 7412, + 24932, + 6558, + 6872, + 2829, + 16354, + 14938, + 958, + 390, + 13606, + 26629, + 20612, + 3008, + 1760, + 22505, + 4611, + 7601, + 14973, + 12641, + 27319, + 3637, + 10192, + 1898, + 8755, + 20409, + 15633, + 9112, + 21574, + 12484, + 19553, + 4768, + 28228, + 22496, + 16679, + 10229, + 14607, + 7648, + 27886, + 22547, + 14598, + 11467, + 3860, + 2650, + 5099, + 20893, + 5587, + 19143, + 1596, + 12765, + 28366, + 17968, + 15516, + 23361, + 4637, + 17740, + 1411, + 23156, + 10141, + 5757, + 29063, + 11354, + 3234, + 17400, + 23731, + 20996, + 1230, + 21736, + 21918, + 15352, + 10281, + 2035, + 26540, + 5102, + 22262, + 6426, + 22191, + 23548, + 6175, + 27245, + 25699, + 19656, + 21433, + 10233, + 15944, + 17300, + 15139, + 29392, + 10167, + 25653, + 15992, + 16991, + 8881, + 10948, + 27406, + 19781, + 3452, + 6269, + 357, + 6986, + 1107, + 16094, + 4540, + 25209, + 22376, + 4981, + 21895, + 25586, + 26882, + 12696, + 15904, + 12131, + 6347, + 20260, + 16475, + 7172, + 4159, + 5911, + 14962, + 21687, + 20207, + 16681, + 27930, + 8090, + 20358, + 24588, + 16183, + 25011, + 21387, + 27772, + 2987, + 13474, + 1479, + 9252, + 19949, + 11035, + 11527, + 12440, + 16833, + 16592, + 14189, + 13291, + 7180, + 721, + 7799, + 6699, + 14456, + 4338, + 7336, + 10139, + 3092, + 16655, + 7161, + 5072, + 5537, + 27681, + 24991, + 25519, + 651, + 1997, + 20082, + 2394, + 12670, + 15136, + 13263, + 15502, + 25732, + 21639, + 29014, + 24372, + 8568, + 12225, + 6946, + 22029, + 16704, + 1865, + 23385, + 27463, + 19112, + 18229, + 26324, + 28354, + 7582, + 27382, + 3227, + 16265, + 11949, + 13710, + 896, + 9003, + 2065, + 17536, + 8945, + 8795, + 10666, + 21034, + 6312, + 17241, + 12519, + 3132, + 6949, + 22511, + 17561, + 29435, + 3159, + 28019, + 29272, + 28648, + 15154, + 15468, + 12309, + 27724, + 10609, + 4022, + 3103, + 22666, + 2744, + 20580, + 10503, + 8204, + 26428, + 827, + 28461, + 3380, + 9950, + 11643, + 24000, + 9894, + 17042, + 5020, + 22988, + 12763, + 18010, + 12251, + 22190, + 19068, + 24516, + 444, + 4806, + 26377, + 17581, + 19382, + 25934, + 24041, + 19057, + 19941, + 21761, + 13033, + 28771, + 25958, + 2784, + 2185, + 12118, + 3145, + 18910, + 10832, + 11742, + 24778, + 12362, + 20214, + 12710, + 222, + 3800, + 10597, + 15471, + 3589, + 26909, + 9785, + 8406, + 16403, + 7427, + 22553, + 16664, + 3874, + 5822, + 2235, + 350, + 6958, + 20370, + 3905, + 12192, + 25890, + 13648, + 21306, + 29065, + 11240, + 6420, + 5355, + 28187, + 21755, + 10056, + 16305, + 27016, + 4816, + 9328, + 22055, + 1813, + 28598, + 756, + 29471, + 26914, + 22463, + 17188, + 17409, + 4907, + 9731, + 21638, + 15958, + 1058, + 1624, + 3873, + 16046, + 4216, + 18731, + 24679, + 28033, + 24564, + 9713, + 17659, + 14835, + 22128, + 16023, + 2645, + 16452, + 11902, + 24574, + 22305, + 3945, + 22523, + 13310, + 19884, + 6631, + 11513, + 8402, + 10976, + 308, + 2393, + 20220, + 16458, + 22431, + 6597, + 22591, + 17785, + 27643, + 12771, + 24514, + 21625, + 12973, + 18522, + 21060, + 15688, + 10795, + 24137, + 10330, + 13423, + 7159, + 19828, + 10887, + 15783, + 10445, + 27619, + 24742, + 14620, + 12211, + 4734, + 4777, + 27943, + 27939, + 25742, + 6695, + 17912, + 3507, + 14426, + 14646, + 5670, + 24875, + 25899, + 2193, + 24816, + 22483, + 12498, + 12328, + 25686, + 14766, + 16742, + 15682, + 854, + 19790, + 17411, + 18308, + 6598, + 4224, + 7284, + 12563, + 5557, + 17715, + 17243, + 9136, + 2190, + 19221, + 27104, + 27519, + 16539, + 28013, + 19841, + 19344, + 11461, + 12106, + 10106, + 18412, + 12129, + 25268, + 5875, + 13484, + 11403, + 4051, + 14177, + 11491, + 29131, + 6259, + 16417, + 5059, + 6301, + 19023, + 26449, + 10996, + 18613, + 8878, + 22620, + 12158, + 3850, + 4153, + 21386, + 9754, + 17303, + 19044, + 21127, + 18186, + 7753, + 18536, + 26805, + 19370, + 25609, + 8303, + 12697, + 24784, + 11191, + 10196, + 13490, + 25215, + 16254, + 6674, + 7386, + 20437, + 28825, + 22578, + 11030, + 27885, + 1369, + 21740, + 12730, + 15496, + 28476, + 16097, + 8682, + 25390, + 8059, + 1032, + 15543, + 25119, + 10980, + 8233, + 25451, + 25712, + 17124, + 4505, + 6010, + 28385, + 3981, + 11871, + 8234, + 26102, + 17369, + 20285, + 7566, + 10930, + 15221, + 10405, + 25775, + 28268, + 11014, + 1605, + 28870, + 8628, + 19122, + 21403, + 13532, + 16277, + 5466, + 6209, + 16025, + 2905, + 29630, + 9689, + 27412, + 5106, + 5063, + 902, + 14126, + 29320, + 23252, + 14447, + 15774, + 8587, + 18203, + 23882, + 24923, + 9984, + 4780, + 17519, + 13618, + 7304, + 29861, + 23765, + 20483, + 29883, + 6712, + 22560, + 6439, + 10589, + 2622, + 12993, + 14267, + 17847, + 9060, + 21007, + 18531, + 9954, + 116, + 5530, + 13488, + 956, + 27956, + 24508, + 19272, + 1360, + 25889, + 23475, + 23761, + 11717, + 11305, + 10282, + 13040, + 9695, + 13034, + 16170, + 18123, + 19468, + 3509, + 3655, + 13471, + 17193, + 863, + 15338, + 23416, + 13633, + 21777, + 12406, + 22340, + 24594, + 8846, + 27231, + 1749, + 22137, + 17002, + 10343, + 25878, + 4943, + 22420, + 22723, + 19141, + 27165, + 26142, + 19757, + 6207, + 3515, + 11229, + 21068, + 18442, + 10728, + 10655, + 10701, + 14534, + 26502, + 28364, + 26806, + 732, + 2996, + 27743, + 15489, + 20688, + 14971, + 22232, + 24066, + 29105, + 2807, + 16877, + 12403, + 2220, + 16562, + 26107, + 18014, + 18098, + 12395, + 6845, + 27420, + 20356, + 25441, + 14503, + 15501, + 15068, + 21937, + 5705, + 13134, + 14934, + 11000, + 27812, + 23711, + 23226, + 8432, + 27726, + 2702, + 25368, + 787, + 27753, + 25874, + 572, + 10958, + 15672, + 12090, + 15199, + 23692, + 20674, + 19583, + 9037, + 23684, + 16599, + 22808, + 23801, + 20378, + 5353, + 7804, + 5378, + 20513, + 22782, + 21718, + 2547, + 22682, + 27026, + 1539, + 26016, + 7963, + 6767, + 19129, + 17918, + 11239, + 18692, + 20188, + 9959, + 13950, + 12756, + 26634, + 13439, + 24927, + 10255, + 8871, + 15713, + 9125, + 3806, + 6835, + 11827, + 7273, + 25280, + 12808, + 28734, + 28119, + 23285, + 25369, + 18376, + 3062, + 13590, + 2407, + 21894, + 9131, + 8586, + 20030, + 4005, + 8925, + 4487, + 11981, + 14606, + 16680, + 20043, + 12096, + 21377, + 13051, + 29140, + 10115, + 18113, + 11978, + 21147, + 4138, + 26403, + 21737, + 10030, + 29873, + 14603, + 8659, + 251, + 26742, + 19041, + 2061, + 27662, + 1355, + 7168, + 21793, + 18751, + 2067, + 27042, + 12065, + 29957, + 22213, + 6046, + 10741, + 4060, + 28204, + 13052, + 13924, + 29436, + 29485, + 26334, + 27880, + 6665, + 25587, + 8894, + 1663, + 17382, + 14576, + 2310, + 7525, + 796, + 9808, + 28941, + 13678, + 23507, + 15310, + 28621, + 12908, + 24573, + 21189, + 16982, + 24341, + 29036, + 15886, + 11719, + 17743, + 15545, + 15721, + 6115, + 15323, + 29146, + 3421, + 15579, + 18600, + 22349, + 9529, + 3024, + 25227, + 2497, + 577, + 469, + 10504, + 26178, + 20012, + 12021, + 12840, + 14852, + 10064, + 24671, + 13884, + 2024, + 514, + 27119, + 8143, + 20032, + 14360, + 12339, + 9484, + 9865, + 12357, + 4364, + 27386, + 2461, + 8125, + 23569, + 3513, + 338, + 23949, + 25216, + 24255, + 29665, + 8020, + 26446, + 21217, + 22668, + 9700, + 1017, + 5238, + 12402, + 27239, + 24520, + 9348, + 16431, + 25020, + 15752, + 6881, + 9213, + 18480, + 26844, + 4215, + 13175, + 19315, + 18001, + 27312, + 10065, + 12876, + 18699, + 6770, + 1100, + 5365, + 4669, + 27027, + 6088, + 22152, + 23777, + 17783, + 9189, + 19280, + 22312, + 24576, + 27105, + 11487, + 6518, + 24721, + 26477, + 28269, + 10026, + 13327, + 14762, + 29138, + 1201, + 12980, + 8374, + 1098, + 9008, + 11309, + 4365, + 28391, + 2059, + 288, + 24452, + 19918, + 16294, + 23011, + 5095, + 455, + 1298, + 27122, + 13615, + 10968, + 15165, + 7504, + 14838, + 9564, + 23245, + 12752, + 29208, + 332, + 7685, + 23457, + 19573, + 15133, + 24527, + 9224, + 13810, + 20449, + 7773, + 10748, + 26256, + 5968, + 3156, + 1444, + 28218, + 13921, + 12530, + 5021, + 29442, + 9025, + 22368, + 29618, + 28374, + 3995, + 20836, + 10301, + 14324, + 10432, + 642, + 3729, + 29254, + 4915, + 5648, + 16613, + 15183, + 17138, + 18058, + 22468, + 19581, + 2337, + 2000, + 13463, + 15694, + 27550, + 8129, + 23342, + 17542, + 3312, + 23039, + 19689, + 25731, + 4451, + 925, + 12238, + 4375, + 15324, + 5867, + 8666, + 8476, + 29973, + 7573, + 27976, + 10004, + 12255, + 12028, + 25466, + 29309, + 22421, + 27626, + 201, + 17415, + 27735, + 4437, + 13688, + 28899, + 4547, + 15552, + 21111, + 14523, + 13806, + 24951, + 12267, + 25096, + 7830, + 21801, + 12757, + 8545, + 5300, + 8207, + 2538, + 12071, + 6095, + 25139, + 11280, + 17555, + 21246, + 22419, + 7006, + 20794, + 23140, + 19542, + 15498, + 8970, + 21326, + 17007, + 8349, + 26671, + 23971, + 11678, + 20918, + 24324, + 12511, + 21770, + 21763, + 12286, + 20875, + 20854, + 28617, + 12066, + 27186, + 26039, + 4475, + 18431, + 3522, + 13193, + 15205, + 12432, + 19230, + 5953, + 11384, + 14817, + 13335, + 9250, + 17484, + 20514, + 23345, + 24903, + 28390, + 12391, + 12327, + 14839, + 22350, + 16690, + 6612, + 695, + 19418, + 1082, + 3366, + 27557, + 24214, + 25041, + 12787, + 22031, + 3251, + 11785, + 10873, + 1958, + 15810, + 25150, + 16610, + 13938, + 7787, + 18224, + 1335, + 1780, + 24274, + 28359, + 16588, + 22479, + 10508, + 16287, + 28718, + 26735, + 4415, + 8672, + 13155, + 6041, + 21422, + 3193, + 29219, + 14670, + 27136, + 29769, + 4275, + 9363, + 17938, + 22023, + 7496, + 22674, + 18210, + 2426, + 10289, + 19662, + 20911, + 5518, + 7920, + 4931, + 5958, + 24171, + 2479, + 2058, + 5503, + 28029, + 6324, + 19070, + 25713, + 28172, + 28775, + 29925, + 4514, + 1755, + 22330, + 11655, + 19558, + 5617, + 11382, + 15391, + 28323, + 6841, + 5833, + 20526, + 9260, + 21823, + 14727, + 5668, + 16825, + 22834, + 18047, + 18929, + 9137, + 13545, + 10818, + 11293, + 22795, + 19681, + 13961, + 20758, + 14305, + 11691, + 1147, + 18084, + 9222, + 3201, + 8480, + 18288, + 24434, + 2791, + 11928, + 24463, + 15979, + 21487, + 19650, + 20448, + 23312, + 12433, + 3294, + 20953, + 3468, + 17931, + 19802, + 4190, + 21020, + 18892, + 17457, + 20505, + 15523, + 17191, + 13512, + 2837, + 12984, + 2603, + 8179, + 26661, + 10171, + 7944, + 20487, + 11680, + 24771, + 25094, + 3368, + 12199, + 25680, + 1932, + 17558, + 11966, + 23158, + 29538, + 7597, + 26356, + 20889, + 16363, + 19246, + 4515, + 16253, + 29998, + 9432, + 2719, + 1202, + 13421, + 10699, + 24116, + 7406, + 21685, + 4240, + 24103, + 6327, + 7258, + 26047, + 2977, + 19053, + 24221, + 18016, + 7426, + 13259, + 1586, + 29416, + 25721, + 28878, + 17364, + 12657, + 3406, + 11812, + 17046, + 17974, + 23063, + 8688, + 21179, + 9226, + 1917, + 25758, + 13592, + 25756, + 12860, + 7728, + 14984, + 21965, + 5882, + 9568, + 7397, + 16541, + 29642, + 5350, + 15466, + 2306, + 4861, + 818, + 26117, + 23633, + 20, + 6328, + 563, + 24845, + 25891, + 22903, + 22592, + 23890, + 1617, + 11036, + 6288, + 23924, + 19114, + 22132, + 26645, + 22286, + 20007, + 4941, + 3922, + 25395, + 7497, + 974, + 5487, + 2913, + 27074, + 21843, + 22364, + 25359, + 25133, + 18900, + 13980, + 29972, + 3892, + 917, + 16221, + 11289, + 14585, + 26976, + 1918, + 16466, + 13624, + 28393, + 23915, + 606, + 5887, + 22504, + 23642, + 26291, + 26370, + 2070, + 7243, + 29468, + 9089, + 27594, + 12921, + 1742, + 28972, + 14799, + 18021, + 14223, + 3080, + 21210, + 26036, + 13448, + 25323, + 26305, + 17004, + 19871, + 3877, + 1162, + 19300, + 12843, + 6544, + 13623, + 19540, + 6112, + 28573, + 20238, + 5939, + 6414, + 24908, + 21117, + 4793, + 9165, + 13253, + 16240, + 20143, + 24559, + 21240, + 26374, + 15238, + 9488, + 24095, + 8790, + 13963, + 5326, + 17431, + 3428, + 9117, + 14056, + 27283, + 10103, + 6019, + 18525, + 15602, + 11609, + 11548, + 14679, + 22557, + 25836, + 24484, + 21779, + 13531, + 18701, + 12047, + 5623, + 10204, + 9734, + 25442, + 29069, + 16703, + 3583, + 13793, + 29521, + 13249, + 6305, + 4442, + 12057, + 21286, + 17995, + 2077, + 267, + 22732, + 1528, + 20222, + 23834, + 3332, + 26877, + 19367, + 17541, + 22211, + 19643, + 14662, + 4093, + 4057, + 9592, + 29115, + 12954, + 6919, + 16646, + 26636, + 25945, + 3575, + 3992, + 17843, + 19485, + 8181, + 23685, + 12804, + 13643, + 15824, + 3520, + 10148, + 29467, + 6719, + 11540, + 9606, + 24655, + 9630, + 21829, + 18054, + 4545, + 22535, + 11290, + 11737, + 8954, + 15421, + 789, + 27145, + 12194, + 21622, + 6588, + 3809, + 24930, + 8000, + 26719, + 8452, + 13720, + 18841, + 7229, + 11065, + 15232, + 15150, + 24161, + 22931, + 20139, + 3476, + 10390, + 26367, + 10256, + 6077, + 12632, + 23905, + 15572, + 15851, + 26621, + 28157, + 4371, + 10218, + 21807, + 16640, + 27581, + 17103, + 17021, + 19600, + 8997, + 7891, + 4621, + 26709, + 29884, + 4019, + 29713, + 29882, + 11747, + 24962, + 5661, + 23, + 24482, + 13361, + 3110, + 24817, + 19935, + 13429, + 14945, + 3116, + 19375, + 8254, + 20680, + 23896, + 3834, + 22847, + 6031, + 28372, + 21614, + 4709, + 29629, + 3140, + 29170, + 17147, + 13025, + 17923, + 10372, + 26268, + 15482, + 9139, + 8687, + 9227, + 17341, + 19742, + 24140, + 3999, + 15060, + 13968, + 24770, + 25077, + 22655, + 24354, + 8333, + 21321, + 26063, + 17477, + 6755, + 27510, + 4011, + 4130, + 25679, + 24238, + 29035, + 21168, + 6738, + 11326, + 28208, + 717, + 2409, + 19003, + 7088, + 13082, + 14461, + 26135, + 27944, + 5086, + 4884, + 2255, + 1979, + 24470, + 9050, + 19904, + 15097, + 7894, + 1143, + 3440, + 22628, + 22459, + 3952, + 23663, + 16775, + 305, + 11161, + 7324, + 12625, + 22276, + 25572, + 24626, + 20026, + 15659, + 25079, + 19493, + 25034, + 1751, + 24360, + 25998, + 10883, + 21194, + 16984, + 8809, + 7535, + 21227, + 19685, + 29277, + 12585, + 24804, + 29770, + 17764, + 25618, + 11768, + 7617, + 12671, + 14652, + 25606, + 26267, + 4877, + 746, + 3629, + 29508, + 27748, + 19966, + 6289, + 18183, + 18666, + 7122, + 3703, + 3966, + 6757, + 20436, + 3736, + 6436, + 4211, + 12650, + 5167, + 10906, + 28938, + 17571, + 11347, + 4787, + 15667, + 109, + 11266, + 22708, + 16227, + 28552, + 23116, + 5879, + 7475, + 8321, + 20229, + 26559, + 7908, + 23729, + 14552, + 2298, + 4535, + 18606, + 19131, + 18297, + 14068, + 8858, + 15438, + 24766, + 4996, + 19664, + 19135, + 19641, + 2153, + 22515, + 29574, + 13620, + 3263, + 27015, + 14712, + 29602, + 24752, + 26626, + 5018, + 165, + 25625, + 980, + 6743, + 24694, + 20813, + 1358, + 14526, + 13011, + 7910, + 9960, + 999, + 15340, + 16772, + 20703, + 16278, + 22331, + 11682, + 15734, + 24896, + 28301, + 7143, + 14771, + 13097, + 29953, + 2925, + 14144, + 14610, + 6330, + 19483, + 4046, + 15041, + 19004, + 18348, + 7317, + 9462, + 265, + 2943, + 20789, + 2512, + 3042, + 7922, + 7113, + 18734, + 18174, + 27677, + 21606, + 24475, + 6926, + 19100, + 17072, + 24800, + 5977, + 25948, + 25716, + 8918, + 13954, + 10590, + 622, + 26362, + 9236, + 16427, + 8103, + 13538, + 23888, + 18193, + 4597, + 20009, + 22759, + 1861, + 5918, + 5745, + 18306, + 14663, + 25971, + 5673, + 11235, + 20197, + 26906, + 7136, + 15126, + 3010, + 15509, + 25828, + 12250, + 13774, + 6086, + 895, + 14116, + 5891, + 19579, + 20322, + 19537, + 5559, + 16210, + 23370, + 16873, + 4142, + 24971, + 20349, + 7451, + 18045, + 1680, + 25994, + 3933, + 25977, + 15040, + 20743, + 20347, + 11833, + 3397, + 14930, + 29300, + 5318, + 10762, + 3458, + 7715, + 1315, + 24396, + 19646, + 7872, + 28400, + 16173, + 24834, + 14139, + 10559, + 6648, + 9146, + 29181, + 20397, + 22418, + 23753, + 20342, + 21802, + 10040, + 28089, + 13952, + 6625, + 502, + 15369, + 17928, + 19212, + 18195, + 24183, + 9591, + 13414, + 876, + 15474, + 5354, + 22460, + 16585, + 2580, + 3306, + 18457, + 18093, + 1176, + 25136, + 26349, + 15517, + 19999, + 16038, + 11578, + 4548, + 17402, + 14434, + 8998, + 11275, + 5779, + 22681, + 24188, + 8357, + 2772, + 8074, + 670, + 14439, + 11608, + 1320, + 6613, + 9068, + 4804, + 26922, + 487, + 25937, + 2598, + 27715, + 27862, + 16951, + 22204, + 28787, + 26928, + 2313, + 20480, + 16457, + 10348, + 22872, + 6538, + 21654, + 5731, + 1333, + 17841, + 21678, + 18705, + 3763, + 23964, + 13593, + 6985, + 7247, + 14749, + 29536, + 14913, + 2610, + 734, + 22561, + 19126, + 7248, + 12349, + 17762, + 6025, + 20838, + 4020, + 17371, + 411, + 20426, + 10624, + 15087, + 865, + 4061, + 8733, + 9469, + 16178, + 4567, + 6684, + 15914, + 23048, + 14411, + 17263, + 24130, + 14483, + 26995, + 14658, + 26235, + 6976, + 25967, + 15470, + 5713, + 20297, + 1903, + 17495, + 4037, + 29582, + 1109, + 23295, + 28422, + 25132, + 2237, + 15874, + 20413, + 4683, + 1750, + 409, + 16165, + 18664, + 758, + 3293, + 23635, + 3590, + 17631, + 28251, + 204, + 26537, + 18184, + 28398, + 11811, + 29007, + 17859, + 15837, + 10986, + 5574, + 26773, + 12691, + 9904, + 12603, + 14627, + 4831, + 19822, + 18724, + 26627, + 26453, + 8525, + 9936, + 4214, + 25380, + 17535, + 5657, + 24051, + 10830, + 6762, + 21152, + 17635, + 24566, + 88, + 23496, + 14853, + 11739, + 15963, + 13587, + 23109, + 11796, + 10124, + 4109, + 22975, + 20649, + 6135, + 12187, + 29025, + 939, + 29251, + 16489, + 25495, + 13644, + 20509, + 19589, + 2323, + 26567, + 1014, + 5181, + 5201, + 21773, + 16061, + 6537, + 17616, + 16583, + 20208, + 10250, + 9507, + 1009, + 356, + 8141, + 3355, + 24727, + 26992, + 4154, + 25854, + 842, + 28283, + 23460, + 29296, + 115, + 24763, + 27063, + 9024, + 13372, + 12212, + 27493, + 22290, + 13397, + 28050, + 12539, + 28944, + 4994, + 29539, + 26934, + 21921, + 17023, + 2848, + 27037, + 5888, + 29963, + 22073, + 9477, + 22541, + 27277, + 22233, + 720, + 26394, + 340, + 9864, + 20707, + 9393, + 9799, + 2431, + 23061, + 8902, + 4733, + 8180, + 5439, + 18937, + 16997, + 16430, + 14497, + 12939, + 27962, + 6237, + 15857, + 17014, + 15099, + 4156, + 11759, + 2326, + 14119, + 15804, + 14738, + 25421, + 10558, + 12233, + 13038, + 14405, + 13135, + 12134, + 5792, + 21800, + 512, + 19777, + 17097, + 22730, + 825, + 23732, + 25986, + 10101, + 31, + 19624, + 28348, + 12864, + 10261, + 5114, + 19343, + 11571, + 23699, + 20226, + 14336, + 17129, + 11462, + 19585, + 765, + 631, + 22501, + 5384, + 16504, + 18873, + 15525, + 22651, + 28716, + 1220, + 18760, + 5089, + 3222, + 5343, + 19045, + 7677, + 18932, + 949, + 24512, + 9639, + 29203, + 12100, + 17320, + 9701, + 22395, + 7290, + 3011, + 7240, + 22172, + 9969, + 16771, + 8622, + 23532, + 7115, + 8802, + 2498, + 28418, + 6686, + 6015, + 25427, + 8114, + 8391, + 18361, + 19609, + 29420, + 11553, + 3488, + 22443, + 5331, + 27707, + 9763, + 15157, + 19026, + 29977, + 27458, + 14959, + 4474, + 11390, + 5513, + 8226, + 12094, + 16149, + 11028, + 26373, + 22066, + 13016, + 1982, + 22196, + 29313, + 4423, + 26509, + 9938, + 2243, + 27981, + 19917, + 19194, + 5314, + 12474, + 10602, + 8184, + 7176, + 4509, + 26500, + 13646, + 4478, + 1031, + 18674, + 17278, + 20312, + 20538, + 14035, + 5848, + 27972, + 12005, + 3341, + 26491, + 21851, + 27397, + 18946, + 27551, + 2422, + 11979, + 18874, + 3802, + 26250, + 5232, + 6590, + 9615, + 10181, + 26524, + 16836, + 2172, + 16587, + 26052, + 19580, + 16964, + 9381, + 5401, + 8929, + 17215, + 8831, + 23866, + 5471, + 28797, + 10061, + 11909, + 6858, + 6559, + 23439, + 4056, + 12958, + 25762, + 1043, + 7954, + 25103, + 28098, + 14172, + 18268, + 7556, + 11877, + 17562, + 14471, + 590, + 22937, + 987, + 15865, + 24332, + 1638, + 10377, + 6036, + 25060, + 8475, + 16147, + 13217, + 18861, + 2467, + 5361, + 16691, + 13090, + 26744, + 24808, + 5902, + 20886, + 21500, + 21320, + 6990, + 1681, + 723, + 13111, + 29104, + 10275, + 3674, + 12811, + 24526, + 27785, + 26647, + 8817, + 16337, + 13601, + 13513, + 491, + 12183, + 8836, + 162, + 24759, + 23986, + 28794, + 16850, + 14285, + 10576, + 8610, + 9455, + 326, + 21289, + 21604, + 22907, + 17346, + 15115, + 27954, + 25765, + 19190, + 13611, + 8767, + 5901, + 15237, + 18263, + 19794, + 19380, + 28607, + 26402, + 28672, + 13549, + 3776, + 890, + 10870, + 22295, + 4140, + 11484, + 20305, + 15216, + 10122, + 23988, + 25534, + 19165, + 665, + 21466, + 2345, + 6687, + 6215, + 4977, + 19292, + 93, + 22020, + 18514, + 14343, + 29155, + 25157, + 26542, + 15505, + 11174, + 10905, + 8068, + 6250, + 23129, + 22980, + 4322, + 9274, + 27873, + 22521, + 28142, + 6389, + 22634, + 26155, + 21996, + 4869, + 8005, + 28071, + 2401, + 29572, + 18199, + 3242, + 17374, + 13932, + 27741, + 19825, + 14507, + 28919, + 14425, + 8352, + 11178, + 4862, + 14013, + 17010, + 20324, + 6527, + 22062, + 4511, + 21113, + 13352, + 23643, + 321, + 15258, + 22537, + 19615, + 9886, + 1137, + 19111, + 26218, + 5393, + 15643, + 18225, + 5924, + 29129, + 9697, + 19886, + 10806, + 16420, + 20097, + 8339, + 25833, + 7568, + 6747, + 24872, + 2544, + 29810, + 10310, + 8508, + 24751, + 11743, + 27751, + 19814, + 13238, + 6643, + 1802, + 11590, + 15070, + 4480, + 21916, + 7878, + 10283, + 21251, + 21836, + 5440, + 2455, + 29269, + 6433, + 845, + 12460, + 19163, + 3633, + 23899, + 15083, + 7696, + 10665, + 25069, + 16072, + 9185, + 10562, + 7249, + 5809, + 26760, + 22949, + 20064, + 13694, + 6206, + 2736, + 10601, + 27866, + 4851, + 6758, + 14111, + 23187, + 8345, + 12694, + 8560, + 16292, + 675, + 178, + 26419, + 3870, + 20587, + 12772, + 15281, + 14564, + 17566, + 54, + 22438, + 10943, + 21473, + 3846, + 12227, + 10315, + 29878, + 11471, + 24196, + 25188, + 27881, + 1051, + 15381, + 7246, + 7510, + 14822, + 6909, + 260, + 16091, + 29191, + 24982, + 8873, + 6451, + 6253, + 27801, + 6988, + 29704, + 13708, + 331, + 14401, + 2051, + 11959, + 16590, + 10018, + 25952, + 22109, + 14303, + 3581, + 25525, + 27241, + 25355, + 7583, + 1646, + 13661, + 20755, + 19591, + 25367, + 1996, + 23908, + 23449, + 25561, + 26867, + 22576, + 12392, + 20941, + 24389, + 23472, + 10808, + 7953, + 22993, + 7401, + 643, + 29534, + 12510, + 4659, + 10443, + 20936, + 15864, + 5631, + 6027, + 15829, + 23056, + 16870, + 2847, + 7061, + 8887, + 18150, + 22801, + 4356, + 27072, + 3467, + 9767, + 20481, + 4126, + 22974, + 15782, + 9986, + 4312, + 17249, + 1128, + 9064, + 18261, + 16373, + 13848, + 26097, + 22400, + 6361, + 323, + 5205, + 20341, + 15193, + 24019, + 22792, + 24237, + 26682, + 4203, + 23599, + 7471, + 17238, + 7997, + 25659, + 1765, + 18855, + 14165, + 25863, + 11751, + 21778, + 20258, + 9047, + 24271, + 6493, + 2420, + 4488, + 2383, + 16352, + 23922, + 23691, + 8581, + 16618, + 21904, + 7507, + 18744, + 13608, + 25752, + 4565, + 8957, + 1054, + 13229, + 17550, + 14326, + 18979, + 24120, + 27289, + 11126, + 7828, + 1154, + 10388, + 16479, + 29844, + 15537, + 29371, + 2325, + 14140, + 2052, + 5451, + 23311, + 5709, + 9194, + 2737, + 2081, + 12669, + 23502, + 7288, + 23861, + 3822, + 13302, + 761, + 13522, + 9714, + 3252, + 4237, + 17692, + 6788, + 7349, + 19094, + 17502, + 23860, + 18411, + 13969, + 19602, + 28568, + 25492, + 2929, + 3426, + 4272, + 5942, + 23717, + 5885, + 9698, + 3349, + 13041, + 21399, + 7335, + 4097, + 8875, + 19467, + 12905, + 27628, + 13705, + 8531, + 2178, + 24178, + 11113, + 5120, + 5769, + 5566, + 10681, + 2633, + 22918, + 26121, + 12331, + 19006, + 5251, + 8636, + 17779, + 19552, + 29333, + 28134, + 26610, + 16355, + 20997, + 14561, + 211, + 26552, + 8396, + 7117, + 4786, + 391, + 1562, + 21756, + 11274, + 21643, + 12801, + 12688, + 6602, + 4912, + 16422, + 27282, + 3245, + 13578, + 20196, + 5274, + 24094, + 19611, + 14506, + 22148, + 16963, + 27109, + 19437, + 29262, + 28785, + 2419, + 12509, + 19491, + 5198, + 7489, + 243, + 13499, + 18927, + 242, + 27216, + 9074, + 8457, + 25935, + 11964, + 14132, + 19984, + 11392, + 13247, + 24022, + 15780, + 14636, + 26579, + 11252, + 22837, + 2521, + 22246, + 28853, + 5443, + 28055, + 28665, + 21093, + 21749, + 25746, + 25190, + 25946, + 6314, + 3757, + 4798, + 1934, + 5791, + 23317, + 15558, + 1600, + 4348, + 12355, + 14889, + 6293, + 2757, + 20011, + 1989, + 8224, + 8439, + 7141, + 22509, + 28541, + 12082, + 8532, + 10214, + 18205, + 6811, + 6815, + 24725, + 29252, + 7999, + 29732, + 23696, + 13426, + 29593, + 11662, + 16628, + 7564, + 28739, + 1375, + 20038, + 1773, + 1057, + 20440, + 26834, + 7833, + 10188, + 25455, + 14630, + 9231, + 11708, + 11889, + 885, + 23906, + 16717, + 12623, + 26123, + 17945, + 25573, + 17976, + 6560, + 25296, + 4465, + 27608, + 29120, + 25974, + 18814, + 24905, + 15577, + 17950, + 9033, + 293, + 736, + 5151, + 12800, + 14488, + 16232, + 1067, + 19200, + 27621, + 3750, + 26171, + 26151, + 14698, + 9883, + 29249, + 24291, + 21985, + 11287, + 22007, + 21243, + 21670, + 9497, + 15101, + 9254, + 3994, + 7334, + 25877, + 772, + 3243, + 13064, + 4905, + 22956, + 5810, + 15756, + 5214, + 13226, + 5501, + 15631, + 18747, + 23189, + 3843, + 14474, + 2960, + 7712, + 11677, + 11920, + 23131, + 15796, + 25330, + 20590, + 19403, + 12595, + 19494, + 15314, + 23247, + 23689, + 27055, + 8803, + 11071, + 10780, + 231, + 13256, + 11754, + 26646, + 26410, + 28012, + 10404, + 25086, + 3895, + 1988, + 14848, + 17159, + 10985, + 14956, + 26282, + 14716, + 27313, + 27644, + 7447, + 17694, + 22435, + 16753, + 28889, + 16916, + 18180, + 23029, + 25727, + 21679, + 1576, + 12275, + 20933, + 10438, + 5174, + 24213, + 24498, + 6746, + 13325, + 22549, + 10604, + 25882, + 10023, + 10260, + 11801, + 6828, + 18452, + 18987, + 18490, + 14874, + 13745, + 20833, + 17592, + 27689, + 18342, + 9098, + 18847, + 3557, + 18652, + 24260, + 29125, + 4605, + 18477, + 12726, + 12949, + 2604, + 19222, + 27718, + 8095, + 18840, + 7118, + 11830, + 8847, + 10437, + 4398, + 13659, + 24119, + 10869, + 1158, + 14427, + 7054, + 3573, + 22960, + 27865, + 24317, + 7055, + 28249, + 14331, + 28781, + 26070, + 28074, + 15063, + 6021, + 20616, + 15726, + 6706, + 11942, + 19309, + 5339, + 20052, + 28178, + 1195, + 24672, + 6748, + 1295, + 25597, + 15409, + 6780, + 19509, + 21659, + 27609, + 17269, + 4685, + 16812, + 10768, + 1394, + 8984, + 5790, + 18022, + 15862, + 1198, + 23192, + 16518, + 1618, + 11192, + 25612, + 20549, + 13432, + 27263, + 10739, + 11033, + 5729, + 3276, + 22237, + 29941, + 7034, + 15877, + 6431, + 17388, + 27043, + 14570, + 4897, + 10502, + 20442, + 3815, + 1138, + 26447, + 5663, + 2922, + 9500, + 16625, + 14952, + 9333, + 24865, + 13909, + 8055, + 21934, + 18373, + 9168, + 11017, + 29699, + 10332, + 26040, + 12627, + 5988, + 4961, + 9728, + 27867, + 17736, + 4681, + 19429, + 3475, + 19216, + 26274, + 14397, + 14980, + 9555, + 27846, + 28037, + 26226, + 14415, + 24996, + 5826, + 24640, + 6655, + 2849, + 25422, + 22147, + 25502, + 22485, + 18337, + 12274, + 24960, + 13517, + 26787, + 13431, + 18570, + 15769, + 16214, + 20697, + 12999, + 6432, + 1647, + 1868, + 17594, + 4282, + 2582, + 27831, + 14433, + 5153, + 26923, + 8048, + 17356, + 28659, + 6972, + 2880, + 5434, + 21380, + 14925, + 12055, + 18449, + 461, + 17731, + 24941, + 25846, + 23644, + 13989, + 3827, + 2857, + 25401, + 4771, + 29424, + 21689, + 17422, + 4432, + 9052, + 15404, + 24536, + 3134, + 7993, + 12581, + 2315, + 5093, + 7642, + 18359, + 17878, + 29760, + 19116, + 5889, + 11245, + 24322, + 5268, + 10202, + 19616, + 17121, + 18496, + 16425, + 27966, + 29563, + 2537, + 28735, + 2283, + 15479, + 17250, + 3026, + 24429, + 20722, + 1149, + 5133, + 1357, + 26115, + 6179, + 18951, + 12425, + 14674, + 20577, + 2701, + 20076, + 32, + 1130, + 14855, + 15286, + 4519, + 11880, + 28876, + 1346, + 27686, + 11651, + 14313, + 18680, + 23581, + 4229, + 28615, + 13059, + 13736, + 8435, + 6119, + 21549, + 18339, + 3411, + 4440, + 27595, + 4195, + 27044, + 7528, + 21494, + 25660, + 20607, + 4568, + 13510, + 18478, + 19235, + 23726, + 12823, + 27969, + 24556, + 16617, + 7090, + 13376, + 3081, + 25602, + 14421, + 25436, + 18639, + 18867, + 15972, + 6484, + 24668, + 38, + 3957, + 12013, + 22600, + 6833, + 5497, + 27370, + 13269, + 27039, + 15140, + 18033, + 5069, + 22324, + 7221, + 22220, + 20914, + 778, + 6295, + 19831, + 9, + 27760, + 15055, + 7383, + 27094, + 25745, + 24791, + 1388, + 18509, + 11195, + 753, + 22709, + 11939, + 19182, + 17587, + 19503, + 4464, + 3454, + 23812, + 26380, + 23871, + 24096, + 4901, + 23832, + 10520, + 4198, + 29877, + 1053, + 14229, + 20932, + 14546, + 4792, + 3474, + 26631, + 13677, + 19860, + 897, + 9834, + 21816, + 25046, + 29865, + 27032, + 27648, + 2229, + 11155, + 2895, + 187, + 3097, + 23372, + 21340, + 19107, + 17321, + 23529, + 3720, + 9922, + 27271, + 21199, + 8613, + 11794, + 24906, + 21870, + 2358, + 8526, + 16601, + 29777, + 18326, + 28730, + 19636, + 11713, + 12048, + 3045, + 12213, + 9738, + 23077, + 18304, + 28017, + 12690, + 3387, + 20745, + 14469, + 15457, + 10324, + 13789, + 13158, + 13733, + 17729, + 17712, + 28129, + 2594, + 3258, + 13242, + 15647, + 9331, + 26309, + 29525, + 12344, + 9659, + 8968, + 21597, + 25285, + 10653, + 253, + 3759, + 24365, + 894, + 15197, + 7542, + 6769, + 22027, + 14417, + 29860, + 26482, + 19527, + 9533, + 23205, + 25053, + 7164, + 18360, + 8865, + 21372, + 7793, + 25861, + 22450, + 15187, + 2952, + 14050, + 5700, + 12562, + 17698, + 7163, + 11647, + 4116, + 2397, + 16450, + 25711, + 13294, + 8400, + 19792, + 8309, + 25377, + 6650, + 28782, + 8009, + 3882, + 26422, + 15784, + 7930, + 4819, + 1006, + 393, + 17709, + 3960, + 14037, + 12208, + 1419, + 28817, + 4795, + 14644, + 22915, + 24293, + 13492, + 26006, + 952, + 23979, + 8603, + 10284, + 11401, + 29719, + 25460, + 16591, + 23977, + 7571, + 16913, + 3805, + 16503, + 10321, + 26062, + 29397, + 4672, + 9995, + 22306, + 8916, + 25239, + 28211, + 21069, + 249, + 14514, + 26833, + 21191, + 25585, + 10331, + 27552, + 197, + 13725, + 23574, + 348, + 2113, + 15787, + 13667, + 12077, + 17766, + 9858, + 21757, + 28280, + 17483, + 23984, + 5832, + 12470, + 9875, + 6205, + 4573, + 4280, + 27208, + 14372, + 14473, + 9612, + 18817, + 16119, + 2213, + 5002, + 13803, + 22203, + 5590, + 24553, + 27438, + 19933, + 6026, + 11724, + 14847, + 18347, + 452, + 17398, + 14726, + 20161, + 13381, + 4421, + 28487, + 17214, + 23474, + 16861, + 4626, + 26411, + 4419, + 17143, + 14493, + 6073, + 9201, + 3413, + 22833, + 22574, + 20498, + 1532, + 4034, + 15356, + 27047, + 15377, + 56, + 8585, + 6913, + 9562, + 29248, + 4135, + 9043, + 6705, + 9979, + 29199, + 20619, + 8041, + 28630, + 19672, + 1503, + 2647, + 13161, + 13169, + 27911, + 20754, + 7592, + 3967, + 7545, + 478, + 4609, + 25414, + 23289, + 23022, + 17187, + 4558, + 16733, + 19725, + 25336, + 12583, + 1516, + 8757, + 18876, + 14416, + 257, + 5509, + 9267, + 14678, + 15134, + 6064, + 28698, + 13864, + 9502, + 18206, + 20550, + 5646, + 528, + 653, + 24462, + 6809, + 18338, + 15151, + 23629, + 17058, + 14133, + 13342, + 17829, + 25915, + 17090, + 26139, + 2027, + 18243, + 6116, + 26343, + 21406, + 21582, + 13386, + 15737, + 9239, + 25892, + 27531, + 19667, + 404, + 18187, + 29589, + 18051, + 25321, + 25230, + 18101, + 15902, + 10400, + 17438, + 28912, + 24607, + 1344, + 28884, + 21506, + 13485, + 22559, + 26566, + 19253, + 2386, + 20954, + 21505, + 25547, + 10961, + 18377, + 19519, + 10673, + 26854, + 16329, + 8104, + 29721, + 5330, + 19881, + 21502, + 692, + 25364, + 8119, + 22008, + 27515, + 20236, + 27809, + 21322, + 24212, + 26654, + 3214, + 12923, + 14321, + 10392, + 22154, + 20718, + 12950, + 28480, + 13323, + 136, + 5681, + 8268, + 8305, + 23786, + 22221, + 20979, + 20172, + 11572, + 3108, + 2292, + 27150, + 13941, + 15891, + 13632, + 8728, + 1299, + 24203, + 2901, + 19105, + 66, + 20441, + 10801, + 394, + 873, + 15017, + 21318, + 15000, + 26085, + 13028, + 18626, + 7191, + 21920, + 25177, + 20805, + 14857, + 26136, + 16807, + 16114, + 13125, + 22343, + 4355, + 18712, + 6139, + 8032, + 19562, + 22353, + 3006, + 25316, + 8025, + 19443, + 13092, + 13743, + 27803, + 10912, + 15869, + 18273, + 1167, + 15300, + 19482, + 13946, + 12584, + 18663, + 23790, + 25788, + 6773, + 14298, + 11236, + 8826, + 12265, + 16336, + 15642, + 11269, + 16942, + 2072, + 29714, + 27562, + 7461, + 11325, + 25856, + 9235, + 18217, + 24842, + 3823, + 25006, + 27218, + 4964, + 5940, + 17839, + 3758, + 4959, + 29026, + 934, + 12818, + 29796, + 21640, + 17329, + 13145, + 2729, + 5980, + 21706, + 24691, + 14204, + 4614, + 7319, + 5157, + 14096, + 12104, + 8148, + 24540, + 21307, + 27144, + 25297, + 3514, + 27869, + 19322, + 9399, + 6659, + 17990, + 17164, + 22374, + 13812, + 4665, + 8876, + 7064, + 20640, + 28517, + 21940, + 10973, + 29565, + 7620, + 29978, + 20395, + 7797, + 10914, + 14924, + 26546, + 23430, + 7972, + 94, + 18916, + 229, + 13638, + 5511, + 5633, + 11836, + 29510, + 6585, + 15090, + 15794, + 29043, + 14232, + 453, + 17537, + 123, + 8813, + 2689, + 29697, + 23752, + 25565, + 560, + 15186, + 21644, + 5857, + 13166, + 22598, + 10856, + 18669, + 5950, + 9853, + 28743, + 18321, + 21680, + 21848, + 19635, + 26997, + 18950, + 79, + 16027, + 26005, + 6794, + 10854, + 21391, + 25385, + 259, + 27157, + 21280, + 17600, + 19442, + 13566, + 29871, + 10427, + 23937, + 20519, + 12527, + 2390, + 21099, + 28073, + 22670, + 13489, + 18804, + 14276, + 9951, + 25706, + 17454, + 19408, + 1727, + 3194, + 21513, + 11738, + 18906, + 1321, + 7261, + 448, + 14097, + 7546, + 181, + 13141, + 10789, + 25328, + 18492, + 29728, + 27414, + 11273, + 6445, + 8433, + 704, + 4400, + 7469, + 13094, + 6243, + 16912, + 53, + 21952, + 15893, + 15076, + 15622, + 16858, + 11988, + 11441, + 15962, + 22912, + 17707, + 29723, + 13589, + 21683, + 2554, + 22058, + 18928, + 17816, + 1784, + 14192, + 15367, + 13827, + 9965, + 23107, + 13816, + 5107, + 6067, + 26850, + 9513, + 8296, + 12288, + 1746, + 13771, + 11353, + 24894, + 28953, + 27030, + 5177, + 27547, + 19835, + 20762, + 1610, + 10556, + 8627, + 1635, + 2714, + 25007, + 3457, + 10435, + 22590, + 28282, + 18588, + 15092, + 8578, + 9286, + 14334, + 18252, + 21362, + 19892, + 25329, + 9567, + 28945, + 12533, + 3731, + 11671, + 22859, + 6063, + 28132, + 10157, + 19630, + 3886, + 10532, + 29727, + 14724, + 3391, + 10732, + 15451, + 22982, + 5150, + 6709, + 739, + 17366, + 1024, + 7256, + 20384, + 9660, + 5090, + 29906, + 28185, + 13454, + 16408, + 2487, + 25767, + 19837, + 22493, + 9794, + 25191, + 17310, + 6776, + 10079, + 11502, + 21917, + 1936, + 887, + 16279, + 7154, + 15644, + 26089, + 29427, + 2296, + 23415, + 27607, + 24669, + 1376, + 2752, + 6291, + 28916, + 6452, + 5992, + 10518, + 27914, + 14802, + 5041, + 26971, + 553, + 29636, + 19706, + 11478, + 17820, + 5629, + 23060, + 26233, + 16247, + 28930, + 9241, + 23027, + 5883, + 3099, + 4145, + 2745, + 11599, + 8121, + 6568, + 17028, + 1127, + 19734, + 28196, + 18866, + 7280, + 28606, + 21768, + 27618, + 4074, + 29558, + 3463, + 15651, + 13061, + 20964, + 29460, + 16840, + 29872, + 11594, + 7643, + 10044, + 1940, + 16552, + 11088, + 5370, + 254, + 7743, + 3688, + 2388, + 26545, + 4304, + 1703, + 21788, + 12486, + 8280, + 5173, + 9100, + 7189, + 20193, + 18236, + 28542, + 11228, + 17226, + 14293, + 23463, + 10890, + 3051, + 21931, + 14413, + 18456, + 14077, + 22026, + 25881, + 10772, + 27713, + 25569, + 24312, + 21760, + 41, + 20597, + 24757, + 13897, + 29926, + 6131, + 17689, + 12520, + 17052, + 36, + 11955, + 13777, + 11533, + 20019, + 10568, + 9386, + 8182, + 28724, + 3887, + 4670, + 8317, + 3611, + 7693, + 23223, + 1044, + 10, + 21105, + 17776, + 22185, + 28795, + 15182, + 27878, + 18607, + 1667, + 7947, + 14525, + 1056, + 19090, + 17480, + 15685, + 16441, + 4813, + 16145, + 20876, + 16069, + 8084, + 6894, + 2006, + 13264, + 12489, + 7796, + 6641, + 21140, + 27782, + 6083, + 15761, + 27185, + 768, + 10099, + 25462, + 2173, + 6797, + 13700, + 524, + 29965, + 8080, + 19306, + 3077, + 17577, + 9093, + 7076, + 14621, + 29438, + 7337, + 25740, + 13896, + 27953, + 23739, + 19355, + 11468, + 15666, + 24968, + 5015, + 13577, + 4251, + 2680, + 23853, + 27112, + 27828, + 10440, + 458, + 6818, + 16730, + 9034, + 13120, + 20773, + 11418, + 16435, + 372, + 10611, + 21602, + 9821, + 19080, + 13900, + 9087, + 17874, + 5786, + 21272, + 5928, + 180, + 18034, + 19993, + 2808, + 27347, + 2101, + 5379, + 24265, + 21019, + 5862, + 24662, + 12017, + 15130, + 23407, + 21915, + 7574, + 6040, + 22536, + 22313, + 12230, + 23799, + 11492, + 8800, + 20223, + 684, + 19937, + 23982, + 7904, + 8441, + 15168, + 2300, + 12855, + 12877, + 13022, + 28320, + 19939, + 4800, + 25090, + 17233, + 16622, + 12144, + 10143, + 16342, + 28384, + 6759, + 26784, + 8852, + 954, + 6061, + 28256, + 2825, + 17845, + 21880, + 3621, + 28063, + 7598, + 3516, + 9045, + 4719, + 23151, + 16558, + 6993, + 17672, + 24660, + 27505, + 13012, + 6510, + 17887, + 24681, + 9110, + 5516, + 21924, + 1790, + 4413, + 8725, + 9063, + 22698, + 15440, + 18385, + 20816, + 13571, + 22743, + 29091, + 716, + 3511, + 25802, + 17532, + 22924, + 3930, + 6880, + 19839, + 6400, + 7230, + 3700, + 29800, + 23461, + 2450, + 14583, + 11475, + 18964, + 25619, + 21348, + 23719, + 1245, + 27802, + 29947, + 29172, + 12889, + 4821, + 4991, + 23682, + 12169, + 5147, + 28108, + 26337, + 21865, + 6731, + 27405, + 4963, + 16794, + 3206, + 23409, + 24590, + 12334, + 3270, + 19029, + 13863, + 28859, + 9873, + 9903, + 12374, + 29959, + 25245, + 29072, + 20635, + 16231, + 16682, + 26396, + 25763, + 18823, + 13657, + 3115, + 7625, + 13201, + 27291, + 13142, + 12721, + 22652, + 25548, + 24970, + 10714, + 11072, + 17330, + 29384, + 28358, + 10998, + 4676, + 23973, + 15005, + 12112, + 3244, + 29604, + 21746, + 13309, + 12249, + 20558, + 349, + 15413, + 27616, + 12722, + 10344, + 29258, + 410, + 11021, + 17891, + 3864, + 17981, + 7896, + 8513, + 15392, + 6016, + 6649, + 1730, + 3885, + 26940, + 2573, + 28706, + 10667, + 6848, + 29032, + 3043, + 27054, + 22316, + 17668, + 207, + 327, + 7858, + 7018, + 25554, + 16236, + 12933, + 8323, + 838, + 3708, + 1902, + 21942, + 21448, + 12295, + 4529, + 10501, + 21094, + 13483, + 24020, + 17946, + 7050, + 18677, + 3891, + 26673, + 21183, + 4330, + 11767, + 19120, + 7886, + 15557, + 21443, + 26957, + 29330, + 6214, + 12358, + 3728, + 6724, + 15853, + 12338, + 26697, + 26196, + 10567, + 29001, + 16606, + 1404, + 24628, + 19950, + 8072, + 9454, + 6167, + 15326, + 10763, + 6904, + 11915, + 11143, + 1584, + 16635, + 8371, + 27230, + 17259, + 4742, + 13751, + 16855, + 5589, + 12573, + 26980, + 6296, + 11170, + 20173, + 19545, + 9255, + 15386, + 20473, + 16341, + 24522, + 23715, + 23779, + 16725, + 20061, + 5815, + 20000, + 25913, + 7131, + 26681, + 4779, + 26910, + 17062, + 4151, + 24098, + 10829, + 3977, + 233, + 10595, + 14919, + 20320, + 994, + 3195, + 886, + 1242, + 27422, + 1081, + 29846, + 12449, + 10600, + 7079, + 12704, + 11521, + 23836, + 22254, + 12621, + 21474, + 26752, + 29066, + 9435, + 23854, + 5819, + 9094, + 22906, + 22664, + 20865, + 21787, + 4497, + 19964, + 18999, + 25583, + 23305, + 5391, + 16881, + 14495, + 15617, + 11091, + 16671, + 4904, + 13062, + 28952, + 25852, + 20459, + 6401, + 10180, + 5304, + 1943, + 27056, + 25744, + 7518, + 27569, + 13717, + 9561, + 18503, + 7967, + 18834, + 16846, + 15655, + 7042, + 18648, + 16262, + 10819, + 1492, + 12299, + 467, + 1955, + 19479, + 10053, + 17357, + 7096, + 15044, + 5959, + 15313, + 28753, + 15116, + 20406, + 14612, + 15845, + 25657, + 28227, + 5667, + 15337, + 13449, + 2404, + 29087, + 7085, + 9041, + 6994, + 3606, + 17154, + 250, + 21398, + 27262, + 21316, + 8749, + 14379, + 3309, + 21143, + 24259, + 12011, + 9544, + 3162, + 1808, + 7474, + 7604, + 27667, + 18925, + 17971, + 17458, + 20731, + 7640, + 18667, + 19379, + 12002, + 10975, + 1904, + 16156, + 1525, + 322, + 14287, + 17390, + 23024, + 19969, + 11187, + 17866, + 20523, + 11224, + 13691, + 25179, + 23286, + 22409, + 8660, + 27819, + 19610, + 11057, + 6656, + 15022, + 13068, + 15570, + 25646, + 20527, + 18155, + 22386, + 9884, + 923, + 4662, + 19975, + 19265, + 9730, + 3628, + 15601, + 7466, + 4562, + 16045, + 27446, + 9766, + 28226, + 4035, + 8671, + 7635, + 2273, + 6491, + 2773, + 12418, + 3518, + 26712, + 27276, + 9726, + 27353, + 3221, + 12592, + 3394, + 16842, + 23425, + 359, + 26271, + 16773, + 16218, + 16777, + 4918, + 19638, + 21050, + 26775, + 7250, + 28522, + 20977, + 200, + 1676, + 17253, + 28932, + 28746, + 21709, + 23386, + 25340, + 11761, + 21902, + 17673, + 24631, + 1530, + 5855, + 6906, + 12476, + 18071, + 14911, + 15443, + 16521, + 2793, + 13047, + 15578, + 9277, + 29707, + 29812, + 19654, + 11070, + 28650, + 633, + 11704, + 19019, + 9578, + 25655, + 2871, + 27546, + 15539, + 21061, + 13719, + 4510, + 10021, + 23173, + 8597, + 24211, + 28738, + 16633, + 17150, + 19153, + 24724, + 29908, + 13010, + 7063, + 19324, + 28332, + 18465, + 11433, + 18940, + 6547, + 10493, + 17803, + 18266, + 6734, + 27600, + 418, + 20010, + 18246, + 15028, + 5500, + 7047, + 938, + 29954, + 11077, + 20235, + 21209, + 17456, + 18796, + 14487, + 1553, + 14664, + 9654, + 17505, + 11311, + 28856, + 12727, + 22338, + 17148, + 1930, + 18643, + 16992, + 21871, + 13221, + 19400, + 2421, + 10598, + 28548, + 751, + 14774, + 15670, + 6781, + 24973, + 28560, + 11685, + 13004, + 17251, + 9149, + 301, + 9126, + 12917, + 22390, + 23259, + 18795, + 23265, + 12963, + 12087, + 5362, + 18737, + 12766, + 7521, + 15146, + 23081, + 21962, + 8202, + 17336, + 23535, + 15035, + 13576, + 29393, + 17047, + 6380, + 14659, + 24839, + 13211, + 28339, + 2626, + 101, + 339, + 25961, + 15425, + 25605, + 11529, + 14892, + 29763, + 9652, + 28656, + 22659, + 4072, + 11991, + 18768, + 28959, + 8498, + 14625, + 7363, + 9217, + 28024, + 13822, + 24331, + 24572, + 4067, + 1296, + 26192, + 3036, + 18713, + 19606, + 4149, + 8473, + 18739, + 15531, + 3096, + 11522, + 4191, + 12518, + 3559, + 23319, + 13960, + 15989, + 22968, + 20326, + 24112, + 14330, + 6751, + 20646, + 9204, + 9495, + 28521, + 22333, + 2817, + 16563, + 25595, + 5137, + 5605, + 8465, + 23957, + 3785, + 28355, + 25654, + 21248, + 6403, + 27928, + 24374, + 17512, + 11377, + 24318, + 13987, + 29614, + 19454, + 25943, + 23466, + 27465, + 7126, + 12043, + 1649, + 9733, + 9791, + 17445, + 15004, + 26211, + 1637, + 8979, + 16052, + 14996, + 26443, + 23873, + 19626, + 11380, + 8466, + 11387, + 7644, + 9342, + 11773, + 19179, + 25883, + 17922, + 5234, + 22724, + 18031, + 14196, + 25234, + 22371, + 7740, + 27759, + 7590, + 29180, + 10962, + 11318, + 27767, + 21004, + 14314, + 27316, + 4444, + 7704, + 7077, + 17588, + 16395, + 11619, + 17543, + 28083, + 15511, + 7890, + 1565, + 12651, + 24015, + 25105, + 10544, + 14657, + 14385, + 19335, + 29875, + 4370, + 20535, + 4690, + 25439, + 17031, + 2118, + 1693, + 9520, + 28449, + 2043, + 23524, + 3154, + 13015, + 1313, + 23231, + 2917, + 23102, + 4687, + 19350, + 23998, + 22614, + 23257, + 6018, + 23929, + 8685, + 2964, + 21180, + 15497, + 1623, + 60, + 918, + 10750, + 15564, + 2005, + 8496, + 28072, + 21732, + 10241, + 29742, + 23597, + 29189, + 13404, + 1275, + 2351, + 10639, + 25335, + 18947, + 23146, + 27328, + 20470, + 24885, + 12455, + 28777, + 13312, + 6251, + 13284, + 7139, + 13281, + 13836, + 12868, + 13356, + 8158, + 28918, + 26364, + 1554, + 8964, + 27583, + 14205, + 28002, + 14967, + 25118, + 22451, + 14685, + 8551, + 4120, + 9760, + 28744, + 13457, + 14684, + 312, + 20999, + 29494, + 27693, + 17568, + 21835, + 18400, + 28197, + 12239, + 17317, + 20988, + 25167, + 192, + 14082, + 24050, + 14284, + 23567, + 18842, + 5423, + 14801, + 13382, + 7271, + 23847, + 26147, + 2263, + 15295, + 1578, + 17492, + 15177, + 15047, + 3639, + 903, + 6343, + 14968, + 1928, + 10838, + 16199, + 22861, + 21169, + 337, + 16297, + 1878, + 21215, + 18865, + 23697, + 7656, + 12324, + 15267, + 18451, + 28499, + 8210, + 28813, + 23509, + 5149, + 23837, + 6923, + 18521, + 20295, + 2692, + 14872, + 14226, + 24957, + 15610, + 10016, + 29466, + 13716, + 27696, + 9634, + 5841, + 13607, + 17153, + 21663, + 4014, + 1787, + 8497, + 13070, + 417, + 10367, + 7960, + 8286, + 26314, + 17978, + 21521, + 23397, + 10350, + 5664, + 27164, + 2930, + 10138, + 17826, + 17720, + 14311, + 9070, + 17900, + 22556, + 12633, + 1794, + 27269, + 23504, + 8088, + 29042, + 27270, + 28544, + 17479, + 9506, + 21188, + 16513, + 2458, + 8821, + 10682, + 1869, + 27010, + 17884, + 26221, + 21559, + 21408, + 14063, + 18831, + 24591, + 384, + 6521, + 4090, + 25171, + 29271, + 5660, + 14511, + 5045, + 24809, + 16865, + 20168, + 7607, + 28443, + 5884, + 7880, + 3791, + 18130, + 17318, + 21956, + 21274, + 8723, + 1016, + 26421, + 23092, + 10467, + 11346, + 10455, + 18742, + 13371, + 25031, + 21319, + 7, + 18802, + 27576, + 9861, + 19832, + 24850, + 21182, + 14484, + 14020, + 23263, + 4530, + 22862, + 10189, + 810, + 20883, + 11838, + 20169, + 20904, + 27143, + 9978, + 11777, + 21130, + 12612, + 11443, + 26454, + 1901, + 8417, + 1445, + 1283, + 23002, + 28275, + 5419, + 3697, + 2781, + 1899, + 22102, + 16822, + 6579, + 6486, + 18139, + 20864, + 11509, + 3615, + 4841, + 7941, + 13152, + 29118, + 24630, + 14828, + 9786, + 19256, + 10554, + 20915, + 17221, + 14022, + 23653, + 2732, + 11052, + 18036, + 28016, + 1672, + 412, + 5852, + 26132, + 27374, + 17125, + 11018, + 1288, + 25081, + 23458, + 16093, + 8692, + 16899, + 23193, + 18029, + 12336, + 12767, + 23001, + 6054, + 10207, + 23051, + 11234, + 4406, + 18128, + 6160, + 17848, + 8778, + 19069, + 13130, + 4018, + 3552, + 4460, + 8110, + 16060, + 15432, + 8823, + 10618, + 15778, + 9783, + 27402, + 22575, + 9299, + 16312, + 16970, + 7193, + 16282, + 19008, + 6733, + 23477, + 20921, + 4824, + 12068, + 16721, + 424, + 14595, + 7675, + 10583, + 23738, + 24031, + 8314, + 21786, + 8346, + 22922, + 25729, + 5204, + 19323, + 27508, + 2904, + 10769, + 14231, + 13415, + 13934, + 23085, + 2205, + 17758, + 28584, + 25178, + 23310, + 22817, + 29624, + 26649, + 23304, + 27387, + 24504, + 936, + 1241, + 9616, + 15786, + 124, + 21796, + 8239, + 6782, + 4518, + 15355, + 5886, + 16623, + 16616, + 27304, + 6916, + 15878, + 13207, + 20888, + 9426, + 4744, + 29354, + 18769, + 28447, + 20184, + 16564, + 19629, + 29338, + 9880, + 17881, + 16384, + 19628, + 14028, + 20263, + 24719, + 23661, + 7524, + 9840, + 12526, + 17383, + 584, + 3209, + 13625, + 2475, + 12123, + 11970, + 9289, + 3983, + 27858, + 2928, + 26472, + 13282, + 29079, + 11985, + 1691, + 4403, + 14206, + 8186, + 28486, + 20371, + 10423, + 25518, + 28180, + 8988, + 28310, + 5138, + 17265, + 17155, + 1799, + 1034, + 10090, + 25135, + 12769, + 24940, + 16385, + 15345, + 9747, + 13210, + 23769, + 2091, + 9905, + 11983, + 7980, + 25017, + 3373, + 19390, + 13146, + 17642, + 8543, + 19032, + 703, + 26798, + 26109, + 22206, + 24907, + 14813, + 17394, + 10786, + 439, + 14031, + 24544, + 19174, + 15654, + 29028, + 26988, + 18897, + 29749, + 12665, + 8913, + 26110, + 21171, + 767, + 3760, + 6535, + 16056, + 1132, + 7233, + 9233, + 3323, + 22379, + 1533, + 4311, + 16124, + 14, + 3961, + 12812, + 17176, + 19601, + 1472, + 18046, + 1627, + 22384, + 7093, + 23911, + 22079, + 14544, + 5491, + 12069, + 19890, + 539, + 18596, + 16799, + 23005, + 1521, + 14626, + 24338, + 14897, + 13668, + 576, + 19608, + 19708, + 19352, + 18439, + 9547, + 16810, + 22426, + 19065, + 24014, + 23846, + 23894, + 14085, + 24692, + 21941, + 17234, + 20037, + 7252, + 16923, + 9953, + 22325, + 3788, + 9273, + 11764, + 15929, + 26860, + 953, + 8621, + 12137, + 9590, + 22595, + 25051, + 27990, + 14940, + 10292, + 7619, + 697, + 4980, + 12469, + 9916, + 6871, + 2695, + 16409, + 26804, + 12849, + 25112, + 1438, + 12434, + 23646, + 25412, + 23444, + 2453, + 17404, + 20287, + 25795, + 12502, + 18745, + 16908, + 15173, + 3861, + 16648, + 7244, + 20750, + 16747, + 1885, + 22823, + 22683, + 1968, + 23512, + 9519, + 3336, + 12578, + 16509, + 49, + 26045, + 27018, + 24750, + 7166, + 22700, + 28593, + 13734, + 2464, + 4053, + 13151, + 25750, + 12042, + 6783, + 24735, + 26408, + 27821, + 7487, + 12538, + 11616, + 13316, + 1030, + 28360, + 18594, + 10677, + 12821, + 10543, + 25493, + 8507, + 8557, + 10119, + 5342, + 19743, + 17362, + 10414, + 3168, + 23787, + 26680, + 8075, + 22136, + 3848, + 19473, + 27487, + 4549, + 3483, + 15931, + 28508, + 13494, + 2080, + 26715, + 29647, + 24972, + 15184, + 21388, + 11196, + 2856, + 17620, + 13286, + 16760, + 17834, + 15472, + 14237, + 12700, + 27906, + 12394, + 27182, + 13467, + 5644, + 26816, + 5154, + 16738, + 3112, + 25045, + 29956, + 20520, + 21624, + 27568, + 7690, + 7569, + 21078, + 27910, + 25953, + 22067, + 5619, + 3630, + 25303, + 1762, + 18807, + 22733, + 14356, + 8438, + 1152, + 6482, + 26662, + 12792, + 25936, + 13770, + 10899, + 4859, + 16720, + 28905, + 22179, + 10851, + 5047, + 680, + 24077, + 1558, + 27317, + 5665, + 985, + 12270, + 2853, + 15209, + 11875, + 6575, + 5455, + 2832, + 20629, + 21551, + 17567, + 9512, + 23857, + 5895, + 27095, + 18671, + 29456, + 18539, + 4822, + 26994, + 26666, + 18676, + 14692, + 10580, + 20008, + 22162, + 28670, + 14592, + 12471, + 2125, + 28026, + 22813, + 24304, + 21790, + 21279, + 25262, + 29644, + 7892, + 4265, + 14826, + 21313, + 27286, + 946, + 13883, + 8235, + 10242, + 12074, + 19845, + 29703, + 12111, + 27585, + 551, + 19175, + 18426, + 16800, + 589, + 21789, + 27203, + 9292, + 2531, + 19081, + 18684, + 735, + 26284, + 19284, + 26808, + 26276, + 13159, + 7724, + 2708, + 8437, + 3259, + 7019, + 28491, + 22266, + 15747, + 3721, + 22886, + 25801, + 29305, + 20278, + 9775, + 4241, + 28273, + 8906, + 28826, + 10013, + 2304, + 28833, + 19593, + 18104, + 18003, + 22146, + 28485, + 17109, + 20592, + 10223, + 1629, + 214, + 14318, + 9387, + 8863, + 14183, + 28624, + 23792, + 4528, + 9694, + 14191, + 24880, + 7630, + 27983, + 9133, + 5827, + 29526, + 4765, + 10063, + 25666, + 11498, + 26919, + 7795, + 20128, + 5115, + 26090, + 19810, + 20246, + 15322, + 9780, + 20020, + 21603, + 12154, + 3495, + 17933, + 25968, + 12558, + 25574, + 27101, + 1962, + 26648, + 19372, + 23200, + 5082, + 18540, + 27474, + 22663, + 11150, + 1717, + 20080, + 15652, + 8393, + 7565, + 29206, + 26027, + 22119, + 27912, + 27492, + 22044, + 18877, + 20766, + 20994, + 5116, + 10880, + 12517, + 29495, + 10459, + 20488, + 24881, + 3600, + 18358, + 17586, + 13800, + 14608, + 24732, + 2779, + 12931, + 6511, + 7699, + 8721, + 2145, + 15105, + 234, + 14148, + 4043, + 14354, + 17917, + 24349, + 23488, + 15825, + 5830, + 12165, + 7923, + 16876, + 14371, + 24989, + 2018, + 12228, + 6271, + 10429, + 10086, + 27349, + 18035, + 11726, + 23301, + 24403, + 18103, + 29718, + 7106, + 9812, + 4268, + 19710, + 23182, + 724, + 11658, + 18134, + 9020, + 11808, + 21705, + 6915, + 20443, + 15227, + 10159, + 11547, + 15030, + 29683, + 18435, + 16205, + 7359, + 1124, + 2195, + 346, + 17296, + 27778, + 24254, + 7038, + 26897, + 17001, + 7514, + 29550, + 23776, + 8354, + 27798, + 26962, + 11758, + 13359, + 19751, + 16818, + 26471, + 8165, + 12108, + 26172, + 4293, + 17231, + 22188, + 5920, + 76, + 5654, + 11249, + 2550, + 29640, + 2440, + 22789, + 13056, + 26859, + 8424, + 1214, + 21475, + 30000, + 7053, + 10043, + 3914, + 981, + 920, + 26204, + 28257, + 23366, + 28433, + 14609, + 28510, + 1478, + 12571, + 25373, + 9679, + 4588, + 12385, + 26272, + 15188, + 10279, + 7490, + 11391, + 10068, + 27647, + 17475, + 18880, + 11193, + 5698, + 26583, + 12445, + 20542, + 16234, + 24901, + 1881, + 23325, + 2670, + 17529, + 26479, + 22321, + 18777, + 11649, + 4532, + 28719, + 29935, + 7127, + 26217, + 20516, + 27725, + 13260, + 17212, + 14006, + 1846, + 11815, + 3738, + 11932, + 11597, + 19688, + 27678, + 9505, + 12203, + 18736, + 2988, + 24297, + 14865, + 6836, + 9838, + 29670, + 10193, + 782, + 14993, + 2866, + 9540, + 26353, + 7217, + 3556, + 15362, + 9970, + 4928, + 28248, + 13272, + 9891, + 17352, + 7200, + 12316, + 2385, + 4385, + 2608, + 10897, + 23657, + 26499, + 8860, + 3943, + 5210, + 14167, + 6509, + 11664, + 13701, + 14464, + 22249, + 2056, + 12253, + 14169, + 6320, + 6241, + 17213, + 29142, + 3338, + 620, + 16356, + 27211, + 1895, + 2286, + 27470, + 27204, + 11689, + 26725, + 1692, + 5097, + 12853, + 22889, + 4774, + 8279, + 22410, + 25214, + 12024, + 10659, + 12929, + 29646, + 29535, + 17531, + 29422, + 20683, + 26417, + 29127, + 2078, + 4524, + 16872, + 11485, + 18228, + 1589, + 23478, + 4957, + 19030, + 15587, + 10488, + 17430, + 2555, + 20978, + 19404, + 28176, + 22769, + 9325, + 2271, + 19761, + 12620, + 20959, + 463, + 8710, + 10411, + 25432, + 5065, + 20828, + 24001, + 17391, + 20753, + 22588, + 18862, + 29633, + 13089, + 16383, + 14895, + 12935, + 19477, + 8222, + 4797, + 7084, + 18502, + 25824, + 4321, + 1480, + 13416, + 9744, + 29303, + 23428, + 25075, + 16080, + 11360, + 28725, + 12591, + 24620, + 25448, + 16379, + 11078, + 9748, + 12166, + 5309, + 8861, + 5490, + 9095, + 6423, + 11968, + 575, + 29767, + 22303, + 27004, + 4616, + 11585, + 26474, + 22099, + 15940, + 18609, + 15144, + 6313, + 18455, + 13635, + 17114, + 22555, + 11861, + 632, + 20417, + 17948, + 22896, + 24218, + 18188, + 22880, + 13791, + 12141, + 3139, + 5825, + 1209, + 6276, + 23043, + 11, + 2201, + 11659, + 28245, + 10366, + 5334, + 3726, + 21591, + 29056, + 5025, + 12079, + 12343, + 19997, + 11307, + 9176, + 24678, + 17626, + 27854, + 3741, + 5741, + 22335, + 168, + 835, + 20292, + 21011, + 26278, + 26975, + 9881, + 8276, + 998, + 16415, + 19271, + 3033, + 27876, + 9580, + 22585, + 12219, + 26258, + 26551, + 5037, + 18974, + 16977, + 10983, + 15816, + 22082, + 19676, + 20939, + 19549, + 23970, + 29504, + 4036, + 24448, + 3363, + 29543, + 12861, + 24563, + 23547, + 22113, + 16241, + 27294, + 12373, + 4336, + 23544, + 23346, + 12081, + 22976, + 17257, + 21256, + 19788, + 19522, + 19945, + 13511, + 18889, + 377, + 27813, + 20656, + 17094, + 3993, + 7499, + 18114, + 15360, + 29744, + 15166, + 18207, + 24021, + 20593, + 20579, + 7710, + 12411, + 28472, + 19401, + 24934, + 7823, + 22822, + 9413, + 17134, + 16073, + 9508, + 15568, + 20781, + 17347, + 8316, + 18398, + 28661, + 25991, + 11189, + 11165, + 19462, + 26675, + 23207, + 7114, + 310, + 5563, + 7441, + 22938, + 13753, + 19166, + 15262, + 8736, + 9086, + 13868, + 19341, + 24190, + 18280, + 11577, + 29281, + 26751, + 7811, + 2327, + 23481, + 3361, + 28040, + 26644, + 27332, + 21125, + 28577, + 16765, + 2567, + 11634, + 1555, + 26512, + 7073, + 8499, + 27036, + 1688, + 23068, + 13430, + 18998, + 15997, + 26762, + 12415, + 1570, + 17016, + 668, + 16632, + 21053, + 4362, + 889, + 21748, + 9705, + 27591, + 23725, + 19423, + 12914, + 18251, + 11863, + 14062, + 2270, + 8195, + 20114, + 10633, + 17553, + 964, + 3346, + 4250, + 19478, + 26056, + 17060, + 17518, + 26771, + 2088, + 26488, + 1608, + 16626, + 14008, + 25039, + 7074, + 7464, + 6725, + 14581, + 28874, + 7331, + 15680, + 22798, + 23505, + 27273, + 3000, + 16107, + 22630, + 4975, + 7731, + 10652, + 25393, + 11214, + 8950, + 7056, + 474, + 10173, + 61, + 14875, + 10092, + 23128, + 13403, + 291, + 20148, + 17116, + 6710, + 20843, + 14143, + 25970, + 21416, + 11552, + 23506, + 1807, + 29013, + 15832, + 21112, + 644, + 26321, + 27213, + 11206, + 28346, + 29518, + 15547, + 3281, + 4354, + 22800, + 25697, + 29676, + 15658, + 14470, + 13143, + 29267, + 19461, + 9010, + 4633, + 20274, + 22193, + 5476, + 5762, + 28887, + 27579, + 29448, + 8174, + 8848, + 28979, + 10253, + 4405, + 12588, + 14538, + 9422, + 12614, + 3953, + 1704, + 473, + 2985, + 18315, + 27690, + 21758, + 27521, + 6133, + 9421, + 20553, + 11844, + 23227, + 25960, + 13956, + 5033, + 26656, + 17173, + 21888, + 27490, + 9632, + 22839, + 16286, + 15966, + 4411, + 2975, + 26223, + 21264, + 7846, + 11673, + 28673, + 21205, + 25855, + 8002, + 23508, + 23427, + 1199, + 8257, + 29171, + 8620, + 28170, + 16429, + 6358, + 15253, + 28478, + 24184, + 3044, + 22287, + 16716, + 24582, + 148, + 9048, + 19187, + 16880, + 11348, + 23414, + 3748, + 6601, + 7484, + 28109, + 21550, + 20230, + 7962, + 1519, + 8699, + 2924, + 18899, + 6823, + 16654, + 18679, + 24062, + 19492, + 19870, + 16020, + 9524, + 9720, + 27207, + 2804, + 4435, + 11202, + 13128, + 5291, + 699, + 1959, + 15444, + 75, + 480, + 14286, + 4469, + 24888, + 12424, + 21426, + 5124, + 2990, + 743, + 22771, + 4896, + 4927, + 24799, + 13165, + 4267, + 11437, + 20873, + 23003, + 691, + 16546, + 2471, + 13391, + 17177, + 3308, + 9147, + 25764, + 16067, + 2994, + 23681, + 5447, + 13830, + 16884, + 92, + 17751, + 26533, + 27646, + 14019, + 27309, + 919, + 8291, + 10318, + 19960, + 21993, + 24102, + 14166, + 3950, + 8900, + 6992, + 28432, + 6033, + 21573, + 14436, + 29449, + 17654, + 12813, + 17232, + 1179, + 21579, + 1023, + 3065, + 8107, + 145, + 3709, + 21766, + 14540, + 16151, + 10020, + 27134, + 29243, + 21989, + 1896, + 7701, + 7821, + 9208, + 20643, + 18622, + 306, + 24980, + 15050, + 2897, + 16555, + 1915, + 14467, + 28572, + 4122, + 311, + 1559, + 28662, + 28714, + 12051, + 8168, + 26181, + 13936, + 19302, + 6303, + 4178, + 1905, + 212, + 11603, + 1740, + 25922, + 29163, + 23620, + 8828, + 27559, + 29433, + 4472, + 4730, + 13687, + 27882, + 18726, + 17471, + 8440, + 20930, + 21150, + 21228, + 17921, + 23417, + 22816, + 29263, + 4012, + 23575, + 1146, + 14929, + 10464, + 25734, + 19046, + 18533, + 24165, + 10889, + 2749, + 23759, + 29934, + 18238, + 5407, + 25435, + 12146, + 13074, + 13508, + 15821, + 15085, + 3021, + 23746, + 11512, + 13102, + 11884, + 27062, + 20834, + 1045, + 18989, + 7198, + 13787, + 7436, + 1254, + 24044, + 15181, + 29716, + 10836, + 8643, + 23155, + 21059, + 5349, + 17790, + 12532, + 13919, + 2803, + 9897, + 15224, + 27683, + 5683, + 28991, + 2561, + 20418, + 23829, + 26290, + 22850, + 25223, + 6860, + 21845, + 21337, + 17403, + 1424, + 11904, + 13202, + 1013, + 10946, + 12422, + 23405, + 6084, + 15348, + 22240, + 6745, + 21892, + 18992, + 24063, + 18789, + 25417, + 10812, + 25604, + 19124, + 14157, + 4289, + 10636, + 12542, + 766, + 25684, + 16256, + 26828, + 21883, + 10195, + 13676, + 1303, + 23798, + 5845, + 23236, + 11893, + 13412, + 17840, + 17102, + 4162, + 20874, + 2696, + 8474, + 2184, + 7959, + 18691, + 4394, + 423, + 14224, + 21946, + 6966, + 24887, + 10448, + 12851, + 19582, + 16764, + 12942, + 23824, + 3095, + 19634, + 4587, + 21512, + 10593, + 9002, + 12296, + 27642, + 25498, + 8494, + 12810, + 22383, + 19049, + 10297, + 4844, + 17792, + 29477, + 4574, + 28289, + 9216, + 2694, + 27698, + 19021, + 24570, + 21745, + 29410, + 12782, + 8518, + 13185, + 19052, + 10621, + 4855, + 6657, + 20806, + 29654, + 10752, + 20083, + 3290, + 11440, + 15393, + 29805, + 21987, + 28352, + 8752, + 27442, + 26820, + 26841, + 15219, + 29527, + 24619, + 8650, + 29569, + 16757, + 5450, + 26993, + 24177, + 29430, + 26932, + 16424, + 18878, + 3929, + 23856, + 9106, + 23115, + 23485, + 12681, + 7615, + 23943, + 12369, + 16493, + 22538, + 4745, + 6346, + 9140, + 13353, + 24503, + 16911, + 2628, + 636, + 14406, + 4998, + 9460, + 3544, + 18519, + 28586, + 11732, + 10813, + 14999, + 27123, + 10549, + 16639, + 17441, + 29475, + 5215, + 20219, + 11452, + 9789, + 17883, + 27194, + 3662, + 18638, + 29509, + 28306, + 19435, + 3683, + 28261, + 3838, + 4131, + 13654, + 3432, + 19737, + 7567, + 3074, + 17204, + 14990, + 4832, + 15779, + 2207, + 518, + 26547, + 22516, + 2683, + 4427, + 1160, + 15520, + 23742, + 22475, + 18790, + 27138, + 16863, + 13013, + 12318, + 6936, + 22558, + 5101, + 23080, + 2718, + 11706, + 1838, + 9835, + 13999, + 11410, + 11953, + 12569, + 1331, + 22784, + 25955, + 19333, + 16793, + 8122, + 22222, + 6023, + 24329, + 21681, + 18682, + 4933, + 809, + 16054, + 27321, + 4147, + 29515, + 13660, + 29137, + 18317, + 18011, + 16391, + 2731, + 23749, + 14481, + 14289, + 1382, + 16620, + 2308, + 13672, + 22626, + 20134, + 12054, + 29130, + 28101, + 17714, + 12834, + 6574, + 14953, + 12554, + 26152, + 5816, + 23321, + 26604, + 22278, + 2518, + 14906, + 25527, + 19569, + 6850, + 11335, + 14927, + 25930, + 26467, + 823, + 11291, + 5798, + 8462, + 7029, + 14638, + 6679, + 28287, + 20944, + 146, + 1186, + 26727, + 12456, + 4100, + 9890, + 24197, + 28446, + 9082, + 12707, + 16075, + 1133, + 3904, + 16330, + 28284, + 10791, + 22973, + 245, + 7883, + 11034, + 8113, + 27951, + 25643, + 521, + 16216, + 17433, + 8197, + 26306, + 24647, + 15536, + 22271, + 14184, + 17895, + 3837, + 24294, + 23073, + 8515, + 21173, + 18958, + ] + ) + == 12983 +) diff --git a/python/challenges/house_robber.py b/python/challenges/house_robber.py new file mode 100644 index 0000000..9af421b --- /dev/null +++ b/python/challenges/house_robber.py @@ -0,0 +1,20 @@ +# https://leetcode.com/problems/house-robber/ + + +def rob(nums: list[int]) -> int: + highest = 0 + for i, v in enumerate(nums): + if i in (0, 1): + pass + elif i == 2: + nums[i] = v + nums[i - 2] + else: + nums[i] = v + max(nums[i - 2], nums[i - 3]) + + highest = max(highest, nums[i]) + + return highest + + +assert rob([1, 2, 3, 1]) == 4 +assert rob([2, 7, 9, 3, 1]) == 12 diff --git a/python/challenges/longest_palindrome.py b/python/challenges/longest_palindrome.py new file mode 100644 index 0000000..f971a34 --- /dev/null +++ b/python/challenges/longest_palindrome.py @@ -0,0 +1,49 @@ +# https://leetcode.com/problems/longest-palindromic-substring/ + + +def longestPalindrome(s: str) -> str: + if len(s) == 1: + return s[0] + + if s[0] == s[1]: + longest = (0, 1) + max_len = 2 + else: + longest = (0, 0) + max_len = 1 + + for center in range(1, len(s)): + for shift in (0, 1): + lp = center + rp = center + shift + + while lp >= 0 and rp < len(s): + if s[lp] != s[rp]: + break + + cur_len = (rp - lp) + 1 + if cur_len > max_len: + max_len = cur_len + longest = (lp, rp) + + lp -= 1 + rp += 1 + + lp = center + rp = center + 1 + + return s[longest[0] : longest[1] + 1] + + +def test_longestPalindrome(): + assert longestPalindrome("babad") == "bab" + assert longestPalindrome("cbbd") == "bb" + assert longestPalindrome("a") == "a" + assert longestPalindrome("bb") == "bb" + assert longestPalindrome("bbbb") == "bbbb" + assert longestPalindrome("bbbbb") == "bbbbb" + assert longestPalindrome("ababasdfnkasjffffff") == "ffffff" + assert longestPalindrome("aacabdkacaa") == "aca" + + +test_longestPalindrome() diff --git a/python/challenges/longest_substring.py b/python/challenges/longest_substring.py new file mode 100644 index 0000000..aa8c55a --- /dev/null +++ b/python/challenges/longest_substring.py @@ -0,0 +1,44 @@ +def lengthOfLongestSubstring(s: str) -> int: + if len(s) < 2: + return len(s) + + lp = 0 + rp = 0 + current_len = 0 + longest = (0, 0, 0) # len, l, r + chars = {} + + while rp < len(s): + print( + f"lp: {lp}, rp: {rp}, current_len: {current_len}, longest: {longest}, chars: {chars}" + ) + rc = s[rp] + + if rc in chars and chars[rc] >= lp: + lp = chars[rc] + 1 + current_len = rp - lp + else: + chars[rc] = rp + rp += 1 + current_len += 1 + if current_len > longest[0]: + longest = (current_len, lp, rp) + + return longest[0] + + +def test_lengthOfLongestSubstring(): + assert lengthOfLongestSubstring("abcabcbb") == 3 + assert lengthOfLongestSubstring("bbbbb") == 1 + assert lengthOfLongestSubstring("pwwkew") == 3 + assert lengthOfLongestSubstring("") == 0 + assert lengthOfLongestSubstring(" ") == 1 + assert lengthOfLongestSubstring("au") == 2 + assert lengthOfLongestSubstring("dvdf") == 3 + assert lengthOfLongestSubstring("tmmzuxt") == 5 + assert lengthOfLongestSubstring("abba") == 2 + assert lengthOfLongestSubstring("aab") == 2 + assert lengthOfLongestSubstring("aabaab!bb") == 3 + + +test_lengthOfLongestSubstring() diff --git a/python/challenges/lru_cache.py b/python/challenges/lru_cache.py new file mode 100644 index 0000000..9be331b --- /dev/null +++ b/python/challenges/lru_cache.py @@ -0,0 +1,152 @@ +# https://leetcode.com/problems/lru-cache/ + +import logging + +L = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) + + +# Node for doubly-linked list +class Node: + def __init__(self, key, value, prev=None, next=None): + self.key = key + self.value = value + self.next = next + self.prev = prev + + def __str__(self): + return f"kv: {self.key}, {self.value} prev: ({self.prev}) next ({self.next})" + + +# LRUCache is backed by a hashmap and a doubly lined list +class LRUCache: + def __init__(self, capacity: int): + print("\nnew cache size", capacity) + assert capacity > 0 + self.capacity = capacity + self.count = 0 + self.cache = {} + self.lru_head = None + self.lru_tail = None + + def evict(self): + assert self.lru_tail is not None + print(f"evict {self.lru_tail.key}") + del self.cache[self.lru_tail.key] + + if self.count > 1: + self.lru_tail.prev.next = None # drop reference + self.lru_tail = self.lru_tail.prev + else: + self.lru_head = None + self.lru_tail = None + + self.count -= 1 + + def touch(self, node): + if self.count == 1: + return + + # Move node to the top + if not node.next: # if already at the bottom + self.lru_tail = node.prev # update the tail + + if not node.prev: # if already at the top + pass # self.lru_head.prev = node + else: + node.prev.next = node.next + if node.next: + node.next.prev = node.prev + node.prev = None + node.next = self.lru_head + self.lru_head.prev = node + self.lru_head = node + + def get(self, key: int) -> int: + if key not in self.cache: + print(f"get {key} = -1") + return -1 + + node = self.cache[key] + self.touch(node) + + print(f"get {key} = {node.value}") + return node.value + + def put(self, key: int, value: int) -> None: + print("put", key, value) + if key in self.cache: + node = self.cache[key] + node.value = value + self.touch(node) + else: + if self.count + 1 > self.capacity: + self.evict() + + node = Node(key, value) + self.cache[key] = node + if self.lru_head is None: + self.lru_head = node + self.lru_tail = node + else: + node.next = self.lru_head + self.lru_head.prev = node + self.lru_head = node + + self.count += 1 + + def __str__(self): + return f"head {self.lru_head} \ntail {self.lru_tail}" + + +# Your LRUCache object will be instantiated and called as such: +# obj = LRUCache(capacity) +# param_1 = obj.get(key) +# obj.put(key,value) + + +def test1(): + cache = LRUCache(3) + cache.put(4, "v") + cache.put(5, "v") + cache.put(5, "t") + cache.put(6, "t") + cache.put(7, "t") + + +def test2(): + lRUCache = LRUCache(2) + lRUCache.put(1, 1) + lRUCache.put(2, 2) + assert lRUCache.get(1) == 1 + lRUCache.put(3, 3) + assert lRUCache.get(2) == -1 + lRUCache.put(4, 4) + assert lRUCache.get(1) == -1 + assert lRUCache.get(3) == 3 + assert lRUCache.get(4) == 4 + + +def test3(): + cache = LRUCache(1) + cache.put(2, 1) + assert cache.get(2) == 1 + cache.put(3, 2) + assert cache.get(2) == -1 + assert cache.get(3) == 2 + + +def test4(): + cache = LRUCache(2) + cache.put(2, 1) + cache.put(1, 1) + cache.put(2, 3) + cache.put(4, 1) + assert cache.get(1) == -1 + assert cache.get(2) == 3 + + +test1() +test2() +test3() +test4() diff --git a/python/challenges/max_profit.py b/python/challenges/max_profit.py new file mode 100644 index 0000000..d7f3d36 --- /dev/null +++ b/python/challenges/max_profit.py @@ -0,0 +1,44 @@ +# https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/ + + +""" +Fastest algo +""" + + +def max_profit1(prices: list[int]) -> int: + print("max_profit", prices) + if len(prices) == 0: + raise ValueError("empty list") + + min_price = 10000 + max_profit = 0 + + for p in prices: + min_price = min(min_price, p) + max_profit = max(p - min_price, max_profit) + + return max_profit + + +""" +This is not really that fast +""" + + +def max_profit2(prices: list[int]) -> int: + import itertools + + if len(prices) == 0: + raise ValueError("empty list") + + def f(total, elem): + minv = min(total[0], elem) + return (minv, max(elem - minv, total[1])) + + *_, last = itertools.accumulate(prices, f, initial=(100000, 0)) + return last[1] + + +assert max_profit1([7, 1, 5, 3, 6, 4]) == 5 +assert max_profit2([7, 1, 5, 3, 6, 4]) == 5 diff --git a/python/challenges/max_subarray.py b/python/challenges/max_subarray.py new file mode 100644 index 0000000..fab0a3f --- /dev/null +++ b/python/challenges/max_subarray.py @@ -0,0 +1,45 @@ +# https://leetcode.com/problems/maximum-subarray/ + +# [-2,1,-3,4,-1,2,1,-5,4] +# +# 0, 1, -1 +# 0, 2, -4 +# 1, 2, -2 +# 1, 3, 2 +# 1, 4, 1 +# 2, 4, 0 +# 3, 4, 3 +# 3, 5, 5 +# 3, 6, 6 +# 3, 7, 1 +# 4, 7, 5 + + +def maxSubArray(nums) -> int: + if len(nums) == 1: + return nums[0] + + max_so_far = 0 + ans = -100000 + + for n in nums: + max_so_far += n + + if n > max_so_far: + max_so_far = n + + if max_so_far > ans: + ans = max_so_far + + print("ans", ans) + return ans + + +def test_maxSubArray(): + assert maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4]) == 6 + assert maxSubArray([1]) == 1 + assert maxSubArray([5, 4, -1, 7, 8]) == 23 + assert maxSubArray([5, 4, -1, 7, -8]) == 15 + + +test_maxSubArray() diff --git a/python/challenges/num_islands.py b/python/challenges/num_islands.py new file mode 100644 index 0000000..4cc0abb --- /dev/null +++ b/python/challenges/num_islands.py @@ -0,0 +1,56 @@ +# https://leetcode.com/problems/number-of-islands/ + + +def follow(grid, i, j, counter): + grid[i][j] = counter + for m in (-1, +1): + y = i + m + if y >= 0 and y < len(grid): + if grid[y][j] == "1": + follow(grid, y, j, counter) + + for n in (-1, +1): + x = j + n + if x >= 0 and x < len(grid[i]): + if grid[i][x] == "1": + follow(grid, i, x, counter) + + +def numIslands(grid: list[list[str]]) -> int: + counter = 2 + + for i in range(len(grid)): + for j in range(len(grid[i])): + if grid[i][j] == "1": + follow(grid, i, j, counter) + counter += 1 + + ans = counter - 2 + return ans + + +assert ( + numIslands( + [ + ["1", "1", "1", "1", "0"], + ["1", "1", "0", "1", "0"], + ["1", "1", "0", "0", "0"], + ["0", "0", "0", "0", "0"], + ], + ) + == 1 +) + +assert ( + numIslands( + [ + ["1", "1", "0", "0", "0"], + ["1", "1", "0", "0", "0"], + ["0", "0", "1", "0", "0"], + ["0", "0", "0", "1", "1"], + ] + ) + == 3 +) + +assert numIslands([["1", "1", "1"], ["0", "1", "0"], ["1", "1", "1"]]) == 1 diff --git a/python/challenges/trapping_water.py b/python/challenges/trapping_water.py new file mode 100644 index 0000000..e9164a9 --- /dev/null +++ b/python/challenges/trapping_water.py @@ -0,0 +1,38 @@ +# https://leetcode.com/problems/trapping-rain-water/ + + +def trap(height: list[int]) -> int: + lp = 0 + rp = len(height) - 1 + total = 0 + left_max = height[lp] + right_max = height[rp] + + while lp < rp: + if height[lp] < left_max: + total += min(left_max, right_max) - height[lp] + else: + left_max = height[lp] + + if height[rp] < right_max: + total += min(left_max, right_max) - height[rp] + else: + right_max = height[rp] + + if height[lp] <= height[rp]: + lp += 1 + else: + rp -= 1 + + return total + + +def expect(height, ans): + print(f"expect {height} == {ans}") + v = trap(height) + print(f"got {height} == {v}") + assert v == ans + + +expect([4, 2, 0, 3, 2, 5], 9) +expect([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1], 6) From ee72a74007d8910247e44154bea735d5bc269482 Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 13 Apr 2024 20:49:33 -0400 Subject: [PATCH 170/180] Added two more hard leetcode problems --- python/challenges/median_finder.py | 85 +++++++++++++++++++++++ python/challenges/merge_k_lists.py | 106 +++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 python/challenges/median_finder.py create mode 100644 python/challenges/merge_k_lists.py diff --git a/python/challenges/median_finder.py b/python/challenges/median_finder.py new file mode 100644 index 0000000..0f61683 --- /dev/null +++ b/python/challenges/median_finder.py @@ -0,0 +1,85 @@ +# https://leetcode.com/problems/find-median-from-data-stream/ + +from heapq import heappop, heappush, heappushpop + +# Python heapq supports only min-heap. If you +# want a max-heap, then negate the elements. + + +class MedianFinder: + def __init__(self): + self.median = None + self.count = 0 + self.left = [] # max heap, stores negative elements + self.right = [] # min heap, stores positive elements + pass + + def addNum(self, num: int) -> None: + if self.count == 0: + self.median = num + else: + if self.median is not None: + if num > self.median: + heappush(self.left, -self.median) + heappush(self.right, num) + else: + heappush(self.right, self.median) + heappush(self.left, -num) + + self.median = None + else: + left_tail = -self.left[0] + right_head = self.right[0] + median = (left_tail + right_head) / 2 + + if num > median: + self.median = heappushpop(self.right, num) + else: + self.median = -heappushpop(self.left, -num) + + # print("M", self.count, self.left, self.median, self.right) + self.count += 1 + + def findMedian(self) -> float: + if self.median is not None: + return self.median + else: + return (-self.left[0] + self.right[0]) / 2 + + +# Your MedianFinder object will be instantiated and called as such: +# obj = MedianFinder() +# obj.addNum(num) +# param_2 = obj.findMedian() + + +def test(commands, values, expected): + print( + "\nNew Test:", + "\n".join(map(lambda v: f" {v[0]} {v[1]}", list(zip(commands, values)))), + ) + finder = None + result = [] + + for c, v in zip(commands, values): + match c: + case "MedianFinder": + finder = MedianFinder() + result = [None] + + case "addNum": + result.append(finder.addNum(v[0])) + + case "findMedian": + result.append(finder.findMedian()) + + print(" --> want:", expected) + print(" --> got:", result) + return result == expected + + +assert test( + ["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"], + [[], [1], [2], [], [3], []], + [None, None, None, 1.50000, None, 2.00000], +) diff --git a/python/challenges/merge_k_lists.py b/python/challenges/merge_k_lists.py new file mode 100644 index 0000000..0def904 --- /dev/null +++ b/python/challenges/merge_k_lists.py @@ -0,0 +1,106 @@ +# https://leetcode.com/problems/merge-k-sorted-lists/ + +from heapq import heappop, heappush, heapify, heappushpop + + +# From leetcode +class ListNode: + def __init__(self, val=0, next=None): + self.val = val + self.next = next + + def __repr__(self): + me = self + vals = [] + while me is not None: + vals.append(me.val) + me = me.next + + return repr(vals) + + +# Paste below + + +def __lt__(self, other): + return self.val < other.val + + +ListNode.__lt__ = __lt__ + + +def mergeKLists(lists: list[ListNode]) -> ListNode: + lists = list(filter(lambda v: v is not None, lists)) + + if len(lists) == 0: + return None + + if len(lists) == 1: + return lists[0] + + heapify(lists) + top = heappop(lists) + cur = top + + while len(lists) > 0: + next_head = lists[0] + while cur.next is not None and cur.next.val < next_head.val: + cur = cur.next + + if cur.next is not None: + cur.next = heappushpop(lists, cur.next) + else: + cur.next = heappop(lists) + + cur = cur.next + + return top + + +def to_list_node(nums: list) -> ListNode: + if len(nums) == 0: + return None + + head = ListNode(nums[0]) + cur = head + for num in nums[1:]: + cur.next = ListNode(num) + cur = cur.next + + return head + + +def to_list(head: ListNode) -> list: + if head is None: + return [] + + nums = [] + cur = head + + while cur is not None: + nums.append(cur.val) + cur = cur.next + + return nums + + +def to_list_of_listnodes(num_lists: list[list]): + lists = [] + for nums in num_lists: + lists.append(to_list_node(nums)) + + return lists + + +def test_merge_eq(lists: list[list], expected) -> list: + print("\nmergeKLists", lists) + ans = to_list(mergeKLists(to_list_of_listnodes(lists))) + print(" ", ans) + return ans == expected + return ans + + +assert test_merge_eq([[1, 4, 5], [1, 3, 4], [2, 6]], [1, 1, 2, 3, 4, 4, 5, 6]) +assert test_merge_eq([], []) +assert test_merge_eq([[]], []) +assert test_merge_eq([[], []], []) From 379f8f718e06c90db93798510be9f2434d148f1a Mon Sep 17 00:00:00 2001 From: Mohit Muthanna Cheppudira Date: Sat, 20 Apr 2024 09:28:03 -0400 Subject: [PATCH 171/180] Added two more leetcode problems --- python/challenges/merge_intervals.py | 25 ++++++++++++ python/challenges/minimum_window_substring.py | 39 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 python/challenges/merge_intervals.py create mode 100644 python/challenges/minimum_window_substring.py diff --git a/python/challenges/merge_intervals.py b/python/challenges/merge_intervals.py new file mode 100644 index 0000000..b2189d4 --- /dev/null +++ b/python/challenges/merge_intervals.py @@ -0,0 +1,25 @@ +# https://leetcode.com/problems/merge-intervals/ + + +def merge(intervals: list[list[int]]) -> list[list[int]]: + if len(intervals) < 2: + return intervals + + answer = [] + intervals.sort(key=lambda v: v[0]) + + low, high = intervals[0] + for r in intervals[1:]: + if r[0] > high: + answer.append([low, high]) + low, high = r[0], r[1] + elif r[0] >= low and r[1] > high: + high = r[1] + + answer.append([low, high]) + return answer + + +assert merge([[1, 3], [2, 6], [8, 10], [15, 18]]) == [[1, 6], [8, 10], [15, 18]] +assert merge([[2, 6], [1, 3], [1, 2], [8, 10], [15, 18]]) == [[1, 6], [8, 10], [15, 18]] +assert merge([[1, 3]]) == ([[1, 3]]) diff --git a/python/challenges/minimum_window_substring.py b/python/challenges/minimum_window_substring.py new file mode 100644 index 0000000..3be3a1d --- /dev/null +++ b/python/challenges/minimum_window_substring.py @@ -0,0 +1,39 @@ +# https://leetcode.com/problems/minimum-window-substring/ + + +def trace(f): + def wrapper(*args, **kwargs): + print(f"{f.__name__} {' '.join(args)} {kwargs}") + ans = f(*args, **kwargs) + print(" -->", ans) + return ans + + return wrapper + + +@trace +def minWindow(s: str, t: str) -> str: + lp = 0 + rp = 0 + min_window = (0, 0) + target = len(t) + char_map = {} + + for c in t: + if c in char_map: + char_map[c] += 1 + else: + char_map[c] = 1 + + while rp < len(s): + if s[rp] in char_map and char_map[rp] > 0: + char_map[rp] -= 1 + target -= 1 + else: + lp += 1 + if s[lp] in char_map: + char_map[lp] += 1 + target += 1 + + +assert minWindow("ADOBECODEBANC", "ABC") == "BANC" From ef7d2dd89e92cfffd9310a62d068bde29131c69b Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 15 May 2024 08:21:39 -0400 Subject: [PATCH 172/180] Added some x86_64 experiments --- asm/Makefile | 23 ++- asm/args.asm | 84 +++++++++++ asm/asm | Bin 905 -> 0 bytes asm/asm.o | Bin 704 -> 0 bytes asm/atoi.asm | 173 +++++++++++++++++++++++ asm/hello64.asm | 35 +++++ asm/loop.asm | 26 ++++ asm/old/Makefile | 10 ++ asm/{ => old}/asm.S | 0 asm/{ => old}/disasm.c | 0 asm/{ => old}/disasm.s | 0 asm/printf.asm | 20 +++ minikube/helm/dice/templates/nfs-pv.yaml | 59 +++++++- 13 files changed, 423 insertions(+), 7 deletions(-) create mode 100644 asm/args.asm delete mode 100755 asm/asm delete mode 100644 asm/asm.o create mode 100644 asm/atoi.asm create mode 100644 asm/hello64.asm create mode 100644 asm/loop.asm create mode 100644 asm/old/Makefile rename asm/{ => old}/asm.S (100%) rename asm/{ => old}/disasm.c (100%) rename asm/{ => old}/disasm.s (100%) create mode 100644 asm/printf.asm diff --git a/asm/Makefile b/asm/Makefile index 3e5acaf..a019975 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -1,10 +1,21 @@ -all: asm +targets = printf loop args atoi -asm.o: asm.S - nasm -f elf asm.S +all: $(targets) hello64 -asm: asm.o - ld -o asm asm.o +$(targets): $(targets:%=%.o) + +%.o: %.asm + nasm -f elf64 -g -F dwarf -o $@ $< + +%: %.o + gcc -o $@ $< clean: - rm asm asm.o + rm *.o + rm $(targets) hello64 + +# This one is special +hello64: hello64.asm + nasm -f elf64 -g -F dwarf -o $@.o $< + ld -o hello64 hello64.o -I/lib64/ld-linux-x86-64.so.2 + diff --git a/asm/args.asm b/asm/args.asm new file mode 100644 index 0000000..815ef48 --- /dev/null +++ b/asm/args.asm @@ -0,0 +1,84 @@ +; This program prints out the program argument count followed by +; each argument, line by line. +; +; MoC + +global main +extern printf + +SECTION .data + +SECTION .rodata +count db "arg count: %d",10,0 +first db "arg: %s",10,0 +; +SECTION .text + +; argc is in rdi -- integer +; argv is in rsi -- array of pointers (char**) + +main: + ; prelude + push rbp + mov rbp, rsp + + ; save registers that will be clobbered + push r12 + push r13 + push r14 + + mov r14, rdi ; save argc... rdi will be clobbered + mov r12, rsi ; save argv... rsi will be clobbered + + ; show arg count + mov rsi, rdi ; pass argc to print_arg_count + call print_arg_count + + ; loop from 0 to argc + mov r13, 0 ; r13 will be the index + +list: + ; calculate address of argument: rax = r12 + (8 * r13) + mov rax, 8 + mul r13 ; rax is the accumulator for mul + add rax, r12 + mov rdi, [rax] ; deref rax + call print_arg + + inc r13 ; next + cmp r13, r14 ; check if index == argc + je exit + jmp list + +exit: + pop r14 + pop r13 + pop r12 + pop rbp + xor rax, rax ; return value = 0 + ret + + +print_arg_count: + ; expects argc in first param: rdi + push rbp + mov rbp, rsp + mov rsi, rdi + lea rdi, [count] + xor rax, rax ; vor variadic args, 0 floating point args + call printf + leave + ret + +print_arg: + ; expects pointer to string in first param: rdi + push rbp + mov rbp, rsp + mov rsi, rdi + lea rdi, [first] ; get a pointer to "first" + xor rax, rax ; vor variadic args, 0 floating point args + call printf + leave + ret + + diff --git a/asm/asm b/asm/asm deleted file mode 100755 index 0133a3b9ca9190ef09e75b9e19e73e660337dc28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmaJ?TCcwWn!ZStnGT+RL`0V zD`6bjNWw;%N_g5y64SOr1^ojT!Lcg#$@$&E22d5W?qmfg^Kwu(BUsKzMQ5;vKoQEk zH?;i*%X=#7Zy=yPIp!_X>5Fo6zD9m}P@aqCt$?O1*Q Dhht{B diff --git a/asm/asm.o b/asm/asm.o deleted file mode 100644 index 1940937332ec9dba2d8b805e91c7c42f18b755ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704 zcmb7BJxc>Y5S`6MjY{HKXeX{+sw1F9w2Fmd5o{DJ<>D=zaF>I-1-0^8vB^(K8L_ku z_*eV|`X;wS4zzJ#_RYtew_nd^!*it+i7E1EnGp?K<7k0hYEe_D|3cPe_uN#8WUHni zs%wt7>UtCKbdBe`xD8}Iu_=;$Nr2MZMJ#)A`xA{54x9;3BX39%=p!kCd=5SnpO5$M z!s~hy@b*v>6TKb^>rwuFX=iq`qJ2k`^f0iqA=+wF}dyq$Nk{24@wY)Hl)CsM@zw7mZoNmpoj~b+i-;F zDXq}uxk)NAX8$m`54W21^I>9yXA}`{x`l-Ws3NJ#C(34ut + +global main +extern printf + +SECTION .data + +SECTION .rodata +length db "length: %d",10,0 +success db "success: %d",10,0 +failed db "failed: %s != %d",10,0 + +test_1 db "7",0 +test_2 db "42",0 +test_3 db "100",0 +test_4 db "3u2",0 +test_5 db "4096",0 +test_6 db "200000",0 +test_7 db "004096",0 + +ans_1 dd 7 +ans_2 dd 42 +ans_3 dd 100 +ans_4 dd 0 +ans_5 dd 4096 +ans_6 dd 200000 +ans_7 dd 4096 + +; +SECTION .text + +; argc is in rdi -- integer +; argv is in rsi -- array of pointers (char**) + +main: + ; prelude + push rbp + mov rbp, rsp + + ; save registers that will be clobbered + mov rdi, test_1 + movsxd rsi, dword [ans_1] + call do_test + + mov rdi, test_2 + movsxd rsi, dword [ans_2] + call do_test + + mov rdi, test_3 + movsxd rsi, dword [ans_3] + call do_test + + mov rdi, test_4 + movsxd rsi, dword [ans_4] + call do_test + + mov rdi, test_5 + movsxd rsi, dword [ans_5] + call do_test + + mov rdi, test_6 + movsxd rsi, dword [ans_6] + call do_test + + mov rdi, test_7 + movsxd rsi, dword [ans_7] + call do_test + + pop rbp + xor rax, rax ; return value = 0 + ret + +do_test: + push rbp + mov rbp, rsp + push rsi ; push ans + push rdi;; push q + call strlen + push rax ; push length + lea rdi, [length] + mov rsi, rax + xor rax, rax ; vor variadic args, 0 floating point args + call printf + + pop rsi ; pop length + pop r12 ; pop q + mov rdi, r12 + call atoi + + pop rsi ; pop ans + cmp rsi, rax + jne incorrect + lea rdi, [success] + mov rsi, rax + xor rax, rax ; vor variadic args, 0 floating point args + call printf + jmp do_test_done + + +incorrect: + lea rdi, [failed] + mov rsi, r12 + mov rdx, rax + xor rax, rax ; vor variadic args, 0 floating point args + call printf + +do_test_done: + leave + ret + +atoi: + push rbp + mov rbp, rsp + mov rcx, rsi ; length + mov r11, 0 ; total + mov r9, 10 ; power of 10 for mul + +next_digit: + dec rcx ; dec length, iterate backwards over digits + + ; calculate power of 10 to multiply place digit by + mov r10, rcx ; counter, from current place to rsi (length) + inc r10 ; current place is rcx + 1 + mov rax, 1 ; one's place power + +power: + cmp r10, rsi ; is counter == len? + je convert ; yes, convert to integer + mul r9 ; no, multiply by 10 and + inc r10 ; increment counter (place) + jmp power + +convert: + movzx r10, byte [rdi+rcx] ; get ASCII char at digit location + + cmp r10, 48 ; make sure it's between '0' and '9' + jl convert_error + + cmp r10, 57 + jg convert_error + + sub r10, 48 ; 48 = "0" in ASCII + mul r10 ; multiply by power of 10 calculated above + add r11, rax ; add to total + cmp rcx, 0 + jg next_digit + mov rax, r11 + leave + ret + +convert_error: + mov rax, 0 + leave + ret + +strlen: + push rbp + mov rbp, rsp + mov rcx, 0 + +strlen_count: + cmp [rdi+rcx], byte 0 + je strlen_done + inc rcx + jmp strlen_count + +strlen_done: + mov rax, rcx + leave + ret diff --git a/asm/hello64.asm b/asm/hello64.asm new file mode 100644 index 0000000..1df0648 --- /dev/null +++ b/asm/hello64.asm @@ -0,0 +1,35 @@ +global _start + +; +; CONSTANTS +; +SYS_WRITE equ 1 +SYS_EXIT equ 60 +STDOUT equ 1 + +; +; Initialised data goes here +; +SECTION .data +hello db "Hello World!", 10 ; char * +hello_len equ $-hello ; size_t + +; +; Code goes here +; +SECTION .text + +_start: + ; syscall(SYS_WRITE, STDOUT, hello, hello_len); + mov rax, SYS_WRITE + mov rdi, STDOUT + mov rsi, hello + mov rdx, hello_len + syscall + push rax + + ; syscall(SYS_EXIT, - hello_len); + mov rax, SYS_EXIT + pop rdi + sub rdi, hello_len + syscall diff --git a/asm/loop.asm b/asm/loop.asm new file mode 100644 index 0000000..53d5ce2 --- /dev/null +++ b/asm/loop.asm @@ -0,0 +1,26 @@ +global main +extern printf + +SECTION .data +val dq 42 + +SECTION .rodata +hello db "Hello %ld!",10,0 +; +SECTION .text + +main: + push rbp + mov r12, [val] + +loop_start: + lea rdi, [hello] + mov rsi, r12 + xor rax, rax + call printf + sub r12, 1 + jnz loop_start + + mov rax, 0 + pop rbp + ret diff --git a/asm/old/Makefile b/asm/old/Makefile new file mode 100644 index 0000000..3e5acaf --- /dev/null +++ b/asm/old/Makefile @@ -0,0 +1,10 @@ +all: asm + +asm.o: asm.S + nasm -f elf asm.S + +asm: asm.o + ld -o asm asm.o + +clean: + rm asm asm.o diff --git a/asm/asm.S b/asm/old/asm.S similarity index 100% rename from asm/asm.S rename to asm/old/asm.S diff --git a/asm/disasm.c b/asm/old/disasm.c similarity index 100% rename from asm/disasm.c rename to asm/old/disasm.c diff --git a/asm/disasm.s b/asm/old/disasm.s similarity index 100% rename from asm/disasm.s rename to asm/old/disasm.s diff --git a/asm/printf.asm b/asm/printf.asm new file mode 100644 index 0000000..579c4a5 --- /dev/null +++ b/asm/printf.asm @@ -0,0 +1,20 @@ +global main +extern printf + +SECTION .data +val dq 42 + +SECTION .rodata +hello db "Hello %ld!",10,0 +; +SECTION .text + +main: + push rbx + lea rdi, [hello] + mov rsi, [val] + xor rax, rax + call printf + mov rax, 0 + pop rbx + ret diff --git a/minikube/helm/dice/templates/nfs-pv.yaml b/minikube/helm/dice/templates/nfs-pv.yaml index afcce67..dea7260 100644 --- a/minikube/helm/dice/templates/nfs-pv.yaml +++ b/minikube/helm/dice/templates/nfs-pv.yaml @@ -4,7 +4,64 @@ metadata: name: {{ .Values.app_prefix }}-nfs1 spec: capacity: - storage: 10Gi + storage: 2Gi + accessModes: + - ReadWriteMany + nfs: + server: {{ .Values.nfs_server }} + path: {{ .Values.nfs_path }} + volumeMode: Filesystem + persistentVolumeReclaimPolicy: Retain + storageClassName: nfs + mountOptions: + - hard + - nfsvers=4.2 +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ .Values.app_prefix }}-nfs2 +spec: + capacity: + storage: 2Gi + accessModes: + - ReadWriteMany + nfs: + server: {{ .Values.nfs_server }} + path: {{ .Values.nfs_path }} + volumeMode: Filesystem + persistentVolumeReclaimPolicy: Retain + storageClassName: nfs + mountOptions: + - hard + - nfsvers=4.2 +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ .Values.app_prefix }}-nfs3 +spec: + capacity: + storage: 2Gi + accessModes: + - ReadWriteMany + nfs: + server: {{ .Values.nfs_server }} + path: {{ .Values.nfs_path }} + volumeMode: Filesystem + persistentVolumeReclaimPolicy: Retain + storageClassName: nfs + mountOptions: + - hard + - nfsvers=4.2 +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ .Values.app_prefix }}-nfs4 +spec: + capacity: + storage: 2Gi accessModes: - ReadWriteMany nfs: From 259f3b955001783afef3674410d6361773055f84 Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 15 May 2024 08:34:01 -0400 Subject: [PATCH 173/180] Make code compile on Ubuntu, which defaults to -fPIC --- asm/Makefile | 4 ++-- asm/printf.asm | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/asm/Makefile b/asm/Makefile index a019975..e2b4209 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -5,10 +5,10 @@ all: $(targets) hello64 $(targets): $(targets:%=%.o) %.o: %.asm - nasm -f elf64 -g -F dwarf -o $@ $< + nasm -f elf64 -g -o $@ $< %: %.o - gcc -o $@ $< + gcc -no-pie -m64 -o $@ $< clean: rm *.o diff --git a/asm/printf.asm b/asm/printf.asm index 579c4a5..698a788 100644 --- a/asm/printf.asm +++ b/asm/printf.asm @@ -1,5 +1,6 @@ global main extern printf +default rel SECTION .data val dq 42 From e09fe8529d889bed7d21467433260a06e7279f57 Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 15 May 2024 09:55:48 -0400 Subject: [PATCH 174/180] Align 16-byte stack before lib calls --- asm/Makefile | 4 ++-- asm/args.asm | 4 ++++ asm/atoi.asm | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/asm/Makefile b/asm/Makefile index e2b4209..910bbaa 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -5,10 +5,10 @@ all: $(targets) hello64 $(targets): $(targets:%=%.o) %.o: %.asm - nasm -f elf64 -g -o $@ $< + nasm -f elf64 -g -F dwarf -o $@ $< %: %.o - gcc -no-pie -m64 -o $@ $< + gcc -no-pie -g -m64 -o $@ $< clean: rm *.o diff --git a/asm/args.asm b/asm/args.asm index 815ef48..e3b89e1 100644 --- a/asm/args.asm +++ b/asm/args.asm @@ -32,7 +32,9 @@ main: ; show arg count mov rsi, rdi ; pass argc to print_arg_count + push rsp ; push dummy to align 16-byte (128-bit) stack call print_arg_count + pop rsp ; loop from 0 to argc mov r13, 0 ; r13 will be the index @@ -43,7 +45,9 @@ list: mul r13 ; rax is the accumulator for mul add rax, r12 mov rdi, [rax] ; deref rax + push rsp ; push dummy to align 16-byte (128-bit) stack call print_arg + pop rsp inc r13 ; next cmp r13, r14 ; check if index == argc diff --git a/asm/atoi.asm b/asm/atoi.asm index 6547c53..4a51218 100644 --- a/asm/atoi.asm +++ b/asm/atoi.asm @@ -83,7 +83,10 @@ do_test: lea rdi, [length] mov rsi, rax xor rax, rax ; vor variadic args, 0 floating point args + + push rsp ; push dummy to align 16-byte (128-bit) stack call printf + pop rsp ; pop dummy value pop rsi ; pop length pop r12 ; pop q From 5d581ce0fc54797e19419a7c5d5c1384e1098569 Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 15 May 2024 10:02:26 -0400 Subject: [PATCH 175/180] Changed extensions of asm files. --- asm/Makefile | 4 ++-- asm/{args.asm => args.nasm} | 0 asm/{atoi.asm => atoi.nasm} | 0 asm/{hello64.asm => hello64.nasm} | 0 asm/{loop.asm => loop.nasm} | 0 asm/{printf.asm => printf.nasm} | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename asm/{args.asm => args.nasm} (100%) rename asm/{atoi.asm => atoi.nasm} (100%) rename asm/{hello64.asm => hello64.nasm} (100%) rename asm/{loop.asm => loop.nasm} (100%) rename asm/{printf.asm => printf.nasm} (100%) diff --git a/asm/Makefile b/asm/Makefile index 910bbaa..7f957b3 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -4,7 +4,7 @@ all: $(targets) hello64 $(targets): $(targets:%=%.o) -%.o: %.asm +%.o: %.nasm nasm -f elf64 -g -F dwarf -o $@ $< %: %.o @@ -15,7 +15,7 @@ clean: rm $(targets) hello64 # This one is special -hello64: hello64.asm +hello64: hello64.nasm nasm -f elf64 -g -F dwarf -o $@.o $< ld -o hello64 hello64.o -I/lib64/ld-linux-x86-64.so.2 diff --git a/asm/args.asm b/asm/args.nasm similarity index 100% rename from asm/args.asm rename to asm/args.nasm diff --git a/asm/atoi.asm b/asm/atoi.nasm similarity index 100% rename from asm/atoi.asm rename to asm/atoi.nasm diff --git a/asm/hello64.asm b/asm/hello64.nasm similarity index 100% rename from asm/hello64.asm rename to asm/hello64.nasm diff --git a/asm/loop.asm b/asm/loop.nasm similarity index 100% rename from asm/loop.asm rename to asm/loop.nasm diff --git a/asm/printf.asm b/asm/printf.nasm similarity index 100% rename from asm/printf.asm rename to asm/printf.nasm From 6d09c47bb9548b8eaa9ef145cd820197652d5bbd Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 15 May 2024 10:04:24 -0400 Subject: [PATCH 176/180] Restored asm extensions. Breaks syntax highlighting. --- asm/Makefile | 4 ++-- asm/{args.nasm => args.asm} | 0 asm/{atoi.nasm => atoi.asm} | 0 asm/{hello64.nasm => hello64.asm} | 0 asm/{loop.nasm => loop.asm} | 0 asm/{printf.nasm => printf.asm} | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename asm/{args.nasm => args.asm} (100%) rename asm/{atoi.nasm => atoi.asm} (100%) rename asm/{hello64.nasm => hello64.asm} (100%) rename asm/{loop.nasm => loop.asm} (100%) rename asm/{printf.nasm => printf.asm} (100%) diff --git a/asm/Makefile b/asm/Makefile index 7f957b3..910bbaa 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -4,7 +4,7 @@ all: $(targets) hello64 $(targets): $(targets:%=%.o) -%.o: %.nasm +%.o: %.asm nasm -f elf64 -g -F dwarf -o $@ $< %: %.o @@ -15,7 +15,7 @@ clean: rm $(targets) hello64 # This one is special -hello64: hello64.nasm +hello64: hello64.asm nasm -f elf64 -g -F dwarf -o $@.o $< ld -o hello64 hello64.o -I/lib64/ld-linux-x86-64.so.2 diff --git a/asm/args.nasm b/asm/args.asm similarity index 100% rename from asm/args.nasm rename to asm/args.asm diff --git a/asm/atoi.nasm b/asm/atoi.asm similarity index 100% rename from asm/atoi.nasm rename to asm/atoi.asm diff --git a/asm/hello64.nasm b/asm/hello64.asm similarity index 100% rename from asm/hello64.nasm rename to asm/hello64.asm diff --git a/asm/loop.nasm b/asm/loop.asm similarity index 100% rename from asm/loop.nasm rename to asm/loop.asm diff --git a/asm/printf.nasm b/asm/printf.asm similarity index 100% rename from asm/printf.nasm rename to asm/printf.asm From ff6751022f66a5ab84cfe92f39815b6f3ae93af8 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 18 May 2024 15:48:43 -0400 Subject: [PATCH 177/180] Added a factorial implementation in x64 assembler --- .gitignore | 1 + asm/Makefile | 2 +- asm/atoi.asm | 5 +++ asm/factorial.asm | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 asm/factorial.asm diff --git a/.gitignore b/.gitignore index 0244980..bfcf166 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ ruby_sess.* *.pyc .svn .class +*.o # except foo.o which is hand maintained !foo.o diff --git a/asm/Makefile b/asm/Makefile index 910bbaa..2b9e4ee 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -1,4 +1,4 @@ -targets = printf loop args atoi +targets = printf loop args atoi factorial all: $(targets) hello64 diff --git a/asm/atoi.asm b/asm/atoi.asm index 4a51218..4b8b1af 100644 --- a/asm/atoi.asm +++ b/asm/atoi.asm @@ -1,6 +1,11 @@ ; This program converts the first argument to an integer. ; each argument, line by line. ; +; +; This is a backwards ATOI implementation, which is clumsy, but used here +; because we also get to implement strlen and power. For a cleaner atoi, see +; the factorial.asm example. +; ; MoC global main diff --git a/asm/factorial.asm b/asm/factorial.asm new file mode 100644 index 0000000..079bd51 --- /dev/null +++ b/asm/factorial.asm @@ -0,0 +1,91 @@ +global main +extern printf + +section .data + E_badargs db "Usage: factorial N", 10, 0 + P_print_fac db "Factorial of %d is %ld", 10, 0 + +section .text + +main: + push rbp + mov rbp, rsp + + ; enough args? + cmp rdi, 2 + jne arg_error + + ; convert arg to integer + mov rdi, [rsi+8] + call atoi + push rax ; save result + mov rdi, rax + push rsi ; dummy for stack alignment + call factorial + pop rsi ; dummy + + lea rdi, [P_print_fac] ; arg 0 - the format string + pop rsi ; arg 1 - the number + mov rdx, rax ; arg 2 - the factorial + xor rax, rax ; must be 0 if no FP args + call printf + + xor rax, rax + pop rbp + ret + +factorial: + push rbp + mov rbp, rsp + + mov rcx, rdi + mov rax, rdi + +factorial_loop: + cmp rcx, 1 + je factorial_done + dec rcx + mul rcx + jmp factorial_loop + +factorial_done: + leave + ret + +arg_error: + mov rdi, E_badargs + mov rax, 0 + call printf + mov rax, 1 + mov rsp, rbp + pop rbp + ret + +atoi: + push rbp + mov rbp, rsp + + mov r9, 10 ; power of 10 for mul + mov rcx, 0 + xor rax, rax + +atoi_loop: + movzx rsi, byte [rdi+rcx] + cmp rsi, 0 + je atoi_done + + cmp rsi, 48 + jl atoi_done + + cmp rsi, 57 + jg atoi_done + + sub rsi, 48 + mul r9 + add rax, rsi + inc rcx + jmp atoi_loop + +atoi_done: + leave + ret \ No newline at end of file From a7e17af7a345df56554f38881bcbf70b02e1bb11 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 18 May 2024 19:48:24 -0400 Subject: [PATCH 178/180] Added a sum implementation --- asm/Makefile | 2 +- asm/sum.asm | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 asm/sum.asm diff --git a/asm/Makefile b/asm/Makefile index 2b9e4ee..ba5227e 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -1,4 +1,4 @@ -targets = printf loop args atoi factorial +targets = printf loop args atoi factorial sum all: $(targets) hello64 diff --git a/asm/sum.asm b/asm/sum.asm new file mode 100644 index 0000000..c765f2c --- /dev/null +++ b/asm/sum.asm @@ -0,0 +1,79 @@ +; sum list of integers in arguments + +global main +extern printf + +section .data + E_badargs db "Usage: sum N [N ...]", 10, 0 + P_print_sum db "Sum: %ld", 10, 0 + +section .text + +main: + push rbp + mov rbp, rsp + + ; enough args? + cmp rdi, 2 + jl arg_error + + mov r12, rdi ; argc + mov r13, 0 ; total + mov r14, rsi ; argv + mov r15, 1 ; counter + +sum_loop: + ; convert arg to integer + mov rdi, [r14+r15*8] + call atoi + add r13, rax + inc r15 + cmp r15, r12 + jl sum_loop + + lea rdi, [P_print_sum] ; arg 0 - the format string + mov rsi, r13 ; arg 1 - the number + xor rax, rax ; must be 0 if no FP args + call printf + + xor rax, rax + pop rbp + ret + +arg_error: + mov rdi, E_badargs + mov rax, 0 + call printf + mov rax, 1 + mov rsp, rbp + pop rbp + ret + +atoi: + push rbp + mov rbp, rsp + + mov r9, 10 ; power of 10 for mul + mov rcx, 0 + xor rax, rax + +atoi_loop: + movzx rsi, byte [rdi+rcx] + cmp rsi, 0 + je atoi_done + + cmp rsi, 48 + jl atoi_done + + cmp rsi, 57 + jg atoi_done + + sub rsi, 48 + mul r9 + add rax, rsi + inc rcx + jmp atoi_loop + +atoi_done: + leave + ret \ No newline at end of file From 6c39a5993ec829e965721d8a04b2fcef7033d426 Mon Sep 17 00:00:00 2001 From: Mo Date: Sat, 18 May 2024 20:42:29 -0400 Subject: [PATCH 179/180] Separate atoi into lib.asm, and update Makefile --- asm/Makefile | 8 +++++--- asm/lib.asm | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ asm/sum.asm | 34 +++------------------------------- 3 files changed, 58 insertions(+), 34 deletions(-) create mode 100644 asm/lib.asm diff --git a/asm/Makefile b/asm/Makefile index ba5227e..69eb48a 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -1,6 +1,6 @@ -targets = printf loop args atoi factorial sum +targets = printf loop args atoi factorial -all: $(targets) hello64 +all: $(targets) hello64 sum $(targets): $(targets:%=%.o) @@ -12,10 +12,12 @@ $(targets): $(targets:%=%.o) clean: rm *.o - rm $(targets) hello64 + rm $(targets) hello64 sum # This one is special hello64: hello64.asm nasm -f elf64 -g -F dwarf -o $@.o $< ld -o hello64 hello64.o -I/lib64/ld-linux-x86-64.so.2 +sum: sum.o lib.o + gcc -no-pie -g -m64 -o $@ $< lib.o \ No newline at end of file diff --git a/asm/lib.asm b/asm/lib.asm new file mode 100644 index 0000000..9b65db0 --- /dev/null +++ b/asm/lib.asm @@ -0,0 +1,50 @@ +; sum list of integers in arguments + +global atoi, strlen +section .text + +atoi: + push rbp + mov rbp, rsp + + mov r9, 10 ; power of 10 for mul + mov rcx, 0 + xor rax, rax + +atoi_loop: + movzx rsi, byte [rdi+rcx] + cmp rsi, 0 + je atoi_done + + cmp rsi, 48 + jl atoi_done + + cmp rsi, 57 + jg atoi_done + + sub rsi, 48 + mul r9 + add rax, rsi + inc rcx + jmp atoi_loop + +atoi_done: + leave + ret + + +strlen: + push rbp + mov rbp, rsp + mov rcx, 0 + +strlen_count: + cmp [rdi+rcx], byte 0 + je strlen_done + inc rcx + jmp strlen_count + +strlen_done: + mov rax, rcx + leave + ret diff --git a/asm/sum.asm b/asm/sum.asm index c765f2c..2e878d2 100644 --- a/asm/sum.asm +++ b/asm/sum.asm @@ -1,7 +1,8 @@ ; sum list of integers in arguments + global main -extern printf +extern printf, atoi section .data E_badargs db "Usage: sum N [N ...]", 10, 0 @@ -25,7 +26,7 @@ main: sum_loop: ; convert arg to integer mov rdi, [r14+r15*8] - call atoi + call atoi ; from lib.asm add r13, rax inc r15 cmp r15, r12 @@ -47,33 +48,4 @@ arg_error: mov rax, 1 mov rsp, rbp pop rbp - ret - -atoi: - push rbp - mov rbp, rsp - - mov r9, 10 ; power of 10 for mul - mov rcx, 0 - xor rax, rax - -atoi_loop: - movzx rsi, byte [rdi+rcx] - cmp rsi, 0 - je atoi_done - - cmp rsi, 48 - jl atoi_done - - cmp rsi, 57 - jg atoi_done - - sub rsi, 48 - mul r9 - add rax, rsi - inc rcx - jmp atoi_loop - -atoi_done: - leave ret \ No newline at end of file From 7f957a1cb3b0b041079f30bf1527cfb0498ee527 Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 19 May 2024 11:46:46 -0400 Subject: [PATCH 180/180] Implement floating point conversion (atof) and mean --- asm/Makefile | 2 +- asm/mean.asm | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 asm/mean.asm diff --git a/asm/Makefile b/asm/Makefile index 69eb48a..f8442a6 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -1,4 +1,4 @@ -targets = printf loop args atoi factorial +targets = printf loop args atoi factorial mean all: $(targets) hello64 sum diff --git a/asm/mean.asm b/asm/mean.asm new file mode 100644 index 0000000..58f5e56 --- /dev/null +++ b/asm/mean.asm @@ -0,0 +1,116 @@ +; print the mean of a list of floating point arguments + +global main +extern printf + +section .data + E_badargs db "Usage: mean N [N ...]", 10, 0 + P_print_mean db "Mean: %lf", 10, 0 + FP_zero dq 0.0 + FP_ten dq 10.0 + +section .text + +main: + push rbp + mov rbp, rsp + + ; enough args? + cmp rdi, 2 + jl arg_error + + mov r12, rdi ; argc + mov r14, rsi ; argv + mov r15, 1 ; counter + movsd xmm1, qword [FP_zero] ; total + +sum_loop: + ; convert arg to integer + mov rdi, [r14+r15*8] + call atof ; from lib.asm + addsd xmm1, xmm0 + inc r15 + cmp r15, r12 + jl sum_loop + + ; divide by count + sub r12, 1 + cvtsi2sd xmm3, r12 + divsd xmm1, xmm3 + + lea rdi, [P_print_mean] ; arg 0 - the format string + movsd xmm0, xmm1 ; arg 1 - the mean + mov rax, 1 ; there's 1 FP arg to printf + call printf + + xor rax, rax + pop rbp + ret + +arg_error: + mov rdi, E_badargs + mov rax, 0 + call printf + mov rax, 1 + mov rsp, rbp + pop rbp + ret + +atof: + push rbp + mov rbp, rsp + + mov rcx, 0 ; string intex + + movsd xmm0, qword [FP_zero] ; accumulator + movsd xmm3, qword [FP_ten] ; place value (multiplier) + +atof_loop: + movzx rsi, byte [rdi+rcx] + cmp rsi, 46 ; period + je frac_start + + cmp rsi, 0 + je atof_done + + cmp rsi, 48 + jl atof_done + + cmp rsi, 57 + jg atof_done + + sub rsi, 48 ; convert ASCII to integer + cvtsi2sd xmm2, rsi ; convert integer to double + mulsd xmm0, xmm3 ; multiply integer accumulator by 10 + addsd xmm0, xmm2 ; add integer to accumulator + + inc rcx + jmp atof_loop + +frac_start: + inc rcx + +frac_loop: + movzx rsi, byte [rdi+rcx] + cmp rsi, 0 + je atof_done + + cmp rsi, 48 + jl atof_done + + cmp rsi, 57 + jg atof_done + + sub rsi, 48 ; convert ASCII to integer + cvtsi2sd xmm2, rsi ; convert integer to double + divsd xmm2, xmm3 ; divide integer by place + addsd xmm0, xmm2 ; accumulate + + mulsd xmm3, qword [FP_ten] ; increase place value by 1 + inc rcx + + jmp frac_loop + +atof_done: + leave + ret \ No newline at end of file