From 3a5689e76773536669260ac426e6e94dc7c1c44c Mon Sep 17 00:00:00 2001 From: "david.mansson" Date: Thu, 26 Mar 2020 10:50:10 +0100 Subject: [PATCH 001/251] Add chainOrder option to ensure server certificate is first in chain --- .../controller/secret_handler.go | 15 ++++++---- .../controller/secret_handler_test.go | 2 +- cmd/azure-keyvault-env/secret_handler.go | 10 +++++-- .../reference/azure-key-vault-secret.md | 7 ++++- installation/crd.yaml | 5 ++++ .../client/azure_keyvault_service.go | 16 +++++++--- pkg/azurekeyvault/client/certificate.go | 26 +++++++++++----- pkg/azurekeyvault/client/certificate_test.go | 30 ++++++++++++++++--- pkg/k8s/apis/azurekeyvault/v1/types.go | 1 + 9 files changed, 86 insertions(+), 26 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 6d53759c..ed7794ef 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -143,22 +143,25 @@ func (h *AzureSecretHandler) Handle() (map[string][]byte, error) { func (h *AzureCertificateHandler) Handle() (map[string][]byte, error) { values := make(map[string][]byte) var err error + options := vault.CertificateOptions{ + ExportPrivateKey: h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeTLS || h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque, + EnsureServerFirst: h.secretSpec.Spec.Output.Secret.ChainOrder == "ensureserverfirst", + } - exportPrivateKey := h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeTLS || h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque - if !exportPrivateKey && h.secretSpec.Spec.Output.Secret.DataKey == "" { - return nil, fmt.Errorf("no datakey spesified for output secret") + if !options.ExportPrivateKey && h.secretSpec.Spec.Output.Secret.DataKey == "" { + return nil, fmt.Errorf("no datakey specified for output secret") } - log.Infof("Exporting certificate with private key: %t", exportPrivateKey) + log.Infof("Exporting certificate with private key: %t", options.ExportPrivateKey) - cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, exportPrivateKey) + cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, &options) if err != nil { return nil, err } if h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque { values[h.secretSpec.Spec.Output.Secret.DataKey] = cert.ExportRaw() - } else if exportPrivateKey { + } else if options.ExportPrivateKey { if values[corev1.TLSCertKey], err = cert.ExportPublicKeyAsPem(); err != nil { return nil, err } diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go index dcbdd616..3bea9bd4 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go @@ -46,7 +46,7 @@ func (f *fakeVaultService) GetSecret(secret *akv.AzureKeyVault) (string, error) func (f *fakeVaultService) GetKey(secret *akv.AzureKeyVault) (string, error) { return "", nil } -func (f *fakeVaultService) GetCertificate(secret *akv.AzureKeyVault, exportPrivateKey bool) (*vault.Certificate, error) { +func (f *fakeVaultService) GetCertificate(secret *akv.AzureKeyVault, options *vault.CertificateOptions) (*vault.Certificate, error) { if f.fakeCertValue != "" { return vault.NewCertificateFromPem(f.fakeCertValue) } diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go index 4879200f..8fca1383 100644 --- a/cmd/azure-keyvault-env/secret_handler.go +++ b/cmd/azure-keyvault-env/secret_handler.go @@ -136,8 +136,12 @@ func (h *AzureKeyVaultSecretHandler) Handle() (string, error) { // Handle getting and formating Azure Key Vault Certificate from Azure Key Vault to Kubernetes func (h *AzureKeyVaultCertificateHandler) Handle() (string, error) { - exportPrivateKey := h.query == corev1.TLSPrivateKeyKey - cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, exportPrivateKey) + options := vault.CertificateOptions { + ExportPrivateKey: h.query == corev1.TLSPrivateKeyKey, + EnsureServerFirst: h.secretSpec.Spec.Output.Secret.ChainOrder == "ensureserverfirst", + } + + cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, &options) if err != nil { return "", err @@ -150,7 +154,7 @@ func (h *AzureKeyVaultCertificateHandler) Handle() (string, error) { var privKey []byte var pubKey []byte - if exportPrivateKey { + if options.ExportPrivateKey { if privKey, err = cert.ExportPrivateKeyAsPem(); err != nil { return "", err } diff --git a/docs/source/content/reference/azure-key-vault-secret.md b/docs/source/content/reference/azure-key-vault-secret.md index 4d7bd2b7..e608dfa8 100644 --- a/docs/source/content/reference/azure-key-vault-secret.md +++ b/docs/source/content/reference/azure-key-vault-secret.md @@ -22,8 +22,9 @@ spec: output: # ignored by env injector, required by controller to output kubernetes secret secret: name: - dataKey: type: + dataKey: + chainOrder: ``` > **Note - the `output` is only used by the Controller to create the Azure Key Vault secret as a Kubernetes native Secret - it is ignored and not needed by the Env Injector.** @@ -85,3 +86,7 @@ This must be a properly formatted **Private** SSH Key stored in a Secret object. | `certificate` | Azure Key Vault Certificate - A TLS certificate with just the public key or both public and private key if exportable | | `key` | Azure Key Vault Key - A RSA or EC key used for signing | | `multi-key-value-secret` | A special kind of Azure Key Vault Secret only understood by the Controller and the Env Injector. For cases where a secret contains `json` or `yaml` key/value items that will be directly exported as key/value items in the Kubernetes secret, or access with queries in the Evn Injector. When `multi-key-value-secret` type is used, the `contentType` property MUST also be set to either `application/x-json` or `application/x-yaml`. | + +## Chain Order + +When exporting a PFX certificate from Key Vault the server certificate sometimes end up at the end of the chain instead of the beginning. If this is used together with, for example, ingress-nginx the certificate won't be loaded and it will revert back to default. By setting `chainOrder` to `ensureserverfirst` the server certificate will be moved first in the chain. \ No newline at end of file diff --git a/installation/crd.yaml b/installation/crd.yaml index e10d5577..19eedf6d 100644 --- a/installation/crd.yaml +++ b/installation/crd.yaml @@ -77,3 +77,8 @@ spec: dataKey: type: string description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data + chainOrder: + type: string + description: Changes order of certificates + enum: + - ensureserverfirst \ No newline at end of file diff --git a/pkg/azurekeyvault/client/azure_keyvault_service.go b/pkg/azurekeyvault/client/azure_keyvault_service.go index 9cf0ec75..86a057bb 100644 --- a/pkg/azurekeyvault/client/azure_keyvault_service.go +++ b/pkg/azurekeyvault/client/azure_keyvault_service.go @@ -35,7 +35,7 @@ const ( type Service interface { GetSecret(secret *akvs.AzureKeyVault) (string, error) GetKey(secret *akvs.AzureKeyVault) (string, error) - GetCertificate(secret *akvs.AzureKeyVault, exportPrivateKey bool) (*Certificate, error) + GetCertificate(secret *akvs.AzureKeyVault, options *CertificateOptions) (*Certificate, error) } type azureKeyVaultService struct { @@ -49,6 +49,11 @@ func NewService(credentials AzureKeyVaultCredentials) Service { } } +type CertificateOptions struct { + ExportPrivateKey bool + EnsureServerFirst bool +} + // GetSecret download secrets from Azure Key Vault func (a *azureKeyVaultService) GetSecret(vaultSpec *akvs.AzureKeyVault) (string, error) { if vaultSpec.Object.Name == "" { @@ -98,7 +103,7 @@ func (a *azureKeyVaultService) GetKey(vaultSpec *akvs.AzureKeyVault) (string, er } // GetCertificate download public/private certificates from Azure Key Vault -func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, exportPrivateKey bool) (*Certificate, error) { +func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, options *CertificateOptions) (*Certificate, error) { vaultClient, err := a.getClient() if err != nil { return nil, err @@ -114,7 +119,7 @@ func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, exp return nil, fmt.Errorf("failed to get certificate from azure key vault, error: %+v", err) } - if exportPrivateKey { + if options.ExportPrivateKey { if !*certBundle.Policy.KeyProperties.Exportable { return nil, fmt.Errorf("cannot export private key because key is not exportable in azure key vault") } @@ -131,7 +136,10 @@ func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, exp if err != nil { return nil, fmt.Errorf("failed to decode base64 encoded pfx, error: %+v", err) } - return NewCertificateFromPfx(pfxRaw) + if options.EnsureServerFirst { + return NewCertificateFromPfx(pfxRaw, true) + } + return NewCertificateFromPfx(pfxRaw, false) default: return nil, fmt.Errorf("failed to get certificate from azure key vault - unknown content type '%s'", *secretBundle.ContentType) } diff --git a/pkg/azurekeyvault/client/certificate.go b/pkg/azurekeyvault/client/certificate.go index 76753308..7d87a22a 100644 --- a/pkg/azurekeyvault/client/certificate.go +++ b/pkg/azurekeyvault/client/certificate.go @@ -62,7 +62,7 @@ func NewCertificateFromPem(pem string) (*Certificate, error) { // privateDer, rest := pem.Decode([]byte(c.cert)) // publicDer, _ := pem.Decode(rest) - cert, err := importPem(pem) + cert, err := importPem(pem, false) if err != nil { return nil, err } @@ -73,7 +73,7 @@ func NewCertificateFromPem(pem string) (*Certificate, error) { } // NewCertificateFromPfx creates a new Certificate from a PFX certificate -func NewCertificateFromPfx(pfx []byte) (*Certificate, error) { +func NewCertificateFromPfx(pfx []byte, ensureServerFirst bool) (*Certificate, error) { pemList, err := pkcs12.ToPEM(pfx, "") if err != nil { @@ -85,7 +85,7 @@ func NewCertificateFromPfx(pfx []byte) (*Certificate, error) { mergedPems.WriteString(string(pem.EncodeToMemory(pemCert))) } - cert, err := importPem(mergedPems.String()) + cert, err := importPem(mergedPems.String(), ensureServerFirst) if err != nil { return nil, err } @@ -161,9 +161,10 @@ func (cert *Certificate) ExportRaw() []byte { return cert.raw } -func importPem(pemCert string) (*Certificate, error) { +func importPem(pemCert string, ensureServerFirst bool) (*Certificate, error) { var cert Certificate - var publicDers []byte + var publicDers [][]byte + var joinedPublicDers []byte var err error raw := []byte(pemCert) @@ -173,7 +174,7 @@ func importPem(pemCert string) (*Certificate, error) { break } if pemBlock.Type == "CERTIFICATE" { - publicDers = append(publicDers, pemBlock.Bytes...) + publicDers = append(publicDers, pemBlock.Bytes) } else { err = parsePrivateKey(pemBlock.Bytes, &cert) if err != nil { @@ -183,7 +184,18 @@ func importPem(pemCert string) (*Certificate, error) { raw = rest } - cert.Certificates, err = x509.ParseCertificates(publicDers) + if ensureServerFirst && len(publicDers) > 1 { + publicDers = append( + publicDers[len(publicDers)-1:], + publicDers[0:len(publicDers)-1]..., + ) + } + + for _, der := range publicDers { + joinedPublicDers = append(joinedPublicDers, der...) + } + + cert.Certificates, err = x509.ParseCertificates(joinedPublicDers) if err != nil { return nil, err } diff --git a/pkg/azurekeyvault/client/certificate_test.go b/pkg/azurekeyvault/client/certificate_test.go index 90ca15bd..59912a35 100644 --- a/pkg/azurekeyvault/client/certificate_test.go +++ b/pkg/azurekeyvault/client/certificate_test.go @@ -26,11 +26,13 @@ var ( pemTestCert = "-----BEGIN PRIVATE KEY-----\n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\nk125vXj8DvpA/GTS1kARDjKz8dET\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIFUjCCAzqgAwIBAgIQFwNmpFLpQLWUtRrCdyrn0TANBgkqhkiG9w0BAQsFADAm\nMSQwIgYDVQQDExtjdW11bHVzLXRlc3QtY2VydC5zcHZlc3Qubm8wHhcNMTkwMjAx\nMTUzNjMxWhcNMTkwMzAxMTU0NjMxWjAmMSQwIgYDVQQDExtjdW11bHVzLXRlc3Qt\nY2VydC5zcHZlc3Qubm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv\nOy4KydxUOW6KmMhq01IAu5Rz47U1oE6ewq0Yi5ea9CrGN7eUWLOogapoKmFFhO2s\n5SDdPt9HOkDNvh75k4B7OFhM+GaOTRubXgPEg8PV7dFFS52+3C0xORdS+wvgI2i9\neIMqbr1Y8Znw5H3pLG8DsU6Q8FCo14mvW8/ou+xKbSOzWFFaP+dNHFBCARqI+DhQ\nYJFkeg4vPd+nFGxfPH/lbbR9WN0tChOTVUJlGkJlht9/0bsVmM8xAdUS/zQ6qK8n\nKWhLpCtWyo8zKDWg5gsdcMoWYgAIXpinc1NcOyGlMv263Zhw7gB+y7JEMK2Ro3e3\nSmhSpH48CkejpIsUOBNnvr514wkLNLet9sXGZvFXs7oiTkUzgu0MFsZPVAkiYhdH\ndYdg2I9e5t4yyxbu+DSr/OvRbUtC9PrO1ncJaO7p9QcXVuRNi2wxLDeaTZgd9S6M\n2fzR2xcwq3Fxk53gDlRTXgqIM/VCPA+3vp5di+MKGK7aLyNRPxeKcsDLEPHF7MeF\nZJw21xTupEMl8w5KaBd5NiKAwxbLyV8YCZFjJG3V2MOxVAA01BAm7w3lz1/iMbKi\nPGbDA0p3cxvaLYs0RdcNfZ6+4X7al7vBXj8+Hwf/tADY648eBEjTqctVDirElCmj\nN8A0ysqldwqCr+8F8k8PUfR3yb809m8QURE7mEAPVQIDAQABo3wwejAOBgNVHQ8B\nAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH\nAwIwHwYDVR0jBBgwFoAUlJOHnXHhHeY+AjaPPmKFVRw3K1MwHQYDVR0OBBYEFJST\nh51x4R3mPgI2jz5ihVUcNytTMA0GCSqGSIb3DQEBCwUAA4ICAQAn/chFtfLEebP5\n5Tmb+H+eEzOXaHRonUsVriV/66htOeffkNX2b2DOIosvSwKukOkVggLFmyMKhxiq\neZkkAYyMMjjtWqbkCwoCyb8iDUQLaEovy4Pzwpm3YMVK9+o6cIf4zs3AgzaSSpbo\npq8HQbmFGrUGNEyGMclvf5VL1vCw+0jLpJ1+9b79DRY7puPG19zwWWcHk2hNV3aD\n6lWar7/pjqA9ESQhDTeUsXaFMGVm0Ez97IDI/ZVO+ia5+rIo5wAcUGKuYLIs57Wl\ndhlzMil3mz2g4STiWI+VhtPnqPot6MaWuKIN4R+kJocN365WJf2wozYgEjNFANK+\n3hO396cieWBTqyoYYZRxDxz7slD5NikixrJd50QshYCzqKiNopKsafqMHqc3JKZu\nz9tBZ25g43vdSuAwxjSab5DyYGF3Z447jdKOLUYReNnoB7nlTuW5LYfOX20F/XtC\n+4iL+IDjtAfwATruKzbLnKL9IoemLs7XMoW2qYBmCAcfHrI2F3alAar2XTA9lkDR\nMPpJf9q3VzxkPhjlvi8RPJfWLD1Kw4gMVfhao/NQv3SlhQ2rBpczP8XQOWdTNWp/\n043EPQis8+56AEHis/5+NKoNcQYZJwu2uwK0fdILcStJXR//EI04zBzWo/ULe5nc\nU0GaEMA+K/ZUHV2BxSMA3Br0IwdNvg==\n-----END CERTIFICATE-----\n" pfxTestCert = "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" derTestCert = "MIIDPjCCAiagAwIBAgIQJVHUTfH7TVCyXO649HajejANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDExFjdW11bHVzLnNwdmVzdC5ubzAeFw0xOTAyMDQxNDE0NTZaFw0xOTAzMDQxNDI0NTZaMBwxGjAYBgNVBAMTEWN1bXVsdXMuc3B2ZXN0Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsCYvQCbABVTAUx8G8Lg7SiNzRHCxaTPG8qp5La+SfnSPAX80u3EpVZc84vYGE9QlGWth1LmhHXfGneTAq7yMRYiBFNc0Y9O+66eZDuIErQ7RDL7N7TSyMzoXgH1xhI14x0XvkZqJwaNqJBvBzSlADNWuKBvPQ2nChKlnjuY3Zrg9KJ1A5T1KF/UW4ZKSZrwyu0fyAzfpBMWkrHa+mYv1wSL0cVDOFGvZIldCMew0gXGHY4ydM0iTW878/epTNQNgeno9M4jnFUXyoVguSH8ZjsFXBOtenIUJWoJs72zHJn5yNz2Bipu0zVrHBJXLi40FBY913/t1X5iBj7WejzUXmQIDAQABo3wwejAOBgNVHQ8BAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUZptBMgsn6JCzZp4So23dBSdWfcowHQYDVR0OBBYEFGabQTILJ+iQs2aeEqNt3QUnVn3KMA0GCSqGSIb3DQEBCwUAA4IBAQAbvqmrDHz6UXbddj/VYWO/m2m5Hm2cudMfInuwnGuOzO0MtKYthkELTu+CirlQjyMya/iLKb/SZ3hRQwyJP4XBWqUm2uaTHfbrv4gpc/hMQ80n8f6hOBofLrEPogaYNGHhWMjSJXj3nDKrp2cDyusTnQkLQWaix0c2GLIif3UfGJBgptUwMgsx1kaiCzbyBW/Kv8BiQSA82ocXqqxAzHBGfKhLHZZXPdoTgEE+vwwPLM1wzvhDzDAkR96/yCwGBr53dUeXXCUh70IiJbJpGNiVc33QEVYw0+Gua7rj99LK4EljlY1E1xbPadSFYeK9KsDlmb9ota2p7iKg1D1JiydK" + pfxTestCertOrderWrong = "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" + pemTestCertOrderExpected = "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIJAPOREtFE1TsGMA0GCSqGSIb3DQEBBQUAMBoxGDAWBgNV\nBAMMD3d3dy5leGFtcGxlLmNvbTAeFw0yMDAzMjYwODU1MDZaFw0zMDAzMjQwODU1\nMDZaMBoxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBAKl3qkYFwsp43MDcYj23agGuJQPGtZZetTvarWI4xsys\nShHePvb/nzgLiVkSNvZthCdBaHKWa62ZJMS19OqWEWgAj2v89n/1c4fN/LN8QwYa\n75tOZ5k5rB/2V5Zw4pq49WjTDPIkFlsKtvepSjxbG8Ie612R9Dwc+L+8OycyoalK\nYdZtUgcttidAS9Ty6Vhc9BaC3JbIB9STB2iQw+qTjDasHXCZoSNB4Jr3/u3RFkKD\n8t3uqnIwa1RH3UbN8seQRTEhtCo5DFIn+H76kXkQ1wM4LCjW6WHjUyfxwRTzr5Qf\nZ56FiKxlbfivr6Xr6dzRG0pcbAMOSFx45OgAzTWeh0ECAwEAAaNQME4wHQYDVR0O\nBBYEFEwA39G1twh6lTo2og8xnQuwJRN6MB8GA1UdIwQYMBaAFEwA39G1twh6lTo2\nog8xnQuwJRN6MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBACVm4DrM\nmoiQC+tKipYHQft5AzI7l5/jFzICl6HAEhvgZ7+dSiToPKFnCY7Rg6iGGHvEwquw\ng3330OHIwMUDEhUh+ylqTflSN4msKRxdbCy3v84KKp0LN+w4x6wHY1CQiExzvWe8\nD62GGZQBXXdNq7K+/BAotZCh9tpoesw62rUvbWjbRt9gZKhuq2WbqtBRQAuB91Yq\nGyXC/Zpe9Bxm91qPOSzyiE+6yhTEaO2cdBkyCy0aP/JTJIowE/pw2hCrAVY8BlMs\n1FPrKRRC8qH+n6ahR0g7pViCxhQv8cq6LV9C5z70ZKtIWobL2lVjiOBSWt1fVnXn\nL/VUlQqA4z8na6o=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICQDCCAakCFHNdlFiLlaeRn0se50n3MIm9xkc2MA0GCSqGSIb3DQEBCwUAMF8x\nCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl\ncm5ldCBXaWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTAe\nFw0yMDAzMjYwODU5MjhaFw0yMTAzMjYwODU5MjhaMF8xCzAJBgNVBAYTAkFVMRMw\nEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0\neSBMdGQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEF\nAAOBjQAwgYkCgYEAr6s6nN6RSgvUZ4AUsq9UdbdezdHyAmn1ZhDD5XmteK4Td31P\nYCvED8Liddz7qO156m4TbbH1ghdWjNyLWS8ydzAbA7fE7wGYazj5iGahljCTxnIm\nsvQ8t1NJVk7AUyzgO1Xx4S1v2LVM82DU0chb+VrhWrPc/6JySxfQNRNqbu8CAwEA\nATANBgkqhkiG9w0BAQsFAAOBgQCJNuDeN1hf3lorCykH4l5ebjqI5t4Zichx8k51\nQ9cRoDWgLr8jpGbcnUqPdCQYR7J1YITtcZUxZE+O7q1A0te52hAytohspkpMVILr\nD3rBJmblkfKqOTXY6tj1ZcA4dSphcmSiy1lugnlKcGj3PSiB7QTDjMBKL6XUFmRX\nn0UL+A==\n-----END CERTIFICATE-----\n" ) func TestImportPfx(t *testing.T) { pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert) - cert, err := NewCertificateFromPfx(pfxRaw) + cert, err := NewCertificateFromPfx(pfxRaw, false) if err != nil { t.Error(err) } @@ -83,7 +85,7 @@ func TestImportDer(t *testing.T) { func TestGetPrivateKeyPem(t *testing.T) { pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert) - cert, err := NewCertificateFromPfx(pfxRaw) + cert, err := NewCertificateFromPfx(pfxRaw, false) if err != nil { t.Error(err) } @@ -99,7 +101,7 @@ func TestGetPrivateKeyPem(t *testing.T) { func TestGetPublicKeyPem(t *testing.T) { pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert) - cert, err := NewCertificateFromPfx(pfxRaw) + cert, err := NewCertificateFromPfx(pfxRaw, false) if err != nil { t.Error(err) } @@ -113,9 +115,29 @@ func TestGetPublicKeyPem(t *testing.T) { } } +func TestGetPublicKeyPemChainOrder(t *testing.T) { + pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCertOrderWrong) + cert, err := NewCertificateFromPfx(pfxRaw, true) + if err != nil { + t.Error(err) + } + pemCert, err := cert.ExportPublicKeyAsPem() + if err != nil { + t.Error(err) + } + + if len(pemCert) == 0 { + t.Error("Pem is empty") + } + + if string(pemCert) != pemTestCertOrderExpected { + t.Error("Certificate order wrong") + } +} + func TestGetRawCert(t *testing.T) { pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert) - cert, err := NewCertificateFromPfx(pfxRaw) + cert, err := NewCertificateFromPfx(pfxRaw, false) if err != nil { t.Error(err) } diff --git a/pkg/k8s/apis/azurekeyvault/v1/types.go b/pkg/k8s/apis/azurekeyvault/v1/types.go index 72cbbdd1..65ead137 100644 --- a/pkg/k8s/apis/azurekeyvault/v1/types.go +++ b/pkg/k8s/apis/azurekeyvault/v1/types.go @@ -96,6 +96,7 @@ type AzureKeyVaultOutputSecret struct { // +optional Type corev1.SecretType `json:"type,omitempty"` DataKey string `json:"dataKey"` + ChainOrder string `json:"chainOrder"` } // AzureKeyVaultSecretStatus is the status for a AzureKeyVaultSecret resource From 96eb22ca0a95d25da9a1084ba3833df071d4e9f0 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 28 Mar 2020 23:16:05 +0000 Subject: [PATCH 002/251] fix: upgrade gatsby-source-graphql from 2.1.33 to 2.1.34 Snyk has created this PR to upgrade gatsby-source-graphql from 2.1.33 to 2.1.34. See this package in NPM: https://www.npmjs.com/package/gatsby-source-graphql See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 14 +++++++------- docs/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 5dff8f98..2ddca4f9 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9052,9 +9052,9 @@ } }, "gatsby-source-graphql": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.1.33.tgz", - "integrity": "sha512-xQ8EeTFWjKDQ+7c4R9cUNFzhp1e0DyiFels4XG6IDdwwlJd38pkk2cWe9SBpPP8AUfNnt6ry29koYVO0ztzslw==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.1.34.tgz", + "integrity": "sha512-nPtMGJEFlF2FG/II7ltpklU1iJ/iffaDneZyPy6pJ9UO2ujC067daHzHavbUUZxf3xt630Cd7ULcQzJxuutoeA==", "requires": { "@babel/runtime": "^7.7.6", "apollo-link": "1.2.13", @@ -9772,9 +9772,9 @@ } }, "graphql-tools-fork": { - "version": "8.6.4", - "resolved": "https://registry.npmjs.org/graphql-tools-fork/-/graphql-tools-fork-8.6.4.tgz", - "integrity": "sha512-Ik6TdKhQXTy2fJ2zPM9NEEigGWuPAVQZ8eq67wOF3yAdNfhCZ+U64i90OUH5KathDRrnY3w4Gou74sSlk5zY7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/graphql-tools-fork/-/graphql-tools-fork-8.10.0.tgz", + "integrity": "sha512-RzUIpnBMxInqgAtTmfET34Z6cwpREwTaXedRDT+0e6vzMdL2GckDqkCQyxsXHghbCVOL80oOXGB02S0rzgkOwA==", "requires": { "apollo-link": "^1.2.13", "apollo-link-http-common": "^0.2.15", @@ -9783,7 +9783,7 @@ "form-data": "^3.0.0", "iterall": "^1.3.0", "node-fetch": "^2.6.0", - "uuid": "^7.0.1" + "uuid": "^7.0.2" }, "dependencies": { "form-data": { diff --git a/docs/package.json b/docs/package.json index dab9a254..0ad2d6f0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,7 +9,7 @@ "algoliasearch": "^4.0.3", "gatsby": "2.19.28", "gatsby-plugin-gtag": "^1.0.13", - "gatsby-source-graphql": "^2.1.33", + "gatsby-source-graphql": "^2.1.34", "gatsby-theme-apollo-docs": "4.0.11", "instantsearch.css": "^7.4.2", "react": "16.12.0", From 163b872181d36aeee46f2e10a8c76c88ee6e50dc Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 31 Mar 2020 23:14:57 +0000 Subject: [PATCH 003/251] fix: upgrade algoliasearch from 4.0.3 to 4.1.0 Snyk has created this PR to upgrade algoliasearch from 4.0.3 to 4.1.0. See this package in NPM: https://www.npmjs.com/package/algoliasearch See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 166 ++++++++++++++++++++--------------------- docs/package.json | 2 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 5dff8f98..2994e36a 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3,118 +3,118 @@ "lockfileVersion": 1, "dependencies": { "@algolia/cache-browser-local-storage": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.0.3.tgz", - "integrity": "sha512-iHzUP7ZP09Cd48aAu58OnERchgdho/5l12YoL70AXLeDmyu/ZTENuGHiSwM2NHFE+nM4naH0N9krxtVf3/5HSg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.1.0.tgz", + "integrity": "sha512-r8BOgqZXVt+JPgP19PQNzZ+lYP+MP6eZKNQqfRYofFEx+K9oyfdtGCqmoWJsBUi3nNOzhbOcg2jfP2GJzJBZ5g==", "requires": { - "@algolia/cache-common": "4.0.3" + "@algolia/cache-common": "4.1.0" } }, "@algolia/cache-common": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.0.3.tgz", - "integrity": "sha512-5XwhDpT3bxbLc/NRJayNN7Yfj9UrqZERKjcwv2D1nl3DFa55St9czspbU9XaDns3NhyPY5XipBYJEafWa8NtVA==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.1.0.tgz", + "integrity": "sha512-ZvvK40bs1BWLErchleZL4ctHT2uH56uLMnpZPCuIk+H2PKddeiIQc/z2JDu2BHr68u513XIAAoQ+C+LgKNugmw==" }, "@algolia/cache-in-memory": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.0.3.tgz", - "integrity": "sha512-2eiyV+2oYbpErHNKzcITblVuw2K0qVyFfWxpSQVg5TUWg+PrEfvxAa3oDpcFvkvw/E4lIdvwt2AG8e5ldI11qQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.1.0.tgz", + "integrity": "sha512-2382OXYFDeoPLA5vP9KP58ad15ows24ML5/io/T1N0xsZ0eVXDkT52qgaJw/esUfEkWScZ2R8kpesUa+qEP+kw==", "requires": { - "@algolia/cache-common": "4.0.3" + "@algolia/cache-common": "4.1.0" } }, "@algolia/client-account": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.0.3.tgz", - "integrity": "sha512-qMdMD746HjzqGUH+M5yDdinPzDwLK7HSLoyfZqCDaqZD4oxhI0pwvwyTnrSQ+LngWe9wMhu/l+uhipo0libilA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.1.0.tgz", + "integrity": "sha512-GFINlsxAHM/GEeDBjoTx8+J1ra9SINQCuXi2C9QSLFClPKug2lzApm8niJJGXckhyZ2aDLb7drJ1qJ8bTspApw==", "requires": { - "@algolia/client-common": "4.0.3", - "@algolia/client-search": "4.0.3", - "@algolia/transporter": "4.0.3" + "@algolia/client-common": "4.1.0", + "@algolia/client-search": "4.1.0", + "@algolia/transporter": "4.1.0" } }, "@algolia/client-analytics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.0.3.tgz", - "integrity": "sha512-y9J6iWowtvc5iKarIYi9FJC7QJJ0y06vvZI8Pa6UC99KyGEosxHiw8vVSlcWdz48nVbDpqvszD/ocpnU1eoGFQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.1.0.tgz", + "integrity": "sha512-JMyZ9vXGbTJWiO66fWEu9uJ7GSYfouUyaq8W/6esADPtBbelf+Nc0NRlicOwHHJGwiJvWdvELafxrhkR1+KR8A==", "requires": { - "@algolia/client-common": "4.0.3", - "@algolia/client-search": "4.0.3", - "@algolia/requester-common": "4.0.3", - "@algolia/transporter": "4.0.3" + "@algolia/client-common": "4.1.0", + "@algolia/client-search": "4.1.0", + "@algolia/requester-common": "4.1.0", + "@algolia/transporter": "4.1.0" } }, "@algolia/client-common": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.0.3.tgz", - "integrity": "sha512-pAuPT0LH/k0HB1ZfNBbfylPApruVenxn1EZWYDJcuEWkXe8yde+rTOA1355C6M2oz8khEYxKHoCckGUlz6WKSw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.1.0.tgz", + "integrity": "sha512-fjSMKeG54vAyQAhf+uz039/birTiLun8nDuCNx4CUbzGl97M0g96Q8jpsiZa0cjSNgh0VakMzn2GnHbS55W9/Q==", "requires": { - "@algolia/requester-common": "4.0.3", - "@algolia/transporter": "4.0.3" + "@algolia/requester-common": "4.1.0", + "@algolia/transporter": "4.1.0" } }, "@algolia/client-recommendation": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.0.3.tgz", - "integrity": "sha512-svki0hByAMPCEJhzU//6qCpEPt2e7HABMmWVybHX+fxElBnJrYkLu5lukRX6xZYyCtqob5EMWUIOVpFUSsfe+A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.1.0.tgz", + "integrity": "sha512-UEN/QgQwVtVH++yAs2uTuyZZQQ1p5Xs/7/FKT4Kh9/8NAyqDD49zuyq/giw8PRNhWc3C/9jiO7X4RKE8QrVWGw==", "requires": { - "@algolia/client-common": "4.0.3", - "@algolia/requester-common": "4.0.3", - "@algolia/transporter": "4.0.3" + "@algolia/client-common": "4.1.0", + "@algolia/requester-common": "4.1.0", + "@algolia/transporter": "4.1.0" } }, "@algolia/client-search": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.0.3.tgz", - "integrity": "sha512-Q4XE9SlQuxJQfOxOZA4u1MA9H5xOu2TBjmlCBG4tOsUq79u6uK5w/qfIfzvorIg7PrItIC2eGTkykD8HmBkIEA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.1.0.tgz", + "integrity": "sha512-bpCYMEXUdyiopEBSHHwnrRhNEwOLstIeb0Djz+/pVuTXEr3Xg3JUoAZ8xFsCVldcXaZQpbi1/T0y3ky6xUVzfw==", "requires": { - "@algolia/client-common": "4.0.3", - "@algolia/requester-common": "4.0.3", - "@algolia/transporter": "4.0.3" + "@algolia/client-common": "4.1.0", + "@algolia/requester-common": "4.1.0", + "@algolia/transporter": "4.1.0" } }, "@algolia/logger-common": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.0.3.tgz", - "integrity": "sha512-DC7JiFc6cXQk6Ut5RS8M5ieBHtfUBBFmUXaJtloqcANNmAdFZnOcayIgRYz+fGXEkz2AzhObReN0vZ45BmiVBQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.1.0.tgz", + "integrity": "sha512-QrE4Srf1LB7ekLzl68bFqlTrv7Wk7+GpsaGfB4xFZ9Pfv89My9p7qTVqdLlA44hEFY3fZ9csJp1/PFVucgNB4w==" }, "@algolia/logger-console": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.0.3.tgz", - "integrity": "sha512-KXHXpwZ4cNsjC18GpwflBO/v9J/dW7bksnVmjaCCAdYKY2e1XnD5P8hCrYe2QIIwa6+HB9IB/5aYMtE4NNj3sg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.1.0.tgz", + "integrity": "sha512-sKELkiKIrj/tPRAdhOPNI0UxhK2uiIUXnGs/3ztAif6QX7vyE3lY19sj5pIVJctRvl8LW2UlzpBFGlcCDkho9Q==", "requires": { - "@algolia/logger-common": "4.0.3" + "@algolia/logger-common": "4.1.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.0.3.tgz", - "integrity": "sha512-cj4BBbuX7fLA5EJLkesfENY1Q9pSMpJuzvtvyy18jhPavMY2qL4Y9NFbQo03ENnmD2qnDfdIK17cJLa+QaINwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.1.0.tgz", + "integrity": "sha512-bLMfIAkOLs1/vGA09yxU0N5+bE0fSSvEH2ySqVssfWLMP+KRAvby2Goxm8BgI9xLkOvLbhazfQ4Ov2448VvA1g==", "requires": { - "@algolia/requester-common": "4.0.3" + "@algolia/requester-common": "4.1.0" } }, "@algolia/requester-common": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.0.3.tgz", - "integrity": "sha512-6zfTEW17a/S/M/rBtvMO37pHJ3eqXQorCsoCKpcJXE1gV16Yt8pB9HqylnepC+xv9bMgCn72YkfWmhrGjW/hkA==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.1.0.tgz", + "integrity": "sha512-Cy0ciOv5uIm6wF+uLc9DHhxgPJtYQuy1f//hwJcW5mlPX/prPgxWwLXzWyyA+Ca7uU3q+0Y3cIFvEWM5pDxMEg==" }, "@algolia/requester-node-http": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.0.3.tgz", - "integrity": "sha512-TCddXMrfieNWDbQwxikOUZGJoYvN2MFCB+d8Yw3/RhwHasB4B5mWQ/8pvtgihlH13FILSVY1IB9ghC9SZBK6rw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.1.0.tgz", + "integrity": "sha512-tXp6Pjx9dFgM5ccW6YfEN6v2Zqq8uGwhS1pyq03/aRYRBK60LptjG5jo++vrOytrQDOnIjcZtQzBQch2GjCVmw==", "requires": { - "@algolia/requester-common": "4.0.3" + "@algolia/requester-common": "4.1.0" } }, "@algolia/transporter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.0.3.tgz", - "integrity": "sha512-ol6mXCL+DAGplpE5erN5Nrcq/aZLVxpQg6V5BK0fK0YDSiCCrucRpuwGW6SkxhlgdyGQbl/4s5hZJ+ucYpK+3w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.1.0.tgz", + "integrity": "sha512-Z7PjHazSC+KFLDuCFOjvRNgLfh7XOE4tXi0a9O3gBRup4Sk3VQCfTw4ygCF3rRx6uYbq192efLu0nL1E9azxLA==", "requires": { - "@algolia/cache-common": "4.0.3", - "@algolia/logger-common": "4.0.3", - "@algolia/requester-common": "4.0.3" + "@algolia/cache-common": "4.1.0", + "@algolia/logger-common": "4.1.0", + "@algolia/requester-common": "4.1.0" } }, "@apollo/space-kit": { @@ -2170,24 +2170,24 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" }, "algoliasearch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.0.3.tgz", - "integrity": "sha512-/4aFAPDoFGEDsx3c0ggKfRC1FeEdtM1HyWMwVe/wkHf/GH6CF67NFNIaBgkqt4i/SYAs92WL8B2Y8cDEMQGfGg==", - "requires": { - "@algolia/cache-browser-local-storage": "4.0.3", - "@algolia/cache-common": "4.0.3", - "@algolia/cache-in-memory": "4.0.3", - "@algolia/client-account": "4.0.3", - "@algolia/client-analytics": "4.0.3", - "@algolia/client-common": "4.0.3", - "@algolia/client-recommendation": "4.0.3", - "@algolia/client-search": "4.0.3", - "@algolia/logger-common": "4.0.3", - "@algolia/logger-console": "4.0.3", - "@algolia/requester-browser-xhr": "4.0.3", - "@algolia/requester-common": "4.0.3", - "@algolia/requester-node-http": "4.0.3", - "@algolia/transporter": "4.0.3" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.1.0.tgz", + "integrity": "sha512-0lzjvqQZkJYPuv7LyQauMIMCFFzJWfUf3m9KuHjmFubwbnTDa87KCMXKouMJ0kWXXt6nTLNt0+2YRREOWx2PHw==", + "requires": { + "@algolia/cache-browser-local-storage": "4.1.0", + "@algolia/cache-common": "4.1.0", + "@algolia/cache-in-memory": "4.1.0", + "@algolia/client-account": "4.1.0", + "@algolia/client-analytics": "4.1.0", + "@algolia/client-common": "4.1.0", + "@algolia/client-recommendation": "4.1.0", + "@algolia/client-search": "4.1.0", + "@algolia/logger-common": "4.1.0", + "@algolia/logger-console": "4.1.0", + "@algolia/requester-browser-xhr": "4.1.0", + "@algolia/requester-common": "4.1.0", + "@algolia/requester-node-http": "4.1.0", + "@algolia/transporter": "4.1.0" } }, "algoliasearch-helper": { diff --git a/docs/package.json b/docs/package.json index dab9a254..98cec6a4 100644 --- a/docs/package.json +++ b/docs/package.json @@ -6,7 +6,7 @@ "serve": "gatsby serve" }, "dependencies": { - "algoliasearch": "^4.0.3", + "algoliasearch": "^4.1.0", "gatsby": "2.19.28", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.1.33", From d40dcff5c8d2499cd780a16a25f4539cc788ce0d Mon Sep 17 00:00:00 2001 From: Howard Jones Date: Mon, 11 May 2020 10:00:07 +0100 Subject: [PATCH 004/251] Tweak to prereq docs If you have changed the default output from az cli to be text instead of JSON, the default policy retrieved from the keyvault is blank. Explicitly request the JSON version. --- docs/source/content/tutorials/prerequisites.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/content/tutorials/prerequisites.md b/docs/source/content/tutorials/prerequisites.md index 3542cd51..ea7a8bc2 100644 --- a/docs/source/content/tutorials/prerequisites.md +++ b/docs/source/content/tutorials/prerequisites.md @@ -38,7 +38,7 @@ az keyvault set-policy --n akv2k8s-test --spn --secret-permiss ### Add certificate - required for certificate-tutorials ```bash -az keyvault certificate create --vault-name akv2k8s-test --name my-certificate -p "$(az keyvault certificate get-default-policy)" +az keyvault certificate create --vault-name akv2k8s-test --name my-certificate -p "$(az keyvault certificate get-default-policy -o json)" ``` Authorize Access to Certificates: @@ -78,4 +78,4 @@ Apply configuration: kubectl apply -f namespace.yaml ``` -### That's it! You should now be ready to do all or any of the tutorials of akv2k8s! \ No newline at end of file +### That's it! You should now be ready to do all or any of the tutorials of akv2k8s! From 96560eabab4912b39897768ceb0964c2b6cb2367 Mon Sep 17 00:00:00 2001 From: el-memer <32717454+el-memer@users.noreply.github.com> Date: Fri, 21 Aug 2020 10:05:25 +0200 Subject: [PATCH 005/251] Update how-it-works.mdx Fix typo --- docs/source/content/how-it-works.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/content/how-it-works.mdx b/docs/source/content/how-it-works.mdx index 33f071b5..55399cd5 100644 --- a/docs/source/content/how-it-works.mdx +++ b/docs/source/content/how-it-works.mdx @@ -85,7 +85,7 @@ env: value: some-secret@azurekeyvault ``` -As mentioned, the the Pod container gets mutated to use a different executable. It does this by changing either the CMD or the ENTRYPOINT, depending on which was used by the original container, to use the `azure-keyvault-env` executable instead. The "old" command gets passed in as parameter to this new executable. +As mentioned, the Pod container gets mutated to use a different executable. It does this by changing either the CMD or the ENTRYPOINT, depending on which was used by the original container, to use the `azure-keyvault-env` executable instead. The "old" command gets passed in as parameter to this new executable. From 717ff2dc990767707d5e986b6e32d49174790de8 Mon Sep 17 00:00:00 2001 From: Jon Arild Torresdal Date: Sat, 22 Aug 2020 11:38:25 +0200 Subject: [PATCH 006/251] Fixed broken links --- docs/source/content/installation/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/content/installation/index.md b/docs/source/content/installation/index.md index 905bf687..96691abf 100644 --- a/docs/source/content/installation/index.md +++ b/docs/source/content/installation/index.md @@ -3,12 +3,12 @@ title: "Overview" description: "Different options for installing akv2k8s" --- -Make sure to check the [requirements](installation/requirements) before installing. +Make sure to check the [requirements](requirements) before installing. ## Installation options It's recommended to use Helm charts for installation. -[Installing with Helm charts](installation/installing-with-helm) +[Installing with Helm charts](installing-with-helm) -[Installing witouh Helm charts](installation/installing-without-helm) +[Installing witouh Helm charts](installing-without-helm) From 5c668610cac24401bd609a9829f9f94b5036472e Mon Sep 17 00:00:00 2001 From: Jon Arild Torresdal Date: Sat, 22 Aug 2020 11:39:35 +0200 Subject: [PATCH 007/251] Fixed broken link --- docs/source/content/reference/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/content/reference/index.md b/docs/source/content/reference/index.md index 79721183..e4991fb4 100644 --- a/docs/source/content/reference/index.md +++ b/docs/source/content/reference/index.md @@ -3,4 +3,4 @@ title: "Reference" description: "Reference of akv2k8s objects" --- -Find detailed reference for all akv2k8s objects, like the Kubernetes Custom Resource Definition (CRD) [`AzureKeyVaultSecret`](reference/azure-key-vault-secret). \ No newline at end of file +Find detailed reference for all akv2k8s objects, like the Kubernetes Custom Resource Definition (CRD) [`AzureKeyVaultSecret`](azure-key-vault-secret). From fc305a28268a1a3970c1b88642de1b9cc7bcf8d5 Mon Sep 17 00:00:00 2001 From: Jon Arild Torresdal Date: Sat, 22 Aug 2020 11:40:38 +0200 Subject: [PATCH 008/251] fixed broken link --- docs/source/content/tutorials/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/content/tutorials/index.md b/docs/source/content/tutorials/index.md index 71bd9dd9..aca4e5cf 100644 --- a/docs/source/content/tutorials/index.md +++ b/docs/source/content/tutorials/index.md @@ -5,4 +5,4 @@ description: "A quick introduction to the tutorials" These tutorials are designed to walk you through step-by-step how to extract objects from Azure Key Vault - to sync into Kubernetes `Secret`'s or directly injecting into your application. -Before getting started you need to make sure the tutorial [prerequisites](tutorials/prerequisites) are in place, and you are good to go! \ No newline at end of file +Before getting started you need to make sure the tutorial [prerequisites](prerequisites) are in place, and you are good to go! From 5dcb7099c25488ab8629f3be464d1ff4ad6b63d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 22 Aug 2020 13:41:43 +0200 Subject: [PATCH 009/251] Added build workflow for pull reqeusts --- .github/workflows/pull-request.yaml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/pull-request.yaml diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml new file mode 100644 index 00000000..96bb4529 --- /dev/null +++ b/.github/workflows/pull-request.yaml @@ -0,0 +1,28 @@ +name: pull request + +on: + pull_request: + paths: + - '.github/workflows/**' + - 'Makefile' + - 'go.mod' + - 'go.sum' + - 'cmd/**' + - 'pkg/**' + - '!docs/**' +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Setup Golang + uses: actions/setup-go@v1 + with: + go-version: '1.13.4' + + - name: Test + run: make test + + - name: Build docker images + run: make build \ No newline at end of file From 9376924748423eb728cc89fcfbae1ce987cd3e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 24 Aug 2020 18:56:54 +0200 Subject: [PATCH 010/251] Finalized using auth service and ca bundle controller to get secrets injected securely without revealing sensitive data --- Makefile | 19 +- .../controller/handler.go | 2 +- .../controller/secret_handler.go | 2 +- .../controller/secret_handler_test.go | 2 +- cmd/azure-keyvault-controller/main.go | 11 +- cmd/azure-keyvault-env/authentication.go | 156 +++++ cmd/azure-keyvault-env/main.go | 193 +----- cmd/azure-keyvault-env/secret_handler.go | 2 +- .../authorization.go | 1 + .../authorization_test.go | 87 ++- cmd/azure-keyvault-secrets-webhook/main.go | 67 +- cmd/azure-keyvault-secrets-webhook/pod.go | 13 +- .../registry.go | 24 +- .../token_test.go | 6 +- cmd/ca-bundle-controller/main.go | 175 +++++ .../content/installation/requirements.md | 2 +- .../source/content/security/authentication.md | 42 +- .../content/security/risk-assessments.md | 21 + drone.yaml | 10 - go.mod | 17 +- go.sum | 282 ++++++++ images/ca-bundle-controller/Dockerfile | 26 + installation/controller/deployment.yaml | 32 - installation/controller/rbac.yaml | 85 --- installation/crd.yaml | 79 --- int-tests/cluster-role-env-injector-auth.yaml | 26 + int-tests/ns.yaml | 6 + int-tests/test-secret/akvs.yaml | 11 + int-tests/test-secret/deployment.yaml | 35 + kind.yaml | 5 + .../controller/cabundleinjector/controller.go | 618 ++++++++++++++++++ .../cabundleinjector/controller_test.go | 323 +++++++++ pkg/akv2k8s/controller/clock.go | 38 ++ pkg/azure/credential.go | 414 ++++++++++++ pkg/azure/credential_helper.go | 283 ++++++++ .../credential_test.go} | 6 +- .../client/azure_keyvault_service.go | 5 +- .../keyvault}/client/certificate.go | 0 .../keyvault}/client/certificate_test.go | 0 pkg/azurekeyvault/client/authentication.go | 286 -------- .../azurekeyvault/v1/zz_generated.deepcopy.go | 2 +- .../v1alpha1/zz_generated.deepcopy.go | 2 +- .../client/clientset/versioned/clientset.go | 15 +- .../versioned/fake/clientset_generated.go | 12 +- .../azurekeyvault/v1/azurekeyvault_client.go | 3 +- .../v1alpha1/azurekeyvault_client.go | 3 +- 46 files changed, 2675 insertions(+), 774 deletions(-) create mode 100644 cmd/azure-keyvault-env/authentication.go create mode 100644 cmd/ca-bundle-controller/main.go create mode 100644 docs/source/content/security/risk-assessments.md delete mode 100644 drone.yaml create mode 100644 images/ca-bundle-controller/Dockerfile delete mode 100644 installation/controller/deployment.yaml delete mode 100644 installation/controller/rbac.yaml delete mode 100644 installation/crd.yaml create mode 100644 int-tests/cluster-role-env-injector-auth.yaml create mode 100644 int-tests/ns.yaml create mode 100644 int-tests/test-secret/akvs.yaml create mode 100644 int-tests/test-secret/deployment.yaml create mode 100644 kind.yaml create mode 100644 pkg/akv2k8s/controller/cabundleinjector/controller.go create mode 100644 pkg/akv2k8s/controller/cabundleinjector/controller_test.go create mode 100644 pkg/akv2k8s/controller/clock.go create mode 100644 pkg/azure/credential.go create mode 100644 pkg/azure/credential_helper.go rename pkg/{azurekeyvault/client/authentication_test.go => azure/credential_test.go} (94%) rename pkg/{azurekeyvault => azure/keyvault}/client/azure_keyvault_service.go (96%) rename pkg/{azurekeyvault => azure/keyvault}/client/certificate.go (100%) rename pkg/{azurekeyvault => azure/keyvault}/client/certificate_test.go (100%) delete mode 100644 pkg/azurekeyvault/client/authentication.go diff --git a/Makefile b/Makefile index 99b5ceb0..7c1923dd 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,13 @@ PACKAGE=github.com/SparebankenVest/azure-key-vault-to-kubernetes +KUBERNETES_VERSION=v1.17.9 +KUBERNETES_DEP_VERSION=v0.17.9 + DOCKER_INTERNAL_REG=dokken.azurecr.io DOCKER_RELEASE_REG=spvest DOCKER_CONTROLLER_IMAGE=azure-keyvault-controller +DOCKER_CA_BUNDLE_CONTROLLER_IMAGE=ca-bundle-controller DOCKER_WEBHOOK_IMAGE=azure-keyvault-webhook DOCKER_AUTH_SERVICE_IMAGE=azure-keyvault-auth-service DOCKER_VAULTENV_IMAGE=azure-keyvault-env @@ -28,11 +32,14 @@ fmt: fmtcheck: $(CURDIR)/scripts/gofmtcheck.sh -build: build-controller build-webhook build-vaultenv +build: build-controller build-ca-bundle-controller build-webhook build-vaultenv build-controller: docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/controller/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) +build-ca-bundle-controller: + docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/ca-bundle-controller/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/ca-bundle-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) + build-webhook: docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/env-injector/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-secrets-webhook" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) @@ -48,6 +55,16 @@ build-akv2k8s-env-test: test: fmtcheck CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/) +build-local: fmtcheck + CGO_ENABLED=0 go build -v $(shell go list ./...) + +codegen: + @echo "Making sure code-generator has correct version of Kubernetes ($(KUBERNETES_DEP_VERSION))" + @echo "" + rm -rf ${GOPATH}/src/k8s.io/code-generator + git clone --depth 1 --branch $(KUBERNETES_DEP_VERSION) git@github.com:kubernetes/code-generator.git ${GOPATH}/src/k8s.io/code-generator + ./hack/update-codegen.sh + push: push-controller push-webhook push-vaultenv push-controller: diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index ed31c0a7..1eaf81b9 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -40,7 +40,7 @@ import ( "k8s.io/client-go/tools/record" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v1" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 6d53759c..0071b323 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -22,7 +22,7 @@ import ( "strings" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go index dcbdd616..97242f58 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go @@ -21,7 +21,7 @@ import ( "testing" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index d83348d0..7b9ede32 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -36,7 +36,8 @@ import ( "k8s.io/client-go/tools/record" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/cmd/azure-keyvault-controller/controller" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals" @@ -117,13 +118,15 @@ func main() { eventBroadcaster.StartLogging(log.Tracef) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) - var vaultAuth vault.AzureKeyVaultCredentials + var vaultAuth azure.Credentials if customAuth { - if vaultAuth, err = vault.NewAzureKeyVaultCredentialsFromEnvironment(); err != nil { + if vaultAuth, err = azure.NewFromEnvironment(); err != nil { log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) } } else { - if vaultAuth, err = vault.NewAzureKeyVaultCredentialsFromCloudConfig(cloudconfig); err != nil { + cloudCnfProvider := azure.NewFromCloudConfig(&cloudconfig) + + if vaultAuth, err = cloudCnfProvider.GetCredentials(); err != nil { log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) } } diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go new file mode 100644 index 00000000..402140c1 --- /dev/null +++ b/cmd/azure-keyvault-env/authentication.go @@ -0,0 +1,156 @@ +// Copyright © 2020 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on bank-vaults from Banzai Cloud +// (https://github.com/banzaicloud/bank-vaults) + +package main + +import ( + "crypto" + "crypto/rsa" + "crypto/sha256" + "crypto/tls" + "crypto/x509" + "encoding/base64" + "encoding/json" + "encoding/pem" + "fmt" + "net/http" + "time" + + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" +) + +func createHTTPClientWithTrustedCA(caCert []byte) (*http.Client, error) { + // caURL := fmt.Sprintf("http://%s/ca", host) + // client := &http.Client{ + // Timeout: time.Second * 10, + // } + + // res, err := client.Get(caURL) + // if err != nil { + // return nil, err + // } + + // defer res.Body.Close() + // caCert, err := ioutil.ReadAll(res.Body) + // if err != nil { + // return nil, err + // } + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(caCert) + + tlsConf := &tls.Config{ + RootCAs: caCertPool, + } + tlsConf.BuildNameToCertificate() + + tlsClient := &http.Client{ + Timeout: time.Second * 10, + Transport: &http.Transport{ + TLSClientConfig: tlsConf, + }, + } + return tlsClient, nil +} + +func getCredentials(useAuthService bool, authServiceAddress, caCert string) (azure.Credentials, error) { + if useAuthService { + client, err := createHTTPClientWithTrustedCA([]byte(caCert)) + if err != nil { + logger.Fatalf("failed to download ca cert, error: %+v", err) + } + + url := fmt.Sprintf("https://%s/auth/%s/%s", authServiceAddress, config.namespace, config.podName) + logger.Infof("requesting azure key vault oauth token from %s", url) + + res, err := client.Get(url) + if err != nil { + logger.Fatalf("request token failed from %s, error: %+v", url, err) + } + defer res.Body.Close() + + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to get credentials, %s", res.Status) + } + + var creds azure.OAuthCredentials + err = json.NewDecoder(res.Body).Decode(&creds) + + if err != nil { + return nil, fmt.Errorf("failed to decode body, error %+v", err) + } + + return creds, nil + } + + creds, err := azure.NewFromEnvironment() + if err != nil { + return nil, fmt.Errorf("failed to get credentials for azure key vault, error %+v", err) + } + return creds, nil +} + +func verifyPKCS(signature string, plaintext string, pubkey rsa.PublicKey) bool { + sig, _ := base64.StdEncoding.DecodeString(signature) + hashed := sha256.Sum256([]byte(plaintext)) + err := rsa.VerifyPKCS1v15(&pubkey, crypto.SHA256, hashed[:], sig) + return err == nil +} + +func parseRsaPublicKey(pubPem string) (*rsa.PublicKey, error) { + block, _ := pem.Decode([]byte(pubPem)) + if block == nil { + return nil, fmt.Errorf("failed to parse PEM block containing public signing key") + } + + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return nil, err + } + + switch pub := pub.(type) { + case *rsa.PublicKey: + return pub, nil + default: + break // fall through + } + return nil, fmt.Errorf("Key type is not RSA") +} + +func validateArgsSignature(origArgs, signatureB64, pubKeyBase64 string) { + signatureArray, err := base64.StdEncoding.DecodeString(signatureB64) + if err != nil { + logger.Fatalf("failed to decode base64 signature string, error: %+v", err) + } + + signature := string(signatureArray) + + bPubKey, err := base64.StdEncoding.DecodeString(pubKeyBase64) + if err != nil { + logger.Fatalf("failed to decode base64 public key string, error: %+v", err) + } + + pubKey := string(bPubKey) + + pubRsaKey, err := parseRsaPublicKey(pubKey) + if err != nil { + logger.Fatalf("failed to parse rsa public key to verify args: %+v", err) + } + + if !verifyPKCS(signature, origArgs, *pubRsaKey) { + logger.Fatal("args does not match original args defined by env-injector") + } +} diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 2332baab..38e8e699 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -1,4 +1,4 @@ -// Copyright © 2019 Sparebanken Vest +// Copyright © 2020 Sparebanken Vest // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,17 +18,7 @@ package main import ( - "crypto" - "crypto/rsa" - "crypto/sha256" - "crypto/tls" - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" "fmt" - "io/ioutil" - "net/http" "os" "os/exec" "strings" @@ -36,7 +26,7 @@ import ( "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" log "github.com/sirupsen/logrus" @@ -56,6 +46,10 @@ type injectorConfig struct { waitTimeBetweenRetries int useAuthService bool skipArgsValidation bool + authServiceAddress string + caCert string + signatureB64 string + pubKeyBase64 string } var config injectorConfig @@ -117,152 +111,6 @@ func getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret, query s return secretHandler.Handle() } -type oauthToken struct { - Token string `json:"token"` -} - -func createHTTPClientWithTrustedCA(host string) (*http.Client, error) { - caURL := fmt.Sprintf("http://%s/ca", host) - client := &http.Client{ - Timeout: time.Second * 10, - } - - res, err := client.Get(caURL) - if err != nil { - return nil, err - } - - defer res.Body.Close() - caCert, err := ioutil.ReadAll(res.Body) - if err != nil { - return nil, err - } - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM(caCert) - - tlsConf := &tls.Config{ - RootCAs: caCertPool, - } - tlsConf.BuildNameToCertificate() - - tlsClient := &http.Client{ - Timeout: time.Second * 10, - Transport: &http.Transport{ - TLSClientConfig: tlsConf, - }, - } - return tlsClient, nil -} - -func getCredentials(useAuthService bool) (vault.AzureKeyVaultCredentials, error) { - if useAuthService { - authServiceAddress := viper.GetString("env_injector_auth_service") - if authServiceAddress == "" { - logger.Fatal(fmt.Errorf("cannot call auth service: env var ENV_INJECTOR_AUTH_SERVICE does not exist")) - } - - caCertAddress := viper.GetString("env_injector_ca_cert") - if caCertAddress == "" { - logger.Fatal(fmt.Errorf("cannot get ca cert: env var ENV_INJECTOR_CA_CERT does not exist")) - } - - client, err := createHTTPClientWithTrustedCA(caCertAddress) - if err != nil { - logger.Fatalf("failed to download ca cert, error: %+v", err) - } - - url := fmt.Sprintf("https://%s/auth/%s/%s", authServiceAddress, config.namespace, config.podName) - logger.Infof("requesting azure key vault oauth token from %s", url) - - res, err := client.Get(url) - if err != nil { - logger.Fatalf("request token failed from %s, error: %+v", url, err) - } - defer res.Body.Close() - - if res.StatusCode != http.StatusOK { - return nil, fmt.Errorf("failed to get credentials, %s", res.Status) - } - - var creds vault.AzureKeyVaultOAuthCredentials - err = json.NewDecoder(res.Body).Decode(&creds) - - if err != nil { - return nil, fmt.Errorf("failed to decode body, error %+v", err) - } - - return creds, nil - } - - creds, err := vault.NewAzureKeyVaultCredentialsFromEnvironment() - if err != nil { - return nil, fmt.Errorf("failed to get credentials for azure key vault, error %+v", err) - } - return creds, nil -} - -func verifyPKCS(signature string, plaintext string, pubkey rsa.PublicKey) bool { - sig, _ := base64.StdEncoding.DecodeString(signature) - hashed := sha256.Sum256([]byte(plaintext)) - err := rsa.VerifyPKCS1v15(&pubkey, crypto.SHA256, hashed[:], sig) - return err == nil -} - -func parseRsaPublicKey(pubPem string) (*rsa.PublicKey, error) { - block, _ := pem.Decode([]byte(pubPem)) - if block == nil { - return nil, fmt.Errorf("failed to parse PEM block containing public signing key") - } - - pub, err := x509.ParsePKIXPublicKey(block.Bytes) - if err != nil { - return nil, err - } - - switch pub := pub.(type) { - case *rsa.PublicKey: - return pub, nil - default: - break // fall through - } - return nil, fmt.Errorf("Key type is not RSA") -} - -func validateArgsSignature(origArgs string) { - signatureB64 := viper.GetString("env_injector_args_signature") - if signatureB64 == "" { - logger.Fatalf("failed to get ENV_INJECTOR_ARGS_SIGNATURE") - } - - signatureArray, err := base64.StdEncoding.DecodeString(signatureB64) - if err != nil { - logger.Fatalf("failed to decode base64 signature string, error: %+v", err) - } - - signature := string(signatureArray) - - pubKeyBase64 := viper.GetString("env_injector_args_key") - if pubKeyBase64 == "" { - logger.Fatalf("failed to get ENV_INJECTOR_ARGS_KEY, error: %+v", err) - } - - bPubKey, err := base64.StdEncoding.DecodeString(pubKeyBase64) - if err != nil { - logger.Fatalf("failed to decode base64 public key string, error: %+v", err) - } - - pubKey := string(bPubKey) - - pubRsaKey, err := parseRsaPublicKey(pubKey) - if err != nil { - logger.Fatalf("failed to parse rsa public key to verify args: %+v", err) - } - - if !verifyPKCS(signature, origArgs, *pubRsaKey) { - logger.Fatal("args does not match original args defined by env-injector") - } -} - func initConfig() { viper.SetDefault("env_injector_retries", 3) viper.SetDefault("env_injector_wait_before_retry", 3) @@ -284,6 +132,15 @@ func setLogLevel(logLevel string) { log.SetLevel(logrusLevel) } +func validateConfig(requiredEnvVars map[string]string) error { + for key, value := range requiredEnvVars { + if value == "" { + return fmt.Errorf("environment variable %s not provided or empty", strings.ToUpper(key)) + } + } + return nil +} + func main() { initConfig() @@ -304,10 +161,22 @@ func main() { waitTimeBetweenRetries: viper.GetInt("env_injector_wait_before_retry"), useAuthService: viper.GetBool("env_injector_use_auth_service"), skipArgsValidation: viper.GetBool("env_injector_skip_args_validation"), + authServiceAddress: viper.GetString("env_injector_auth_service"), + caCert: viper.GetString("env_injector_ca_cert"), + signatureB64: viper.GetString("env_injector_args_signature"), + pubKeyBase64: viper.GetString("env_injector_args_key"), + } + + requiredEnvVars := map[string]string{ + "env_injector_auth_service": config.authServiceAddress, + "env_injector_ca_cert": config.caCert, + "env_injector_args_signature": config.signatureB64, + "env_injector_args_key": config.pubKeyBase64, } - if config.namespace == "" { - logger.Fatalf("current namespace not provided in environment variable ENV_INJECTOR_POD_NAMESPACE") + err = validateConfig(requiredEnvVars) + if err != nil { + logger.Fatalf("failed validating config, error: %+v", err) } logger = logger.WithFields(log.Fields{ @@ -331,13 +200,13 @@ func main() { origArgs = os.Args[1:] if !config.skipArgsValidation { - validateArgsSignature(strings.Join(origArgs, " ")) + validateArgsSignature(strings.Join(origArgs, " "), config.signatureB64, config.pubKeyBase64) } logger.Infof("found original container command to be %s %s", origCommand, origArgs) } - creds, err := getCredentials(config.useAuthService) + creds, err := getCredentials(config.useAuthService, config.authServiceAddress, config.caCert) if err != nil { log.Fatalf("failed to get credentials, error: %+v", err) } diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go index 4879200f..e14b09cc 100644 --- a/cmd/azure-keyvault-env/secret_handler.go +++ b/cmd/azure-keyvault-env/secret_handler.go @@ -22,7 +22,7 @@ import ( "strings" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" yaml "gopkg.in/yaml.v2" diff --git a/cmd/azure-keyvault-secrets-webhook/authorization.go b/cmd/azure-keyvault-secrets-webhook/authorization.go index d45ae716..10b3ebd4 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization.go @@ -12,6 +12,7 @@ type podData struct { remoteAddress string name string namespace string + token string } func authorize(clientset *kubernetes.Clientset, podData podData) error { diff --git a/cmd/azure-keyvault-secrets-webhook/authorization_test.go b/cmd/azure-keyvault-secrets-webhook/authorization_test.go index 793ffc54..2e75b8b1 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization_test.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization_test.go @@ -4,6 +4,8 @@ import ( "os" "testing" + authenticationapi "k8s.io/api/authentication/v1" + authorizatonapi "k8s.io/api/authorization/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) @@ -24,32 +26,89 @@ func ensureIntegrationEnvironment(t *testing.T) kubeConfig { } } -func TestAuthorization(t *testing.T) { +func TestTokenReview(t *testing.T) { config := ensureIntegrationEnvironment(t) - podName := os.Getenv("AKV2K8S_K8S_TEST_POD") - podNamespace := os.Getenv("AKV2K8S_K8S_TEST_NAMESPACE") - podIP := os.Getenv("AKV2K8S_K8S_TEST_POD_IP") - - cfg, err := clientcmd.BuildConfigFromFlags(config.master, config.config) + cfg, err := clientcmd.BuildConfigFromFlags("https://127.0.0.1:32770", config.config) if err != nil { t.Errorf("Error building kubeconfig: %s", err.Error()) } - kubeClient, err := kubernetes.NewForConfig(cfg) + clientset, err := kubernetes.NewForConfig(cfg) if err != nil { - t.Errorf("Error building kubernetes clientset: %s", err.Error()) + t.Error(err) } - pod := podData{ - name: podName, - namespace: podNamespace, - remoteAddress: podIP, + tr := &authenticationapi.TokenReview{ + Spec: authenticationapi.TokenReviewSpec{ + Token: "eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJha3YyazhzLXRlc3QiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi1rcWY3NyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMjViYTczYWMtNzA3YS0xMWVhLTg2YzEtMDI0MmFjMTEwMDAyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmFrdjJrOHMtdGVzdDpkZWZhdWx0In0.gQu3MuqG3lqtuuQnjY70PHjKfdIfxnc2K2wTTgINoHi7LyG5bTr6iKc15e3wpQy1Tt-AeCz4SyfXxIJVXvXKSNKaE47Lj2nzfcaQa7PR_A3i6wxRBke0klQl8pm5ZYNTP54cKcyBD7MNlLCcqmg5Jqpzpsj5mVHIVDAQza5--7ujietpEhTo6goUZluu4psVm-24BViVUnYWPdRBEEbCj7UdxImcIB7luFqXWwiBGYHcaY0CgfxSPYdy1CnRitbuPBIQU9Gpsg9HtHNXNdNJO9LH17uonIMvg6TyMhCiKTMJIw9lNkUbcu-cf5EFpIo3Xev8lbG_VybHUQoqjeRaMQ", + // Audiences: []string{ + // "", + // "", + // }, + }, } - err = authorize(kubeClient, pod) + trResult, err := clientset.AuthenticationV1().TokenReviews().Create(tr) if err != nil { - t.Errorf("failed, error: %+v", err) + t.Error(err) + } + + if trResult == nil { + t.Fail() + } + + sar := &authorizatonapi.SubjectAccessReview{ + Spec: authorizatonapi.SubjectAccessReviewSpec{ + User: trResult.Status.User.Username, + ResourceAttributes: &authorizatonapi.ResourceAttributes{ + Resource: "AzureKeyVaultSecret", + Group: "spv.no", + Namespace: "akv2k8s-test", + Verb: "get", + Name: "test-secret", + }, + }, + } + sarResult, err := clientset.AuthorizationV1().SubjectAccessReviews().Create(sar) + if err != nil { + t.Error(err) + } + + if sarResult == nil { + t.Fail() } + t.Logf("ns: %s", trResult.Namespace) + } + +// func TestAuthorization(t *testing.T) { +// config := ensureIntegrationEnvironment(t) + +// podName := os.Getenv("AKV2K8S_K8S_TEST_POD") +// podNamespace := os.Getenv("AKV2K8S_K8S_TEST_NAMESPACE") +// podIP := os.Getenv("AKV2K8S_K8S_TEST_POD_IP") + +// cfg, err := clientcmd.BuildConfigFromFlags(config.master, config.config) +// if err != nil { +// t.Errorf("Error building kubeconfig: %s", err.Error()) +// } + +// kubeClient, err := kubernetes.NewForConfig(cfg) +// if err != nil { +// t.Errorf("Error building kubernetes clientset: %s", err.Error()) +// } + +// pod := podData{ +// name: podName, +// namespace: podNamespace, +// remoteAddress: podIP, +// } + +// err = authorize(kubeClient, pod) +// if err != nil { +// t.Errorf("failed, error: %+v", err) +// } + +// } diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index cc11e7a8..dec10846 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -21,11 +21,10 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "net/http" "os" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" "github.com/gorilla/mux" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -54,7 +53,6 @@ const ( type azureKeyVaultConfig struct { port string - caPort string customAuth bool namespace string aadPodBindingLabel string @@ -67,10 +65,11 @@ type azureKeyVaultConfig struct { caFile string useAuthService bool // nameLocallyOverrideAuthService string - authServiceName string - authServicePort string - kubeClient *kubernetes.Clientset - credentials vault.AzureKeyVaultCredentials + authServiceName string + authServicePort string + caBundleConfigMapName string + kubeClient *kubernetes.Clientset + credentials azure.Credentials } var config azureKeyVaultConfig @@ -206,29 +205,6 @@ func healthHandler(w http.ResponseWriter, r *http.Request) { } } -func handleCACert(w http.ResponseWriter, r *http.Request) { - if r.Method == "GET" { - caCert, err := ioutil.ReadFile(config.caFile) - if err != nil { - log.Fatal(err) - } - w.Write(caCert) - } else { - http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) - } -} - -func serveCA() { - log.Infof("CA cert at http://%s:", config.metricsPort) - - caMux := http.NewServeMux() - caMux.HandleFunc("/ca", handleCACert) - err := http.ListenAndServe(fmt.Sprintf(":%s", config.caPort), caMux) - if err != nil { - log.Fatalf("error serving ca cert: %s", err) - } -} - func main() { fmt.Fprintln(os.Stdout, "initializing config...") initConfig() @@ -238,18 +214,19 @@ func main() { setLogLevel(logLevel) config = azureKeyVaultConfig{ - port: viper.GetString("port"), - customAuth: viper.GetBool("custom_auth"), - dockerPullTimeout: viper.GetInt("custom_docker_pull_timeout"), - serveMetrics: viper.GetBool("metrics_enabled"), - metricsPort: viper.GetString("metrics_port"), - certFile: viper.GetString("tls_cert_file"), - keyFile: viper.GetString("tls_private_key_file"), - caFile: viper.GetString("tls_ca_file"), - useAuthService: viper.GetBool("use_auth_service"), - authServiceName: viper.GetString("webhook_auth_service"), - authServicePort: viper.GetString("webhook_auth_service_port"), - cloudConfigHostPath: viper.GetString("cloud_config_host_path"), + port: viper.GetString("port"), + customAuth: viper.GetBool("custom_auth"), + dockerPullTimeout: viper.GetInt("custom_docker_pull_timeout"), + serveMetrics: viper.GetBool("metrics_enabled"), + metricsPort: viper.GetString("metrics_port"), + certFile: viper.GetString("tls_cert_file"), + keyFile: viper.GetString("tls_private_key_file"), + caFile: viper.GetString("tls_ca_file"), + useAuthService: viper.GetBool("use_auth_service"), + authServiceName: viper.GetString("webhook_auth_service"), + authServicePort: viper.GetString("webhook_auth_service_port"), + caBundleConfigMapName: viper.GetString("ca_config_map_name"), + cloudConfigHostPath: viper.GetString("cloud_config_host_path"), } mutator := mutating.MutatorFunc(vaultSecretsMutator) @@ -260,12 +237,13 @@ func main() { var err error if config.customAuth { - config.credentials, err = vault.NewAzureKeyVaultCredentialsFromEnvironment() + config.credentials, err = azure.NewFromEnvironment() if err != nil { log.Fatal(err) } } else { - config.credentials, err = vault.NewAzureKeyVaultCredentialsFromCloudConfig(config.cloudConfigHostPath) + cloudCnfProvider := azure.NewFromCloudConfig(&config.cloudConfigHostPath) + config.credentials, err = cloudCnfProvider.GetCredentials() if err != nil { log.Fatal(err) } @@ -287,7 +265,6 @@ func main() { if config.serveMetrics { httpMux.Handle("/metrics", promhttp.Handler()) } - httpMux.HandleFunc("/ca", handleCACert) httpMux.HandleFunc("/healthz", healthHandler) go func() { diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index c0c1c7b7..fae2d0b1 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -122,7 +122,7 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock } else { log.Infof("did not find credentials to use with registry '%s' - getting default credentials", registryName) // todo: acr is azure specific - regCred, ok = getAcrCredentials(registryName) + regCred, ok = getAcrCredentials(registryName, container.Image) } if !ok { @@ -202,8 +202,15 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, namespace(), config.authServicePort), }, { - Name: "ENV_INJECTOR_CA_CERT", - Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, namespace(), config.caPort), + Name: "ENV_INJECTOR_CA_CERT", + ValueFrom: &corev1.EnvVarSource{ + ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: config.caBundleConfigMapName, + }, + Key: "akv2k8s-ca", + }, + }, }, }...) } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 35aa348d..630279b3 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -25,6 +25,8 @@ import ( "strings" "time" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + "github.com/containers/image/v5/transports/alltransports" "github.com/containers/image/v5/types" v1 "github.com/opencontainers/image-spec/specs-go/v1" @@ -32,7 +34,6 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/credentialprovider/azure" ) func getContainerCmd(container corev1.Container, creds types.DockerAuthConfig) ([]string, error) { @@ -172,23 +173,22 @@ func getRegistryCreds(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) ( return creds, nil } -func getAcrCredentials(host string) (types.DockerAuthConfig, bool) { +func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) { isAcr, wildcardHost := hostIsAzureContainerRegistry(host) if !isAcr { return types.DockerAuthConfig{}, false } - conf := azure.NewACRProvider(&config.cloudConfigHostPath) - if conf.Enabled() { - dockerConfList := conf.Provide() - if len(dockerConfList) > 0 { - dockerConf := dockerConfList[wildcardHost] - return types.DockerAuthConfig{ - Username: dockerConf.Username, - Password: dockerConf.Password, - }, true - } + cloudCnfProvider := azure.NewFromCloudConfig(&config.cloudConfigHostPath) + dockerConfList, err := cloudCnfProvider.GetAcrCredentials(image) + if err != nil { + return types.DockerAuthConfig{}, false + } + + if len(dockerConfList) > 0 { + dockerConf := dockerConfList[wildcardHost] + return dockerConf, true } return types.DockerAuthConfig{}, false diff --git a/cmd/azure-keyvault-secrets-webhook/token_test.go b/cmd/azure-keyvault-secrets-webhook/token_test.go index 5c45fe15..2241c7a1 100644 --- a/cmd/azure-keyvault-secrets-webhook/token_test.go +++ b/cmd/azure-keyvault-secrets-webhook/token_test.go @@ -5,7 +5,7 @@ import ( "os" "testing" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" ) func TestMarshallToken(t *testing.T) { @@ -17,7 +17,7 @@ func TestMarshallToken(t *testing.T) { os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET")) os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID")) - creds, err := vault.NewAzureKeyVaultCredentialsFromEnvironment() + creds, err := azure.NewFromEnvironment() if err != nil { t.Error(err) } @@ -27,7 +27,7 @@ func TestMarshallToken(t *testing.T) { t.Error(err) } - var creds2 vault.AzureKeyVaultOAuthCredentials + var creds2 azure.OAuthCredentials err = json.Unmarshal(data, &creds2) if err != nil { t.Error(err) diff --git a/cmd/ca-bundle-controller/main.go b/cmd/ca-bundle-controller/main.go new file mode 100644 index 00000000..a49a359e --- /dev/null +++ b/cmd/ca-bundle-controller/main.go @@ -0,0 +1,175 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "flag" + "os" + "strconv" + "time" + + log "github.com/sirupsen/logrus" + + kubeinformers "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes" + typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/tools/record" + + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/controller/cabundleinjector" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals" +) + +var ( + masterURL string + kubeconfig string + cloudconfig string + logLevel string + + azureVaultFastRate time.Duration + azureVaultSlowRate time.Duration + azureVaultMaxFastAttempts int + customAuth bool +) + +const controllerAgentName = "ca-bundle-controller" + +func main() { + flag.Parse() + + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) + + // set up signals so we handle the first shutdown signal gracefully + stopCh := signals.SetupSignalHandler() + setLogLevel() + + akvLabelName, err := getEnvStr("AKV_LABEL_NAME", "azure-key-vault-env-injection") + if err != nil { + log.Fatalf("Error parsing env var AKV_LABEL_NAME: %s", err.Error()) + } + + akvNamespace, err := getEnvStr("AKV_NAMESPACE", "") + if err != nil { + log.Fatalf("Error parsing env var AKV_NAMESPACE: %s", err.Error()) + } + if akvNamespace == "" { + log.Fatal("Env var AKV_NAMESPACE is required") + } + + akvSecretName, err := getEnvStr("AKV_SECRET_NAME", "") + if err != nil { + log.Fatalf("Error parsing env var AKV_SECRET_NAME: %s", err.Error()) + } + if akvSecretName == "" { + log.Fatal("Env var AKV_SECRET_NAME is required") + } + + caConfigMapName, err := getEnvStr("CA_CONFIG_MAP_NAME", "akv2k8s-ca") + if err != nil { + log.Fatalf("Error parsing env var AZURE_VAULT_NORMAL_POLL_INTERVALS: %s", err.Error()) + } + + cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) + if err != nil { + log.Fatalf("Error building kubeconfig: %s", err.Error()) + } + + kubeClient, err := kubernetes.NewForConfig(cfg) + if err != nil { + log.Fatalf("Error building kubernetes clientset: %s", err.Error()) + } + + kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30) + + log.Info("Creating event broadcaster") + eventBroadcaster := record.NewBroadcaster() + eventBroadcaster.StartLogging(log.Tracef) + eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) + + // recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) + + controller := cabundleinjector.NewController(kubeClient, kubeInformerFactory.Core().V1().Secrets(), kubeInformerFactory.Core().V1().Namespaces(), kubeInformerFactory.Core().V1().ConfigMaps(), akvLabelName, akvNamespace, akvSecretName, caConfigMapName) + + // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) + // Start method is non-blocking and runs all registered informers in a dedicated goroutine. + kubeInformerFactory.Start(stopCh) + + if err = controller.Run(2, stopCh); err != nil { + log.Fatalf("Error running controller: %s", err.Error()) + } +} + +func init() { + flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") + flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") + flag.StringVar(&logLevel, "log-level", "", "log level") + flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") +} + +func setLogLevel() { + if logLevel == "" { + var ok bool + if logLevel, ok = os.LookupEnv("LOG_LEVEL"); !ok { + logLevel = log.InfoLevel.String() + } + } + + logrusLevel, err := log.ParseLevel(logLevel) + if err != nil { + log.Fatalf("Error setting log level: %s", err.Error()) + } + log.SetLevel(logrusLevel) + log.Printf("Log level set to '%s'", logrusLevel.String()) +} + +func getEnvDuration(key string, fallback time.Duration) (time.Duration, error) { + if value, ok := os.LookupEnv(key); ok { + duration, err := time.ParseDuration(value) + return duration, err + } + return fallback, nil +} + +func getEnvInt(key string, fallback int) (int, error) { + if value, ok := os.LookupEnv(key); ok { + intVal, err := strconv.Atoi(value) + return intVal, err + } + return fallback, nil +} + +func getEnvStr(key string, fallback string) (string, error) { + if value, ok := os.LookupEnv(key); ok { + return value, nil + } + return fallback, nil +} + +func getEnvBool(key string, fallback bool) (bool, error) { + if value, ok := os.LookupEnv(key); ok { + if booVal, err := strconv.ParseBool(value); ok { + return booVal, err + } + } + return fallback, nil +} diff --git a/docs/source/content/installation/requirements.md b/docs/source/content/installation/requirements.md index e35f274b..de2f5f52 100644 --- a/docs/source/content/installation/requirements.md +++ b/docs/source/content/installation/requirements.md @@ -3,7 +3,7 @@ title: "Requirements" description: "Requirements for installing akv2k8s" --- -* Kubernetes version >= 1.13 +* Kubernetes version >= 1.17.9 * A dedicated kubernetes namespace * Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook * RBAC enabled diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md index 3b5ee7c4..e3d8a5ea 100644 --- a/docs/source/content/security/authentication.md +++ b/docs/source/content/security/authentication.md @@ -29,9 +29,34 @@ The Controller will need Azure Key Vault credentials to get Secrets from Azure K Fore more details, see the [Controller Helm Chart](/stable/azure-key-vault-controller/README/#installing-the-chart). -## Custom Authentication for Env Injector +## Custom Authentication for the Env Injector -To use custom authentication for the Env Injector there are two options: +The Env-Injector operates locally compared to the Controller, which operates centrally. The Env-Injector running inside a Pod's container needs access to Azure Key Vault credentials to inject secrets. Two options are available to make credentials available during environment injection: + +1) The Env-Injector running inside the container request credentials from the Env-Injector authentication service +2) The Pod hosting the container provide credentials to the Env-Injector running inside the container + +For option 1 you only provide credentials once, during the installation of the Env-Injector. + +For option 2 you have to provide Azure Key Vault credentials to every Pod using Env-Injector. + +Option 1 is easiest and most convinient, but also give ALL pods + +**Recommendations:** + +| | Env-Injector Auth Service | Pass credentials to every Pod | +| ---------------------------------------------------- | :-----------------------: | :---------------------------: | +| Using one Azure Key Vault per cluster | ✔ | | +| Using multiple Azure Key Vaults per cluster (f.ex. one Key Vault per application) and it is OK to use the same credentials to all Key Vaults | ✔ | | +| Multi-tenant environment (multiple Azure Key Vaults) | | ✔ | + +| Provide credentials only during Env-Injector install | ✔ +| Must provide credentials to every Pod using Env-Injector | | ✔| +| Azure Key Vault credentials available to all Pods using Env-Injector | ✔ || +| Recommended if there is one Azure Key Vault per cluster | ✔ | | +In practice this means the code that downloads the secrets for Azure Key Vault runs inside the application Container and are executed before the original executable of that container. After the container has started, a Kubernetes user with the right credentials are able to exec into the container. Several steps have been taken to avoid exposing sensitive data in this scenario and are explained below. Another scenario is data stored in Kubernetes Secrets + +To use custom authentication for the Env Injector there are three options: 1. Use Microsft's [AAD Pod Identity](https://github.com/Azure/aad-pod-identity) (see [Using Custom Authentication with AAD Pod Identity](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-aad-pod-identity)) 2. Use custom credentials through credential injection (see [Using Custom Authentication with Credential Injection Enabled](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-credential-injection-enabled)) @@ -41,6 +66,19 @@ To avoid using option no. 3, support for a more convenient solution (no. 2) is s Fore more details, see the [Env Injector Helm Chart](/stable/azure-key-vault-env-injector/README/#installing-the-chart). +### Centralized vs Local credentials + +|Auth method | Centralized | Local | +|------------|-------------|-------| +|[AAD Pod Identity](https://github.com/Azure/aad-pod-identity) | (✔)|✔ | +|Client credentials |✔ |✔| +|Certificate | ✔ | ✔ | +|Username/password | ✔ | ✔ | + +With centralized credentials, the credentials are stored in the same Kuberntes namespace as the Env-Injector and the Env-Injector can provide ... + +Local credentials is when the credentials are passed directly to the Pod + ## Custom Authentication Options The following authentication options are available: diff --git a/docs/source/content/security/risk-assessments.md b/docs/source/content/security/risk-assessments.md new file mode 100644 index 00000000..0f65cb36 --- /dev/null +++ b/docs/source/content/security/risk-assessments.md @@ -0,0 +1,21 @@ +--- +title: "Risk Assessments" +description: "Learn about the risk assessments the akv2k8s project has done" +--- + +To help assess if the akv2k8s project is within the ... here is a list of some of the perticulars and the risk assessments we did around those topics. + +When developing the akv2k8s project there are many + +## How to handle credentials + +Credentials to Azure Key Vault is needed by both the controller that syncs AKV secrets into Kubernetes secrets, and the env-injector that inject AKV secrets into container applications. + + +### The Controller + +The controller is the easiest to evaluate, as it's not directly exposed together with the applications using them. It's a centrally installed component that can be secured using RBAC mechanisms in Kubernetes and prevent everyone except admins access to any secrets, in perticular the AKV credentials the controller needs. The risk of exposing credentials to uninvited guests is low, and no higher than any other components in Kubernetes handling sensitive data. In practice, the same security precautions must be taken as with Kubernetes Secrets in general. The Kubernetes project have documented this here: + +### The Env-Injector + +Compared to the Controller the injector is quite different, as it's directly exposed together with the Pod and Containers requesting secret injection. In practice this means the code that downloads the secrets for Azure Key Vault runs inside the application Container and are executed before the original executable of that container. After the container has started, a Kubernetes user with the right credentials are able to exec into the container. Several steps have been taken to avoid exposing sensitive data in this scenario and are explained below. Another scenario is data stored in Kubernetes Secrets diff --git a/drone.yaml b/drone.yaml deleted file mode 100644 index 7bb1b16a..00000000 --- a/drone.yaml +++ /dev/null @@ -1,10 +0,0 @@ -kind: pipeline -type: docker -name: default - -steps: -- name: build - image: golang:1.13-alpine - commands: - - make test - - make build \ No newline at end of file diff --git a/go.mod b/go.mod index 04b3e2bb..752ef669 100644 --- a/go.mod +++ b/go.mod @@ -12,16 +12,21 @@ require ( github.com/containers/image/v5 v5.3.0 github.com/ghodss/yaml v1.0.0 github.com/gorilla/mux v1.7.4 + github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 github.com/prometheus/client_golang v1.1.0 github.com/sirupsen/logrus v1.4.2 github.com/slok/kubewebhook v0.4.0 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.4.0 - golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 + golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 + gonum.org/v1/gonum v0.8.1 // indirect gopkg.in/yaml.v2 v2.2.8 - k8s.io/api v0.0.0-20191004102255-dacd7df5a50b - k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a - k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7 - k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe // indirect - k8s.io/kubernetes v1.13.11 + k8s.io/api v0.17.9 + k8s.io/apimachinery v0.17.9 + k8s.io/client-go v0.17.9 + k8s.io/klog v1.0.0 + k8s.io/kubernetes v1.13.0 + k8s.io/legacy-cloud-providers v0.17.9 + sigs.k8s.io/yaml v1.2.0 ) diff --git a/go.sum b/go.sum index 8e710c2c..d3265212 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,13 @@ 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= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible h1:CVQNKuUepSFBo6BW6gM1J9slPHLRcjn6vaw+j+causw= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= @@ -24,8 +28,10 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= @@ -34,6 +40,8 @@ github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VY github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= @@ -42,23 +50,35 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2 h1:JCHLVE3B+kJde7bIEo5N4J+ZbLhp0J1Fs+ulyRws4gE= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8 h1:UPvo0sEDBWGIb/nxKyC07j8r3ZH0Qtd0V3aDDM9VpjI= github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8/go.mod h1:4AJxUpXUhv4N+ziTvIcWWXgeorXpxPZOfk9HdEVr96M= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 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/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= @@ -81,10 +101,16 @@ github.com/containers/storage v1.16.5 h1:eHeWEhUEWX3VMIG1Vn1rEjfRoLHUQev3cwtA5zd github.com/containers/storage v1.16.5/go.mod h1:SdysZeLKJOvfHYysUWg9OZUC3gdZWi5b2b7NC18VpPE= 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/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +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/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/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/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -93,10 +119,13 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65 h1:4zlOyrJUbYnrvlzChJ+jP2J3i77Jbhm336NEuCv7kZo= github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bPlG8QMY64VeXtVfjmjIlzaQok5Q= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969 h1:p2WzwcFof6KwsloLgCiAKkU5DJSVgOKGdevswAmskvY= @@ -105,11 +134,25 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= @@ -123,27 +166,47 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1 h1:wSt/4CYxs70xbATrGXhokKF1i0tZjENLOo1ioIO13zk= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9 h1:tF+augKRWlWx0J0B7ZyyKSiTyV6E1zZe+7b3qQlcEf8= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501 h1:C1JKChikHGpXwT5UQDFaryIpDtyyGL/CR6C2kB7F1oc= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87 h1:zP3nY8Tk2E6RTkqGYrarZXuzh+ffyLDljLxCy1iJw80= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/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/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -151,40 +214,66 @@ github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285 h1:pBGAMRKP7Tpv4mOq+RgzKz+jAj+ylo9O8PiNoMmCuu8= github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/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/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= @@ -198,12 +287,20 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a h1:TpvdAwDAt1K4ANVOfcihouRdvP+MgAfDWwBuct4l6ZY= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= @@ -220,14 +317,26 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= 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/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7FrlLismspbPc1teNRUVH7wLQ8= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -258,6 +367,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9 h1:kyf9snWXHvQc+yxE9imhdI8YAm4oKeZISlaAR+x73zs= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= @@ -269,6 +379,9 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= 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.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -282,8 +395,11 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 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.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -295,21 +411,30 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= 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.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -317,6 +442,7 @@ github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +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/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -325,10 +451,12 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +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/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= @@ -338,25 +466,43 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 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/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2 h1:y102fOLFqhV41b+4GPiJoa0k/x+pJcEi2/HB1Y5T6fU= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 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/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20181114220301-adae6a3d119a/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= @@ -364,12 +510,19 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r 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-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/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 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/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-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -377,56 +530,109 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ 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-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/sys v0.0.0-20170830134202-bb24a47a89ea/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-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-20190209173611-3b5209105503/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-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-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867 h1:JoRuNIf+rpHl+VhScRQQvzbHed86tKkqwPMV34T8myw= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-20180525024113-a5b4c53f6e8b/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-20181011042414-1f849cf54d09/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-20190206041539-40960b6deb8e/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 h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= 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-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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485 h1:OB/uP/Puiu5vS5QMRPrXCDWUPb+kt8f1KW8oQzFejQw= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.8.1 h1:wGtP3yGpc5mCLOLeTeBdjeui9oZSz5De0eOjMLC/QuQ= +gonum.org/v1/gonum v0.8.1/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= +google.golang.org/appengine v1.5.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-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 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/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 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= @@ -436,25 +642,101 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 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= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b h1:38Nx0U83WjBqn1hUWxlgKc7mvH7WhyHfypxeW3zWwCQ= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.17.9 h1:BA/U8qtSNzx7BbmQy3lODbCxVMKGNUpBJ2fjsKt6OOY= +k8s.io/api v0.17.9/go.mod h1:avJJAA1fSV6tnbCGW2K+S+ilDFW7WpNr5BScoiZ1M1U= +k8s.io/api v0.18.0 h1:lwYk8Vt7rsVTwjRU6pzEsa9YNhThbmbocQlKvNBB4EQ= +k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= +k8s.io/api v0.18.3 h1:2AJaUQdgUZLoDZHrun21PW2Nx9+ll6cUzvn3IKhSIn0= +k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= +k8s.io/api v0.18.8 h1:aIKUzJPb96f3fKec2lxtY7acZC9gQNDLVhfSGpxBAC4= +k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a h1:lDydUqHrbL/1l5ZQrqD1RIlabhmX8aiZEtxVUb+30iU= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.17.9 h1:knQxNgMu57Oxlm12J6DS375kmGMeuWV0VNzRRUBB2Yk= +k8s.io/apimachinery v0.17.9/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= +k8s.io/apimachinery v0.18.0 h1:fuPfYpk3cs1Okp/515pAf0dNhL66+8zk8RLbSX+EgAE= +k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= +k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= +k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.18.8 h1:jimPrycCqgx2QPearX3to1JePz7wSbVLq+7PdBTTwQ0= +k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= +k8s.io/apiserver v0.17.9/go.mod h1:Qaxd3EbeoPRBHVMtFyuKNAObqP6VAkzIMyWYz8KuE2k= +k8s.io/apiserver v0.18.0 h1:ELAWpGWC6XdbRLi5lwAbEbvksD7hkXxPdxaJsdpist4= +k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= +k8s.io/apiserver v0.18.8/go.mod h1:12u5FuGql8Cc497ORNj79rhPdiXQC4bf53X/skR/1YM= k8s.io/client-go v0.0.0-20170217214107-bcde30fb7eae/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.0.0-20190817222206-ee6c071a42cf/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7 h1:WyPHgjjXvF4zVVwKGZKKiJGBUW45AuN44uSOuH8euuE= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.17.9 h1:qUPhohX4bUBx0L7pfye02aPnu3PQ0t+B8dqHfGvt++k= +k8s.io/client-go v0.17.9/go.mod h1:3cM92qAd1XknA5IRkRfpJhl9OQjkYy97ZEUio70wVnI= +k8s.io/client-go v0.18.0 h1:yqKw4cTUQraZK3fcVCMeSa+lqKwcjZ5wtcOIPnxQno4= +k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= +k8s.io/client-go v0.18.3 h1:QaJzz92tsN67oorwzmoB0a9r9ZVHuD5ryjbCKP0U22k= +k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= +k8s.io/client-go v0.18.8 h1:SdbLpIxk5j5YbFr1b7fq8S7mDgDjYmUxSbszyoesoDM= +k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= +k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= +k8s.io/cloud-provider v0.17.9/go.mod h1:yjQQgdWmd3sYNMzraq49mbABlegaptBBB9OEnRXHRbY= +k8s.io/cloud-provider v0.18.8/go.mod h1:cn9AlzMPVIXA4HHLVbgGUigaQlZyHSZ7WAwDEFNrQSs= +k8s.io/code-generator v0.17.9 h1:gJ/y22bRtF0pTzdAaEgfnrzUDJi19SdD8wock9TP4Ik= +k8s.io/code-generator v0.17.9/go.mod h1:iiHz51+oTx+Z9D0vB3CH3O4HDDPWrvZyUgUYaIE9h9M= +k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.18.8 h1:lgO1P1wjikEtzNvj7ia+x1VC4svJ28a/r0wnOLhhOTU= +k8s.io/code-generator v0.18.8/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/component-base v0.17.9/go.mod h1:Wg22ePDK0mfTa+bEFgZHGwr0h40lXnYy6D7D+f7itFk= +k8s.io/component-base v0.18.0 h1:I+lP0fNfsEdTDpHaL61bCAqTZLoiWjEEP304Mo5ZQgE= +k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= +k8s.io/component-base v0.18.8/go.mod h1:00frPRDas29rx58pPCxNkhUfPbwajlyyvu8ruNgSErU= +k8s.io/csi-translation-lib v0.17.9/go.mod h1:wDkbibpo06FClp/OWvaMFpUWf/ogmUYBLSzGqnaTZ3w= +k8s.io/csi-translation-lib v0.18.8/go.mod h1:6cA6Btlzxy9s3QrS4BCZzQqclIWnTLr6Jx3H2ctAzY4= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505 h1:ZY6yclUKVbZ+SdWnkfY+Je5vrMpKOxmGeKRbsXVmqYM= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 h1:RPscN6KhmG54S33L+lr3GS+oD1jmchIU0ll519K6FA4= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe h1:GOfbcWvX5wW2vcfNch83xYp9SDZjRgAJk+t373yaHKk= k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= +k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= +k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/kubernetes v1.13.11 h1:PuVgT0kD6Aah8XnJpcG4ngzJ/pjbJNam15MflwUn5Lc= k8s.io/kubernetes v1.13.11/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.9 h1:UjJfTJYmT7z+WzJ6EHwbZFfwNuqKxMvcZ+R7pq95AQM= +k8s.io/legacy-cloud-providers v0.17.9/go.mod h1:6FdEAYK7AlGetm4ulIQ8uZMqkcu02Mv8Z0Z3theL9Rc= +k8s.io/legacy-cloud-providers v0.18.8 h1:IGASZSYJjkMk5d1HU9+zskZqoRG3zccVzvA3hV7hCL0= +k8s.io/legacy-cloud-providers v0.18.8/go.mod h1:tgp4xYf6lvjrWnjQwTOPvWQE9IVqSBGPF4on0IyICQE= +k8s.io/sample-controller v0.18.3 h1:SQZ5w15wmZ2gSGxHnMj9n4OQyHjzTkSMtRfOAxvBMLU= +k8s.io/sample-controller v0.18.3/go.mod h1:jH/zaO86WF7aGg0KzqxcAJ133tmBU9X5s2C6W3yU+4Y= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= +sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= diff --git a/images/ca-bundle-controller/Dockerfile b/images/ca-bundle-controller/Dockerfile new file mode 100644 index 00000000..d1279aa0 --- /dev/null +++ b/images/ca-bundle-controller/Dockerfile @@ -0,0 +1,26 @@ +FROM spvest/golang-build-stage:1.13.0 as build + +FROM alpine:3.8 + +ARG VCS_REF +ARG BUILD_DATE +ARG VCS_URL + +LABEL org.label-schema.schema-version="1.0" +LABEL org.label-schema.build-date=$BUILD_DATE +LABEL org.label-schema.vcs-ref=$VCS_REF +LABEL org.label-schema.vcs-url=$VCS_URL +LABEL org.label-schema.url=$VCS_URL +LABEL org.label-schema.description="A Kubernetes controller to sync public CA cert from a secret into labelled namespaces as a ConfigMap." +LABEL org.label-schema.vendor="Sparebanken Vest" +LABEL org.label-schema.author="Jon Arild Tørresdal" + +# install without cache +RUN apk update && apk add --no-cache \ + ca-certificates \ + iptables \ + && update-ca-certificates + +COPY --from=build /go/bin/ca-bundle-controller /usr/local/bin/ca-bundle-controller + +ENTRYPOINT ["ca-bundle-controller"] diff --git a/installation/controller/deployment.yaml b/installation/controller/deployment.yaml deleted file mode 100644 index f903884c..00000000 --- a/installation/controller/deployment.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: azure-keyvault-controller - namespace: spv-system - labels: - app: azure-keyvault-controller - aadpodidbinding: azure_key_vault # Binding from AzureIdentityBinding -spec: - selector: - matchLabels: - app: azure-keyvault-controller - template: - metadata: - labels: - app: azure-keyvault-controller - aadpodidbinding: azure_key_vault # Binding from AzureIdentityBinding - spec: - serviceAccountName: azure-keyvault-controller - containers: - - name: azure-keyvault-controller - image: spvest/azure-keyvault-controller:0.1.0-alpha.1 - imagePullPolicy: Always - env: - - name: AZURE_VAULT_NORMAL_POLL_INTERVALS - value: 10m - - name: AZURE_VAULT_EXCEPTION_POLL_INTERVALS - value: 30m - - name: AZURE_VAULT_MAX_FAILURE_ATTEMPTS - value: "5" - # - name: LOG_LEVEL - # value: debug diff --git a/installation/controller/rbac.yaml b/installation/controller/rbac.yaml deleted file mode 100644 index c7f840a5..00000000 --- a/installation/controller/rbac.yaml +++ /dev/null @@ -1,85 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: azure-key-vault-controller ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - name: azure-key-vault-controller -rules: -- apiGroups: - - spv.no - resources: - - azurekeyvaultsecrets - verbs: - - get - - list - - watch - - update -- apiGroups: - - spv.no - resources: - - azurekeyvaultsecrets/status - verbs: - - patch - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - update - - delete - - get - - watch - - list -- apiGroups: - - "" - resources: - - events - verbs: - - create - - update - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - name: azure-key-vault-reader -rules: -- apiGroups: - - spv.no - resources: - - azurekeyvaultsecrets - verbs: - - get - - list - - watch ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1beta1 -metadata: - name: azure-keyvault-controller -subjects: -- kind: ServiceAccount - name: azure-keyvault-controller - namespace: spv-system -roleRef: - kind: ClusterRole - name: azure-keyvault-controller - apiGroup: rbac.authorization.k8s.io ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1beta1 -metadata: - name: azure-key-vault-reader -subjects: -- kind: Group - name: system:serviceaccounts - apiGroup: rbac.authorization.k8s.io -roleRef: - kind: ClusterRole - name: azure-key-vault-reader - apiGroup: rbac.authorization.k8s.io diff --git a/installation/crd.yaml b/installation/crd.yaml deleted file mode 100644 index e10d5577..00000000 --- a/installation/crd.yaml +++ /dev/null @@ -1,79 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: azurekeyvaultsecrets.spv.no -spec: - group: spv.no - names: - kind: AzureKeyVaultSecret - listKind: AzureKeyVaultSecretList - plural: azurekeyvaultsecrets - singular: azurekeyvaultsecret - shortNames: - - akvs - categories: - - all - additionalPrinterColumns: - - name: Secret Name - type: string - description: Which Kubernetes Secret this resource is synched with - JSONPath: .status.secretName - - name: Vault - type: string - description: Which Azure Key Vault this resource is synched with - JSONPath: .spec.vault.name - - name: Vault Object - type: string - description: Which Azure Key Vault object this resource is synched with - JSONPath: .spec.vault.object.name - - name: Synched - type: string - description: When this resource was last synched with Azure Key Vault - JSONPath: .status.lastAzureUpdate - scope: Namespaced - version: v1alpha1 - subresources: - status: {} - validation: - openAPIV3Schema: - properties: - spec: - required: ['vault'] - properties: - vault: - required: ['name', 'object'] - properties: - name: - type: string - description: Name of the Azure Key Vault - object: - required: ['name', 'type'] - properties: - name: - type: string - description: The object name in Azure Key Vault - type: - type: string - description: The type of object in Azure Key Vault - enum: - - secret - - multi-key-value-secret # not implemented - - certificate - - exportable-certificate - - key # not implemented - version: - type: string - description: The object version in Azure Key Vault - output: - properties: - secret: - properties: - name: - type: string - description: Name for Kubernetes secret - default is name of this resource (metadata.name) - type: - type: string - description: Type of Secret in Kubernetes - dataKey: - type: string - description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data diff --git a/int-tests/cluster-role-env-injector-auth.yaml b/int-tests/cluster-role-env-injector-auth.yaml new file mode 100644 index 00000000..0ad4fd27 --- /dev/null +++ b/int-tests/cluster-role-env-injector-auth.yaml @@ -0,0 +1,26 @@ +# apiVersion: rbac.authorization.k8s.io/v1 +# kind: ClusterRole +# metadata: +# name: akv2k8s-auth +# rules: +# - apiGroups: [""] +# # +# # at the HTTP level, the name of the resource for accessing Secret +# # objects is "secrets" +# resources: ["secrets"] +# verbs: ["get", "watch", "list"] +# --- + +apiVersion: rbac.authorization.k8s.io/v1 +# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace. +kind: ClusterRoleBinding +metadata: + name: akv2k8s-auth-global +subjects: +- kind: ServiceAccount + name: default + namespace: akv2k8s-test +roleRef: + kind: ClusterRole + name: system:discovery + apiGroup: rbac.authorization.k8s.io \ No newline at end of file diff --git a/int-tests/ns.yaml b/int-tests/ns.yaml new file mode 100644 index 00000000..54c20713 --- /dev/null +++ b/int-tests/ns.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: akv2k8s-test + labels: + azure-key-vault-env-injection: enabled diff --git a/int-tests/test-secret/akvs.yaml b/int-tests/test-secret/akvs.yaml new file mode 100644 index 00000000..23217322 --- /dev/null +++ b/int-tests/test-secret/akvs.yaml @@ -0,0 +1,11 @@ +apiVersion: spv.no/v1 +kind: AzureKeyVaultSecret +metadata: + name: test-secret + namespace: akv2k8s-test +spec: + vault: + name: akv2k8s-test + object: + type: secret + name: my-secret diff --git a/int-tests/test-secret/deployment.yaml b/int-tests/test-secret/deployment.yaml new file mode 100644 index 00000000..bb1f65ee --- /dev/null +++ b/int-tests/test-secret/deployment.yaml @@ -0,0 +1,35 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: secret-inject + namespace: akv2k8s-test + labels: + app: secret-inject +spec: + selector: + matchLabels: + app: secret-inject + template: + metadata: + labels: + app: secret-inject + spec: + containers: + - name: my-image + image: spvest/akv2k8s-env-test:2.0.1 + command: ['/bin/sh', '-c'] + args: ['printenv TEST_SECRET TEST_SECRET2 && sleep 60 && echo "Fail container to check recovery" && exit 1'] + env: + - name: ENV_INJECTOR_LOG_LEVEL + value: Debug + - name: TEST_SECRET + value: test-secret@azurekeyvault + - name: TEST_SECRET2 + value: Just plain env var + # livenessProbe: + # exec: + # command: + # - cat + # - /tmp/secret.txt + # initialDelaySeconds: 5 + # periodSeconds: 5 diff --git a/kind.yaml b/kind.yaml new file mode 100644 index 00000000..9f211615 --- /dev/null +++ b/kind.yaml @@ -0,0 +1,5 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: +- role: control-plane + image: kindest/node:v1.17.5@sha256:ab3f9e6ec5ad8840eeb1f76c89bb7948c77bbf76bcebe1a8b59790b8ae9a283a \ No newline at end of file diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go new file mode 100644 index 00000000..6fa66578 --- /dev/null +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -0,0 +1,618 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* + When the env-injector gets installed, a CA Cert and Key, together with a serving cert + is installed as a Secert in the akv2k8s namespace. We monitor this secret for changes + and copy the CA Cert into a ConfigMap in all namespaces labeled + `azure-key-vault-env-injection: enabled`. We also monitor the label, and removed CA bundle if label is changed. +*/ + +package cabundleinjector + +import ( + "fmt" + "time" + + log "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/wait" + coreinformers "k8s.io/client-go/informers/core/v1" + "k8s.io/client-go/kubernetes" + corelisters "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/cache" + "k8s.io/client-go/util/workqueue" +) + +type workQueueType string + +const ( + // SuccessSynced is used as part of the Event 'reason' when a AzureKeyVaultSecret is synced + SuccessSynced = "Synced" + + // ErrResourceExists is used as part of the Event 'reason' when a AzureKeyVaultSecret fails + // to sync due to a Secret of the same name already existing. + ErrResourceExists = "ErrResourceExists" + + // MessageResourceExists is the message used for Events when a resource + // fails to sync due to a Deployment already existing + MessageResourceExists = "Resource '%s' already exists and is not managed by CA Bundle Injector" + + // MessageResourceSynced is the message used for an Event fired when a AzureKeyVaultSecret + // is synced successfully + MessageResourceSynced = "CA Bundle synced successfully" + + workQueueTypeSecret workQueueType = "secret" + workQueueTypeNewNamespace workQueueType = "newNamespace" + workQueueTypeChangedNamespace workQueueType = "changedNamespace" +) + +type caBundleControllerConfig struct { +} + +// Controller is the controller implementation for AzureKeyVaultSecret resources +type Controller struct { + + // workqueue is a rate limited work queue. This is used to queue work to be + // processed instead of performing it as soon as a change happens. This + // means we can ensure we only process a fixed amount of resources at a + // time, and makes it easy to ensure we are never processing the same item + // simultaneously in two different workers. + kubeclientset kubernetes.Interface + + secretWorkqueue workqueue.RateLimitingInterface + newNamespaceWorkqueue workqueue.RateLimitingInterface + changedNamespaceWorkqueue workqueue.RateLimitingInterface + + secretsSynced cache.InformerSynced + namespacesSynced cache.InformerSynced + + secretLister corelisters.SecretLister + configMapLister corelisters.ConfigMapLister + namespaceLister corelisters.NamespaceLister + + labelName string + caBundleSecretName string + caBundleSecretNamespaceName string + caBundleConfigMapName string +} + +// NewController returns a new AzureKeyVaultSecret controller +func NewController(kubeclientset kubernetes.Interface, secretInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer, labelName string, caBundleSecretNamespaceName string, caBundleSecretName string, caBundleConfigMapName string) *Controller { + // // Create event broadcaster + // // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be + // // logged for azure-keyvault-controller types. + // utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) + + controller := &Controller{ + kubeclientset: kubeclientset, + secretsSynced: secretInformer.Informer().HasSynced, + namespacesSynced: namespaceInformer.Informer().HasSynced, + secretWorkqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CABundles"), + newNamespaceWorkqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CAInjectedNewNamespaces"), + changedNamespaceWorkqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CAInjectedChangedNamespaces"), + labelName: labelName, + secretLister: secretInformer.Lister(), + configMapLister: configMapInformer.Lister(), + namespaceLister: namespaceInformer.Lister(), + caBundleSecretName: caBundleSecretName, + caBundleSecretNamespaceName: caBundleSecretNamespaceName, + caBundleConfigMapName: caBundleConfigMapName, + } + + log.Info("Setting up event handlers") + + // Set up an event handler for when Secret resources change. This + // handler will lookup the owner of the given Secret, and if it is + // owned by a AzureKeyVaultSecret resource will enqueue that Secret resource for + // processing. This way, we don't need to implement custom logic for + // handling AzureKeyVaultSecret resources. More info on this pattern: + // https://github.com/kubernetes/community/blob/8cafef897a22026d42f5e5bb3f104febe7e29830/contributors/devel/controllers.md + secretInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { // When CA Bundle gets added to akv2k8s + secret := obj.(*corev1.Secret) + if secret.Name != caBundleSecretName { + return + } + // lbl := secret.Labels[controller.labelName] + // if lbl == "" { + // return + // } + + log.Debugf("Secret '%s' monitored by CA Bundle Injector added. Adding to queue.", secret.Name) + controller.enqueueSecret(obj) + }, + UpdateFunc: func(old, new interface{}) { // When CA Bundle gets changed in akv2k8s + newSecret := new.(*corev1.Secret) + oldSecret := old.(*corev1.Secret) + + if newSecret.Name != caBundleSecretName { + return + } + + if newSecret.ResourceVersion == oldSecret.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } + secret := new.(*corev1.Secret) + log.Debugf("Secret '%s' monitored by CA Bundle Injector changed. Handling.", secret.Name) + controller.enqueueSecret(new) + }, + DeleteFunc: func(obj interface{}) { // When CA Bundle gets deleted in akv2k8s + secret := obj.(*corev1.Secret) + + if secret.Name != caBundleSecretName { + return + } + + log.Debugf("Secret '%s' monitored by CA Bundle Injector deleted. Handling.", secret.Name) + controller.enqueueSecret(obj) + }, + }) + + namespaceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { // When a new namespace gets added, that we should add ConfigMap to + ns := obj.(*corev1.Namespace) + lbl := ns.Labels[controller.labelName] + if lbl == "" { + return + } + + log.Debugf("Namespace '%s' labeled '%s' will be monitored by CA Bundle Injector. Adding to queue.", ns.Name, lbl) + controller.enqueueNewNamespace(obj) + }, + UpdateFunc: func(old, new interface{}) { // When an existing namespace gets updated, that potentually have akv2k8s label on it + newNs := new.(*corev1.Namespace) + oldNs := old.(*corev1.Namespace) + + if newNs.ResourceVersion == oldNs.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } + + newLbl := newNs.Labels[controller.labelName] + oldLbl := oldNs.Labels[controller.labelName] + diffLabels := newLbl != oldLbl + + if !diffLabels { + return // we only care if the namespace label has changed + } + + ns := new.(*corev1.Namespace) + log.Debugf("labels in namespace '%s' changed, handling.", ns.Name) + controller.enqueueChangedNamespace(new) + }, + // DeleteFunc: func(obj interface{}) { + // ns := obj.(*corev1.Namespace) + // log.Debugf("Namespace '%s' monitored by CA Bundle Injector deleted. Handling.", ns.Name) + // controller.enqueueNamespace(obj) + // }, + }) + + // configMapInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + // DeleteFunc: func(obj interface{}) { + // ns := obj.(*corev1.ConfigMap) + // log.Debugf("ConfigMap '%s' monitored by CA Bundle Injector deleted. Handling.", ns.Name) + // controller.enqueueNamespace(obj) + // }, + // }) + + return controller +} + +// Run will set up the event handlers for types we are interested in, as well +// as syncing informer caches and starting workers. It will block until stopCh +// is closed, at which point it will shutdown the workqueue and wait for +// workers to finish processing their current work items. +func (c *Controller) Run(threadiness int, stopCh <-chan struct{}) error { + defer utilruntime.HandleCrash() + defer c.secretWorkqueue.ShutDown() + defer c.newNamespaceWorkqueue.ShutDown() + defer c.changedNamespaceWorkqueue.ShutDown() + + // Start the informer factories to begin populating the informer caches + log.Info("Starting CA Bundle Injector controller") + + // Wait for the caches to be synced before starting workers + log.Info("Waiting for informer caches to sync") + if ok := cache.WaitForCacheSync(stopCh, c.secretsSynced, c.namespacesSynced); !ok { + return fmt.Errorf("failed to wait for caches to sync") + } + + log.Info("Starting workers") + // Launch two workers to process AzureKeyVaultSecret resources + for i := 0; i < threadiness; i++ { + go wait.Until(c.runSecretWorker, time.Second, stopCh) + go wait.Until(c.runNewNamespaceWorker, time.Second, stopCh) + go wait.Until(c.runChangedNamespaceWorker, time.Second, stopCh) + } + + log.Info("Started workers") + <-stopCh + log.Info("Shutting down workers") + + return nil +} + +// runWorker is a long-running function that will continually call the +// processNextWorkItem function in order to read and process a message on the +// workqueue. +func (c *Controller) runSecretWorker() { + for c.processNextWorkItem(c.secretWorkqueue, workQueueTypeSecret) { + } +} + +// runWorker is a long-running function that will continually call the +// processNextWorkItem function in order to read and process a message on the +// workqueue. +func (c *Controller) runNewNamespaceWorker() { + for c.processNextWorkItem(c.newNamespaceWorkqueue, workQueueTypeNewNamespace) { + } +} + +// runWorker is a long-running function that will continually call the +// processNextWorkItem function in order to read and process a message on the +// workqueue. +func (c *Controller) runChangedNamespaceWorker() { + for c.processNextWorkItem(c.changedNamespaceWorkqueue, workQueueTypeChangedNamespace) { + } +} + +// processNextWorkItem will read a single work item off the workqueue and +// attempt to process it, by calling the syncHandler. +func (c *Controller) processNextWorkItem(queue workqueue.RateLimitingInterface, typeOfQueue workQueueType) bool { + log.Debug("Processing next work item in queue...") + obj, shutdown := queue.Get() + + if shutdown { + return false + } + + // We wrap this block in a func so we can defer c.workqueue.Done. + err := func(obj interface{}) error { + defer queue.Done(obj) + var key string + var ok bool + var successMsg string + + if key, ok = obj.(string); !ok { + queue.Forget(obj) + utilruntime.HandleError(fmt.Errorf("expected string in workqueue but got %#v", obj)) + return nil + } + + var err error + log.Debugf("Handling '%s' in queue...", key) + successMsg = "Successfully synced CA Bundle '%s'" + + switch typeOfQueue { + case workQueueTypeSecret: + err = c.syncHandlerSecret(key) + case workQueueTypeNewNamespace: + err = c.syncHandlerNewNamespace(key) + case workQueueTypeChangedNamespace: + err = c.syncHandlerChangedNamespace(key) + } + + if err != nil { + queue.AddRateLimited(key) + return fmt.Errorf("error syncing '%s': %s, requeuing", key, err.Error()) + } + + queue.Forget(obj) + log.Infof(successMsg, key) + return nil + }(obj) + + if err != nil { + log.Error(err) + return true + } + + return true +} + +//syncHandler for secrets +func (c *Controller) syncHandlerSecret(key string) error { + /* + 1. Get Secret + 2. Get all akv2k8s-injector enabled namespaces + 3. Create ConfigMaps containing CA cert in namespaces + */ + + // Convert the namespace/name string into a distinct namespace and name + namespace, name, err := cache.SplitMetaNamespaceKey(key) + if err != nil { + utilruntime.HandleError(fmt.Errorf("invalid resource key: %s", key)) + return nil + } + + log.Debugf("pulling secret '%s' from namespace '%s'", name, namespace) + + // Get the Secret resource with this namespace/name + secret, err := c.secretLister.Secrets(namespace).Get(name) + if err != nil { + // The Secret resource may no longer exist, in which case we stop + // processing. + if errors.IsNotFound(err) { + utilruntime.HandleError(fmt.Errorf("secret '%s' in work queue no longer exists", key)) + return nil + } + + return err + } + + labelSelector := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "azure-key-vault-env-injection": "enabled", + }, + } + + selector, err := metav1.LabelSelectorAsSelector(labelSelector) + if err != nil { + return err + } + + labelledNamespaces, err := c.namespaceLister.List(selector) + if err != nil { + return err + } + + log.Debugf("looping all labelled namespaces looking for config map '%s'", c.caBundleConfigMapName) + + for _, ns := range labelledNamespaces { + configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get("akv2k8s-ca") + + // If the resource doesn't exist, we'll create it + if errors.IsNotFound(err) { + log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating configmap now", c.caBundleConfigMapName, ns.Name) + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + if err != nil { + log.Errorf("failed to create configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) + return err + } + return nil + } + + // If an error occurs during Get/Create, we'll requeue the item so we can + // attempt processing again later. This could have been caused by a + // temporary network failure, or any other transient reason. + if err != nil { + return err + } + + // If the ConfigMap is not controlled by this Secret resource, we should log + // a warning to the event recorder and return error msg. + if !metav1.IsControlledBy(configMap, secret) { + msg := fmt.Sprintf(MessageResourceExists, configMap.Name) + // c.recorder.Event(foo, corev1.EventTypeWarning, ErrResourceExists, msg) + return fmt.Errorf(msg) + } + + // If CA cert in ConfigMap resource is not the same as in Secret resource, we + // should update the ConfigMap resource. + if configMap.Data["caCert"] != secret.StringData["caCert"] { + // klog.V(4).Infof("Foo %s replicas: %d, deployment replicas: %d", name, *foo.Spec.Replicas, *deployment.Spec.Replicas) + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) + } + + // If an error occurs during Update, we'll requeue the item so we can + // attempt processing again later. This could have been caused by a + // temporary network failure, or any other transient reason. + if err != nil { + return err + } + + // Finally, we update the status block of the Foo resource to reflect the + // current state of the world + // err = c.updateSecretStatus(secret, configMap) + // if err != nil { + // return err + // } + } + + // c.recorder.Event(foo, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) + return nil +} + +//syncHandler for new labelled namespaces +func (c *Controller) syncHandlerNewNamespace(key string) error { + ns, err := c.namespaceLister.Get(key) + if err != nil { + return err + } + + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, key) + _, err = c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) + + if err != nil { + if errors.IsNotFound(err) { // if configmap does not exist, create it + log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating", c.caBundleConfigMapName, key) + + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + if err != nil { + log.Errorf("failed to create configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) + return err + } + return nil + } + + return err + } + + log.Debugf("configmap '%s' found in new labelled namespace '%s' - strange... ignoring", c.caBundleConfigMapName, key) + return nil +} + +//syncHandler for changed namespaces +func (c *Controller) syncHandlerChangedNamespace(key string) error { + ns, err := c.namespaceLister.Get(key) + if err != nil { + return err + } + + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, key) + cm, err := c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) + if err != nil { + if errors.IsNotFound(err) { + log.Debugf("configmap '%s' not found in updated namespace '%s' - creating", c.caBundleConfigMapName, key) + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + if err != nil { + log.Errorf("failed to create configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) + return err + } + return nil + } + return err + } + + //If the resource exists in a non-labelled namespace, we delete it + if !c.isNamespacesLabelled(ns) && cm != nil { + log.Infof("configmap '%s' exists in namespace '%s' which is no longer labelled to keep CA Bundle", c.caBundleConfigMapName, key) + err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) + if err != nil { + return err + } + } + + return nil +} + +func (c *Controller) isNamespacesLabelled(ns *corev1.Namespace) bool { + lbl := ns.Labels[c.labelName] + if lbl == "enabled" { + return true + } + + return false +} + +func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigMap { + dataByte := secret.Data["caCert"] + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: ns, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(secret, schema.GroupVersionKind{ + Group: corev1.SchemeGroupVersion.Group, + Version: corev1.SchemeGroupVersion.Version, + Kind: "Secret", + }), + }, + }, + BinaryData: map[string][]byte{ + "caCert": dataByte, + }, + } +} + +// enqueueSecret takes a Secret resource and converts it into a namespace/name +// string which is then put onto the work queue. This method should *not* be +// passed resources of any type other than Secret. +func (c *Controller) enqueueSecret(obj interface{}) { + var key string + var err error + if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { + utilruntime.HandleError(err) + return + } + c.secretWorkqueue.AddRateLimited(key) +} + +// enqueueNamespace takes a Namespace resource and converts it into a namespace/name +// string which is then put onto the work queue. This method should *not* be +// passed resources of any type other than Namespace. +func (c *Controller) enqueueNewNamespace(obj interface{}) { + var key string + var err error + if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { + utilruntime.HandleError(err) + return + } + c.newNamespaceWorkqueue.AddRateLimited(key) +} + +// enqueueNamespace takes a Namespace resource and converts it into a namespace/name +// string which is then put onto the work queue. This method should *not* be +// passed resources of any type other than Namespace. +func (c *Controller) enqueueChangedNamespace(obj interface{}) { + var key string + var err error + if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { + utilruntime.HandleError(err) + return + } + c.changedNamespaceWorkqueue.AddRateLimited(key) +} + +// // enqueueAzurePoll takes a AzureKeyVaultSecret resource and converts it into a namespace/name +// // string which is then put onto the work queue. This method should *not* be +// // passed resources of any type other than AzureKeyVaultSecret. +// func (c *Controller) enqueueAzurePoll(obj interface{}) { +// var key string +// var err error +// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { +// utilruntime.HandleError(err) +// return +// } +// c.workqueueAzure.AddRateLimited(key) +// } + +// // dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name +// // string which is then put onto the work queue for deltion. This method should *not* be +// // passed resources of any type other than AzureKeyVaultSecret. +// func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { +// var key string +// var err error + +// if key, err = cache.DeletionHandlingMetaNamespaceKeyFunc(obj); err != nil { +// utilruntime.HandleError(err) +// return +// } +// c.workqueue.AddRateLimited(key) + +// // Getting default key to remove from Azure work queue +// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { +// utilruntime.HandleError(err) +// return +// } +// c.workqueueAzure.Forget(key) +// } diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller_test.go b/pkg/akv2k8s/controller/cabundleinjector/controller_test.go new file mode 100644 index 00000000..cbe246bc --- /dev/null +++ b/pkg/akv2k8s/controller/cabundleinjector/controller_test.go @@ -0,0 +1,323 @@ +package cabundleinjector + +import ( + "reflect" + "testing" + "time" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" + kubeinformers "k8s.io/client-go/informers" + k8sfake "k8s.io/client-go/kubernetes/fake" + core "k8s.io/client-go/testing" + "k8s.io/client-go/tools/cache" +) + +var ( + alwaysReady = func() bool { return true } + noResyncPeriodFunc = func() time.Duration { return 0 } +) + +type fixture struct { + t *testing.T + + kubeclient *k8sfake.Clientset + // Objects to put in the store. + secretLister []*corev1.Secret + configMapLister []*corev1.ConfigMap + namespaceLister []*corev1.Namespace + + // Actions expected to happen on the client. + kubeactions []core.Action + // actions []core.Action + + // Objects from here preloaded into NewSimpleFake. + kubeobjects []runtime.Object + objects []runtime.Object +} + +func newFixture(t *testing.T) *fixture { + f := &fixture{} + f.t = t + f.objects = []runtime.Object{} + f.kubeobjects = []runtime.Object{} + return f +} + +func (f *fixture) newController() (*Controller, []kubeinformers.SharedInformerFactory) { + f.kubeclient = k8sfake.NewSimpleClientset(f.kubeobjects...) + + k8sInformerSecrets := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) + k8sInformerNamespaces := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) + k8sInformerConfigMaps := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) + + // NewController(secretCABundleInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer) + c := NewController(f.kubeclient, k8sInformerSecrets.Core().V1().Secrets(), k8sInformerNamespaces.Core().V1().Namespaces(), k8sInformerConfigMaps.Core().V1().ConfigMaps(), "azure-key-vault-env-injection", "akv2k8s", "azure-key-vault-env-injector", "akv2k8s-ca") + + // c.foosSynced = alwaysReady + // c.deploymentsSynced = alwaysReady + // c.recorder = &record.FakeRecorder{} + + // for _, f := range f.fooLister { + // i.Samplecontroller().V1alpha1().Foos().Informer().GetIndexer().Add(f) + // } + + for _, d := range f.secretLister { + k8sInformerSecrets.Core().V1().Secrets().Informer().GetIndexer().Add(d) + } + + for _, d := range f.configMapLister { + k8sInformerConfigMaps.Core().V1().ConfigMaps().Informer().GetIndexer().Add(d) + } + + for _, d := range f.namespaceLister { + k8sInformerNamespaces.Core().V1().Namespaces().Informer().GetIndexer().Add(d) + } + + return c, []kubeinformers.SharedInformerFactory{ + k8sInformerConfigMaps, + k8sInformerNamespaces, + k8sInformerSecrets, + } +} + +func createNewSecret(name string, namespace string, secretValue map[string]string) *corev1.Secret { + return &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Type: corev1.SecretTypeOpaque, + StringData: secretValue, + } +} + +func createNewNamespace(name string, addLabel bool) *corev1.Namespace { + ns := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + } + + if addLabel { + ns.Labels = map[string]string{ + "azure-key-vault-env-injection": "enabled", + } + } + return ns +} + +func (f *fixture) run(secretName string, namespaceName string) { + f.runController(secretName, namespaceName, true, false) +} + +func (f *fixture) runExpectError(secretName string, namespaceName string) { + f.runController(secretName, namespaceName, true, true) +} + +func (f *fixture) runController(secretName string, namespaceName string, startInformers bool, expectError bool) { + c, informers := f.newController() + if startInformers { + stopCh := make(chan struct{}) + defer close(stopCh) + for _, informer := range informers { + informer.Start(stopCh) + } + } + + if secretName != "" { + err := c.syncHandlerSecret(secretName) + if !expectError && err != nil { + f.t.Errorf("error syncing foo: %v", err) + } else if expectError && err == nil { + f.t.Error("expected error syncing foo, got nil") + } + } + + if namespaceName != "" { + err := c.syncHandlerNewNamespace(namespaceName) + if !expectError && err != nil { + f.t.Errorf("error syncing namespace: %v", err) + } else if expectError && err == nil { + f.t.Error("expected error syncing namespace, got nil") + } + } + + k8sActions := filterInformerActions(f.kubeclient.Actions()) + for i, action := range k8sActions { + if len(f.kubeactions) < i+1 { + f.t.Errorf("%d unexpected actions: %+v", len(k8sActions)-len(f.kubeactions), k8sActions[i:]) + break + } + + expectedAction := f.kubeactions[i] + checkAction(expectedAction, action, f.t) + } + + if len(f.kubeactions) > len(k8sActions) { + f.t.Errorf("%d additional expected actions:%+v", len(f.kubeactions)-len(k8sActions), f.kubeactions[len(k8sActions):]) + } +} + +func getKey(obj interface{}, t *testing.T) string { + key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) + if err != nil { + t.Errorf("Unexpected error getting key for object: %v", err) + return "" + } + return key +} + +// checkAction verifies that expected and actual actions are equal and both have +// same attached resources +func checkAction(expected, actual core.Action, t *testing.T) { + if !(expected.Matches(actual.GetVerb(), actual.GetResource().Resource) && actual.GetSubresource() == expected.GetSubresource()) { + t.Errorf("Expected\n\t%#v\ngot\n\t%#v", expected, actual) + return + } + + if reflect.TypeOf(actual) != reflect.TypeOf(expected) { + t.Errorf("Action has wrong type. Expected: %t. Got: %t", expected, actual) + return + } + + switch a := actual.(type) { + case core.CreateActionImpl: + e, _ := expected.(core.CreateActionImpl) + expObject := e.GetObject() + object := a.GetObject() + + if !reflect.DeepEqual(expObject, object) { + t.Errorf("Action %s %s has wrong object\nDiff:\n %s", + a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expObject, object)) + } + case core.UpdateActionImpl: + e, _ := expected.(core.UpdateActionImpl) + expObject := e.GetObject() + object := a.GetObject() + + if !reflect.DeepEqual(expObject, object) { + t.Errorf("Action %s %s has wrong object\nDiff:\n %s", + a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expObject, object)) + } + case core.PatchActionImpl: + e, _ := expected.(core.PatchActionImpl) + expPatch := e.GetPatch() + patch := a.GetPatch() + + if !reflect.DeepEqual(expPatch, patch) { + t.Errorf("Action %s %s has wrong patch\nDiff:\n %s", + a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expPatch, patch)) + } + case core.DeleteActionImpl: + e, _ := expected.(core.DeleteActionImpl) + expDel := e.GetName() + del := a.GetName() + + if !reflect.DeepEqual(expDel, del) { + t.Errorf("Action %s %s has wrong delete\nDiff:\n %s", + a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expDel, del)) + } + default: + t.Errorf("Uncaptured Action %s %s, you should explicitly add a case to capture it", + actual.GetVerb(), actual.GetResource().Resource) + } +} + +// filterInformerActions filters list and watch actions for testing resources. +// Since list and watch don't change resource state we can filter it to lower +// nose level in our tests. +func filterInformerActions(actions []core.Action) []core.Action { + ret := []core.Action{} + for _, action := range actions { + if len(action.GetNamespace()) == 0 && + (action.Matches("list", "secrets") || + action.Matches("watch", "secrets") || + action.Matches("list", "configmaps") || + action.Matches("watch", "configmaps") || + action.Matches("list", "namespaces") || + action.Matches("watch", "namespaces")) { + continue + } + ret = append(ret, action) + } + + return ret +} + +func (f *fixture) expectCreateConfigMapAction(cm *corev1.ConfigMap) { + f.kubeactions = append(f.kubeactions, core.NewCreateAction(schema.GroupVersionResource{Resource: "configmaps"}, cm.Namespace, cm)) +} + +func (f *fixture) expectRemoveConfigMapAction(cm *corev1.ConfigMap) { + f.kubeactions = append(f.kubeactions, core.NewDeleteAction(schema.GroupVersionResource{Resource: "configmaps"}, cm.Namespace, cm.Name)) +} + +func TestCreatesConfigMap(t *testing.T) { + f := newFixture(t) + + secretValue := map[string]string{ + "caCert": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRSmFUeUxENnVPM0lYOERKZlZhZ1NtekFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwemRtTXRZMkYwTFdOaE1CNFhEVEl3TURNeE9URTBOREV5T1ZvWERUTXdNRE14TnpFMApOREV5T1Zvd0ZURVRNQkVHQTFVRUF4TUtjM1pqTFdOaGRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVFFdFRZUG5FSnFoMXc4NFI5MWV0Nng1MFB3NEVZNFpjOUhHRW5KRW1UdEVSOVUKTG44MGg3MUwwdnJUOXpUcTVhZFlsOWRhaDB5T2JJUU1aMU5VYmdPanQvczJnUHNRaFU5QVZPbmNqWG1OK0x2eQo5Q0I4NEFiY1A0U0NLV1pSQWd1NVhQdGlsUlNYbG9NTGxLUU52TWZ2QkpDWlhvcS9pVWZXcmxQOWp1dHQ2V0luCjdKUWxXUmRhdENYby9sWDZ0cFgydy8vMU1XZTN1R1lKcWNyUFlVN2c5N1NjdWJEZCtBanE4RSs2S0FqU3AzVnQKUTU5enpKenRFczNJaVBUU0szbXlrSVNXUWdlSEVUZ3F0cFJiaVdHOW0xdDBDc3FVRVBmMjhIayt4VHVVOWFBeQpZclVhbFkrSmxxc2hybUVLdUsxL2NMMU8zZU95aHRXT2R2SndYNThDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUF0eHp1alVIa3c1VmJyczFNcWl6Vkd2dk9sdVZSQgpzb1NPb3BuakZVdHkyYjV6OUltcHdDeEMwWmppNFVVdVdrMTJHZGxldlE0dTdvbmV5VytZR25qeDNRY1FGQ2plCmpTeU1uM2xsWnpFcVFyLzNpWDVBRUp4NFZDZ3lmNmtiVmdmbnp2aXVrWm83NjUwTCt0V0xiK2JNWllDZ0h1a3YKVi9SNlBxSGdzZDZiSlV4U1lMWElFamtCK0x5cXlSM2RvZDRDNUhpK2dRd0dsK0EyWVd4R0p0SDZVOExYVldYLwpKSDIvUXVIU09uUm9QeVV4MVduUDV6M1NHYWZyR1ZrbVJwTW56UWk3YjFFeTJMQVlENGhCRlJXZSt0bWR3NjRRCmJMbUYwRU85cVVKQjg2bE1LN2pvVUk2TFc5ajF6SWVUREZRN0ZZOUY2VEJiNmZoNVFNak1YdVhYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", + } + + fakeSecret := createNewSecret("azure-key-vault-env-injector", "akv2k8s", secretValue) + + namespace := createNewNamespace("akv2k8s-test", true) + f.secretLister = append(f.secretLister, fakeSecret) + f.namespaceLister = append(f.namespaceLister, namespace) + + cm := newConfigMap("akv2k8s-ca", namespace.Name, fakeSecret) + f.expectCreateConfigMapAction(cm) + + f.run(getKey(fakeSecret, t), "") +} + +func TestCreatesConfigMapInNewNamespace(t *testing.T) { + f := newFixture(t) + + secretValue := map[string]string{ + "caCert": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRSmFUeUxENnVPM0lYOERKZlZhZ1NtekFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwemRtTXRZMkYwTFdOaE1CNFhEVEl3TURNeE9URTBOREV5T1ZvWERUTXdNRE14TnpFMApOREV5T1Zvd0ZURVRNQkVHQTFVRUF4TUtjM1pqTFdOaGRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVFFdFRZUG5FSnFoMXc4NFI5MWV0Nng1MFB3NEVZNFpjOUhHRW5KRW1UdEVSOVUKTG44MGg3MUwwdnJUOXpUcTVhZFlsOWRhaDB5T2JJUU1aMU5VYmdPanQvczJnUHNRaFU5QVZPbmNqWG1OK0x2eQo5Q0I4NEFiY1A0U0NLV1pSQWd1NVhQdGlsUlNYbG9NTGxLUU52TWZ2QkpDWlhvcS9pVWZXcmxQOWp1dHQ2V0luCjdKUWxXUmRhdENYby9sWDZ0cFgydy8vMU1XZTN1R1lKcWNyUFlVN2c5N1NjdWJEZCtBanE4RSs2S0FqU3AzVnQKUTU5enpKenRFczNJaVBUU0szbXlrSVNXUWdlSEVUZ3F0cFJiaVdHOW0xdDBDc3FVRVBmMjhIayt4VHVVOWFBeQpZclVhbFkrSmxxc2hybUVLdUsxL2NMMU8zZU95aHRXT2R2SndYNThDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUF0eHp1alVIa3c1VmJyczFNcWl6Vkd2dk9sdVZSQgpzb1NPb3BuakZVdHkyYjV6OUltcHdDeEMwWmppNFVVdVdrMTJHZGxldlE0dTdvbmV5VytZR25qeDNRY1FGQ2plCmpTeU1uM2xsWnpFcVFyLzNpWDVBRUp4NFZDZ3lmNmtiVmdmbnp2aXVrWm83NjUwTCt0V0xiK2JNWllDZ0h1a3YKVi9SNlBxSGdzZDZiSlV4U1lMWElFamtCK0x5cXlSM2RvZDRDNUhpK2dRd0dsK0EyWVd4R0p0SDZVOExYVldYLwpKSDIvUXVIU09uUm9QeVV4MVduUDV6M1NHYWZyR1ZrbVJwTW56UWk3YjFFeTJMQVlENGhCRlJXZSt0bWR3NjRRCmJMbUYwRU85cVVKQjg2bE1LN2pvVUk2TFc5ajF6SWVUREZRN0ZZOUY2VEJiNmZoNVFNak1YdVhYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", + } + + fakeSecret := createNewSecret("azure-key-vault-env-injector", "akv2k8s", secretValue) + namespace := createNewNamespace("akv2k8s-test", true) + existingConfigMap := newConfigMap("akv2k8s-ca", namespace.Name, fakeSecret) + + f.secretLister = append(f.secretLister, fakeSecret) + f.namespaceLister = append(f.namespaceLister, namespace) + f.configMapLister = append(f.configMapLister, existingConfigMap) + + newNamespace := createNewNamespace("akv2k8s-test2", true) + f.namespaceLister = append(f.namespaceLister, newNamespace) + + cm := newConfigMap("akv2k8s-ca", newNamespace.Name, fakeSecret) + f.expectCreateConfigMapAction(cm) + + f.run(getKey(fakeSecret, t), "") +} + +func TestRemovesConfigMapInNamespaceWithoutLabel(t *testing.T) { + t.Skip("Not finished") + f := newFixture(t) + + secretValue := map[string]string{ + "caCert": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRSmFUeUxENnVPM0lYOERKZlZhZ1NtekFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwemRtTXRZMkYwTFdOaE1CNFhEVEl3TURNeE9URTBOREV5T1ZvWERUTXdNRE14TnpFMApOREV5T1Zvd0ZURVRNQkVHQTFVRUF4TUtjM1pqTFdOaGRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVFFdFRZUG5FSnFoMXc4NFI5MWV0Nng1MFB3NEVZNFpjOUhHRW5KRW1UdEVSOVUKTG44MGg3MUwwdnJUOXpUcTVhZFlsOWRhaDB5T2JJUU1aMU5VYmdPanQvczJnUHNRaFU5QVZPbmNqWG1OK0x2eQo5Q0I4NEFiY1A0U0NLV1pSQWd1NVhQdGlsUlNYbG9NTGxLUU52TWZ2QkpDWlhvcS9pVWZXcmxQOWp1dHQ2V0luCjdKUWxXUmRhdENYby9sWDZ0cFgydy8vMU1XZTN1R1lKcWNyUFlVN2c5N1NjdWJEZCtBanE4RSs2S0FqU3AzVnQKUTU5enpKenRFczNJaVBUU0szbXlrSVNXUWdlSEVUZ3F0cFJiaVdHOW0xdDBDc3FVRVBmMjhIayt4VHVVOWFBeQpZclVhbFkrSmxxc2hybUVLdUsxL2NMMU8zZU95aHRXT2R2SndYNThDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUF0eHp1alVIa3c1VmJyczFNcWl6Vkd2dk9sdVZSQgpzb1NPb3BuakZVdHkyYjV6OUltcHdDeEMwWmppNFVVdVdrMTJHZGxldlE0dTdvbmV5VytZR25qeDNRY1FGQ2plCmpTeU1uM2xsWnpFcVFyLzNpWDVBRUp4NFZDZ3lmNmtiVmdmbnp2aXVrWm83NjUwTCt0V0xiK2JNWllDZ0h1a3YKVi9SNlBxSGdzZDZiSlV4U1lMWElFamtCK0x5cXlSM2RvZDRDNUhpK2dRd0dsK0EyWVd4R0p0SDZVOExYVldYLwpKSDIvUXVIU09uUm9QeVV4MVduUDV6M1NHYWZyR1ZrbVJwTW56UWk3YjFFeTJMQVlENGhCRlJXZSt0bWR3NjRRCmJMbUYwRU85cVVKQjg2bE1LN2pvVUk2TFc5ajF6SWVUREZRN0ZZOUY2VEJiNmZoNVFNak1YdVhYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", + } + + fakeSecret := createNewSecret("azure-key-vault-env-injector", "akv2k8s", secretValue) + namespace := createNewNamespace("akv2k8s-test", false) + existingConfigMap := newConfigMap("akv2k8s-ca", namespace.Name, fakeSecret) + + f.secretLister = append(f.secretLister, fakeSecret) + f.namespaceLister = append(f.namespaceLister, namespace) + f.configMapLister = append(f.configMapLister, existingConfigMap) + + f.kubeobjects = append(f.kubeobjects, existingConfigMap) + + f.expectRemoveConfigMapAction(existingConfigMap) + + f.run("", getKey(namespace, t)) +} diff --git a/pkg/akv2k8s/controller/clock.go b/pkg/akv2k8s/controller/clock.go new file mode 100644 index 00000000..2c0927ad --- /dev/null +++ b/pkg/akv2k8s/controller/clock.go @@ -0,0 +1,38 @@ +/* +Copyright Sparebanken Vest + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// Timer is a simple interface for time handling +type Timer interface { + Now() metav1.Time +} + +// Clock is a simple Time impl +type Clock struct { +} + +// Now returns current time +func (t *Clock) Now() metav1.Time { + now := time.Now() + return metav1.Time{Time: now} +} diff --git a/pkg/azure/credential.go b/pkg/azure/credential.go new file mode 100644 index 00000000..e593e7c3 --- /dev/null +++ b/pkg/azure/credential.go @@ -0,0 +1,414 @@ +// Copyright © 2019 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go) + +package azure + +import ( + "crypto/rsa" + "crypto/x509" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "regexp" + "strings" + + "golang.org/x/crypto/pkcs12" + + "github.com/Azure/go-autorest/autorest" + "github.com/Azure/go-autorest/autorest/adal" + "github.com/Azure/go-autorest/autorest/azure" + docker "github.com/containers/image/v5/types" + "github.com/spf13/pflag" + + azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" + "k8s.io/legacy-cloud-providers/azure/auth" + "sigs.k8s.io/yaml" +) + +var flagConfigFile = pflag.String("azure-container-registry-config", "", + "Path to the file containing Azure container registry configuration information.") + +const ( + maxReadLength = 10 * 1 << 20 // 10MB +) + +var ( + containerRegistryUrls = []string{"*.azurecr.io", "*.azurecr.cn", "*.azurecr.de", "*.azurecr.us"} + acrRE = regexp.MustCompile(`.*\.azurecr\.io|.*\.azurecr\.cn|.*\.azurecr\.de|.*\.azurecr\.us`) +) + +// DockerConfig contains credentials used to access Docker regestries +type DockerConfig map[string]docker.DockerAuthConfig + +// CloudConfigProvider provides credentials for Azure +type CloudConfigProvider struct { + file *string + config *auth.AzureAuthConfig + environment *azure.Environment + servicePrincipalToken *adal.ServicePrincipalToken +} + +// Credentials has credentials needed to authenticate with azure key vault. +// These credentials will never expire +type Credentials interface { + Endpoint(name string) string + Authorizer() (autorest.Authorizer, error) +} + +type credentials struct { + Token *adal.ServicePrincipalToken + EndpointPartial string +} + +// OAuthCredentials has credentials need to authenticate with azure. +// These credentials expires when the oauth token expire (default one our in Azure). Use the +// Credentials interface if you want tokens to refresh. +type OAuthCredentials struct { + OAuthToken string `json:"oauth_token"` + EndpointPartial string `json:"endpoint_partial"` +} + +type crendentialsToken struct { + token string +} + +// NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider +func NewFromCloudConfig(configFile *string) *CloudConfigProvider { + token, config, env, err := getServicePrincipalTokenFromCloudConfig(configFile) + + if err != nil { + + } + return &CloudConfigProvider{ + file: configFile, + config: config, + environment: env, + servicePrincipalToken: token, + } +} + +// NewFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault +func NewFromServicePrincipalToken(token *adal.ServicePrincipalToken) (Credentials, error) { + resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + + return &credentials{ + Token: token, + EndpointPartial: endpoint, + }, nil +} + +// GetCredentials will get Azure credentials +func (c CloudConfigProvider) GetCredentials() (Credentials, error) { + resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + + return &credentials{ + Token: c.servicePrincipalToken, + EndpointPartial: endpoint, + }, nil +} + +// GetAcrCredentials will get Docker credentials for Azure Container Registry +func (c CloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, error) { + cfg := DockerConfig{} + + if c.config.UseManagedIdentityExtension { + if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { + } else { + if cred, err := getACRDockerEntryFromARMToken(c.config, c.servicePrincipalToken, loginServer); err == nil { + cfg[loginServer] = *cred + } + } + } else { + // Add our entry for each of the supported container registry URLs + for _, url := range containerRegistryUrls { + cred := &docker.DockerAuthConfig{ + Username: c.config.AADClientID, + Password: c.config.AADClientSecret, + } + cfg[url] = *cred + } + + // Handle the custom cloud case + // In clouds where ACR is not yet deployed, the string will be empty + if c.environment != nil && strings.Contains(c.environment.ContainerRegistryDNSSuffix, ".azurecr.") { + customAcrSuffix := "*" + c.environment.ContainerRegistryDNSSuffix + hasBeenAdded := false + for _, url := range containerRegistryUrls { + if strings.EqualFold(url, customAcrSuffix) { + hasBeenAdded = true + break + } + } + + if !hasBeenAdded { + cred := &docker.DockerAuthConfig{ + Username: c.config.AADClientID, + Password: c.config.AADClientSecret, + } + cfg[customAcrSuffix] = *cred + } + } + } + + // add ACR anonymous repo support: use empty username and password for anonymous access + cfg["*.azurecr.*"] = docker.DockerAuthConfig{ + Username: "", + Password: "", + } + return cfg, nil +} + +// NewFromEnvironment creates a credentials object based on available environment settings to use with Azure Key Vault +func NewFromEnvironment() (Credentials, error) { + authSettings, err := azureAuth.GetSettingsFromEnvironment() + if err != nil { + return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) + } + + resourceSplit := strings.SplitAfterN(authSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + + akvCreds := &credentials{ + EndpointPartial: endpoint, + } + + if creds, err := authSettings.GetClientCredentials(); err == nil { + creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint + creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault + + token, err := creds.ServicePrincipalToken() + if err != nil { + return nil, err + } + + akvCreds.Token = token + return akvCreds, nil + } + + if creds, err := authSettings.GetClientCertificate(); err == nil { + creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint + creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault + + token, err := creds.ServicePrincipalToken() + if err != nil { + return nil, err + } + akvCreds.Token = token + return akvCreds, nil + } + + if creds, err := authSettings.GetUsernamePassword(); err == nil { + creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint + creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault + + token, err := creds.ServicePrincipalToken() + if err != nil { + return nil, err + } + akvCreds.Token = token + return akvCreds, nil + } + + msi := authSettings.GetMSI() + msiEndpoint, err := adal.GetMSIVMEndpoint() + if err != nil { + return nil, err + } + + if msi.ClientID != "" { + token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, msi.Resource, msi.ClientID) + if err != nil { + return nil, err + } + akvCreds.Token = token + return akvCreds, nil + } + + token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, msi.Resource) + if err != nil { + return nil, err + } + akvCreds.Token = token + return akvCreds, nil +} + +// Authorizer gets an Authorizer from credentials +func (c credentials) Authorizer() (autorest.Authorizer, error) { + return createAuthorizerFromServicePrincipalToken(c.Token) +} + +// Endpoint takes the name of the keyvault and creates a correct andpoint url +func (c credentials) Endpoint(keyVaultName string) string { + return fmt.Sprintf(c.EndpointPartial, keyVaultName) +} + +// Endpoint takes the name of the keyvault and creates a correct andpoint url +func (c credentials) KeyVaultEndpoint(keyVaultName string) string { + return fmt.Sprintf(c.EndpointPartial, keyVaultName) +} + +func (t crendentialsToken) OAuthToken() string { + return t.token +} + +// MarshalJSON will get a fresh oauth token from the service principal token and serialize. +// This token will expire after the default oauth token lifetime for the service principal. +func (c credentials) MarshalJSON() ([]byte, error) { + err := c.Token.Refresh() + if err != nil { + return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err) + } + + return json.Marshal(&OAuthCredentials{ + OAuthToken: c.Token.OAuthToken(), + EndpointPartial: c.EndpointPartial, + }) +} + +// Authorizer gets an Authorizer from credentials +func (c OAuthCredentials) Authorizer() (autorest.Authorizer, error) { + return createAuthorizerFromOAuthToken(c.OAuthToken) +} + +// Endpoint takes the name of the keyvault and creates a correct andpoint url +func (c OAuthCredentials) Endpoint(keyVaultName string) string { + return fmt.Sprintf(c.EndpointPartial, keyVaultName) +} + +func getServicePrincipalTokenFromCloudConfig(cloudConfigPath *string) (*adal.ServicePrincipalToken, *auth.AzureAuthConfig, *azure.Environment, error) { + f, err := os.Open(*cloudConfigPath) + if err != nil { + return nil, nil, nil, err + } + defer f.Close() + + config, env, err := ParseConfig(f) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed reading cloud config, error: %+v", err) + } + + token, err := auth.GetServicePrincipalToken(config, env) + return token, config, env, err +} + +func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) { + err := token.Refresh() + if err != nil { + return nil, err + } + return createAuthorizerFromOAuthToken(token.OAuthToken()) +} + +func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) { + tokenProvider := crendentialsToken{token: token} + return autorest.NewBearerAuthorizer(tokenProvider), nil +} + +// ParseConfig returns a parsed configuration for an Azure cloudprovider config file +func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, *azure.Environment, error) { + var config auth.AzureAuthConfig + + if configReader == nil { + return &config, nil, nil + } + + limitedReader := &io.LimitedReader{R: configReader, N: maxReadLength} + configContents, err := ioutil.ReadAll(limitedReader) + if err != nil { + return nil, nil, err + } + if limitedReader.N <= 0 { + return nil, nil, errors.New("the read limit is reached") + } + err = yaml.Unmarshal(configContents, &config) + if err != nil { + return nil, nil, err + } + + environment, err := auth.ParseAzureEnvironment(config.Cloud) + if err != nil { + return nil, nil, err + } + + return &config, environment, nil +} + +func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { + // Run EnsureFresh to make sure the token is valid and does not expire + if err := token.EnsureFresh(); err != nil { + return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) + } + armAccessToken := token.OAuthToken() + + directive, err := receiveChallengeFromLoginServer(loginServer) + if err != nil { + return nil, fmt.Errorf("failed to receive challenge: %s", err) + } + + registryRefreshToken, err := performTokenExchange( + loginServer, directive, config.TenantID, armAccessToken) + if err != nil { + return nil, fmt.Errorf("failed to perform token exchange: %s", err) + } + + return &docker.DockerAuthConfig{ + Username: dockerTokenLoginUsernameGUID, + Password: registryRefreshToken, + }, nil +} + +// parseACRLoginServerFromImage takes image as parameter and returns login server of it. +// Parameter `image` is expected in following format: foo.azurecr.io/bar/imageName:version +// If the provided image is not an acr image, this function will return an empty string. +func parseACRLoginServerFromImage(image string, env *azure.Environment) string { + match := acrRE.FindAllString(image, -1) + if len(match) == 1 { + return match[0] + } + + // handle the custom cloud case + if env != nil { + cloudAcrSuffix := env.ContainerRegistryDNSSuffix + cloudAcrSuffixLength := len(cloudAcrSuffix) + if cloudAcrSuffixLength > 0 { + customAcrSuffixIndex := strings.Index(image, cloudAcrSuffix) + if customAcrSuffixIndex != -1 { + endIndex := customAcrSuffixIndex + cloudAcrSuffixLength + return image[0:endIndex] + } + } + } + + return "" +} + +func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) { + privateKey, certificate, err := pkcs12.Decode(pkcs, password) + if err != nil { + return nil, nil, fmt.Errorf("decoding the PKCS#12 client certificate: %v", err) + } + rsaPrivateKey, isRsaKey := privateKey.(*rsa.PrivateKey) + if !isRsaKey { + return nil, nil, fmt.Errorf("PKCS#12 certificate must contain a RSA private key") + } + + return certificate, rsaPrivateKey, nil +} diff --git a/pkg/azure/credential_helper.go b/pkg/azure/credential_helper.go new file mode 100644 index 00000000..12a2ad3f --- /dev/null +++ b/pkg/azure/credential_helper.go @@ -0,0 +1,283 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +Copyright 2017 Microsoft Corporation + +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE +*/ + +// Source: https://github.com/Azure/acr-docker-credential-helper/blob/a79b541f3ee761f6cc4511863ed41fb038c19464/src/docker-credential-acr/acr_login.go + +package azure + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "unicode" +) + +type authDirective struct { + service string + realm string +} + +type acrAuthResponse struct { + RefreshToken string `json:"refresh_token"` +} + +// 5 minutes buffer time to allow timeshift between local machine and AAD +const userAgentHeader = "User-Agent" +const userAgent = "kubernetes-credentialprovider-acr" + +const dockerTokenLoginUsernameGUID = "00000000-0000-0000-0000-000000000000" + +var client = &http.Client{} + +func receiveChallengeFromLoginServer(serverAddress string) (*authDirective, error) { + challengeURL := url.URL{ + Scheme: "https", + Host: serverAddress, + Path: "v2/", + } + var err error + var r *http.Request + r, err = http.NewRequest("GET", challengeURL.String(), nil) + if err != nil { + return nil, fmt.Errorf("failed to construct request, got %v", err) + } + r.Header.Add(userAgentHeader, userAgent) + + var challenge *http.Response + if challenge, err = client.Do(r); err != nil { + return nil, fmt.Errorf("error reaching registry endpoint %s, error: %s", challengeURL.String(), err) + } + defer challenge.Body.Close() + + if challenge.StatusCode != 401 { + return nil, fmt.Errorf("registry did not issue a valid AAD challenge, status: %d", challenge.StatusCode) + } + + var authHeader []string + var ok bool + if authHeader, ok = challenge.Header["Www-Authenticate"]; !ok { + return nil, fmt.Errorf("challenge response does not contain header 'Www-Authenticate'") + } + + if len(authHeader) != 1 { + return nil, fmt.Errorf("registry did not issue a valid AAD challenge, authenticate header [%s]", + strings.Join(authHeader, ", ")) + } + + authSections := strings.SplitN(authHeader[0], " ", 2) + authType := strings.ToLower(authSections[0]) + var authParams *map[string]string + if authParams, err = parseAssignments(authSections[1]); err != nil { + return nil, fmt.Errorf("unable to understand the contents of Www-Authenticate header %s", authSections[1]) + } + + // verify headers + if !strings.EqualFold("Bearer", authType) { + return nil, fmt.Errorf("Www-Authenticate: expected realm: Bearer, actual: %s", authType) + } + if len((*authParams)["service"]) == 0 { + return nil, fmt.Errorf("Www-Authenticate: missing header \"service\"") + } + if len((*authParams)["realm"]) == 0 { + return nil, fmt.Errorf("Www-Authenticate: missing header \"realm\"") + } + + return &authDirective{ + service: (*authParams)["service"], + realm: (*authParams)["realm"], + }, nil +} + +func performTokenExchange( + serverAddress string, + directive *authDirective, + tenant string, + accessToken string) (string, error) { + var err error + data := url.Values{ + "service": []string{directive.service}, + "grant_type": []string{"access_token_refresh_token"}, + "access_token": []string{accessToken}, + "refresh_token": []string{accessToken}, + "tenant": []string{tenant}, + } + + var realmURL *url.URL + if realmURL, err = url.Parse(directive.realm); err != nil { + return "", fmt.Errorf("Www-Authenticate: invalid realm %s", directive.realm) + } + authEndpoint := fmt.Sprintf("%s://%s/oauth2/exchange", realmURL.Scheme, realmURL.Host) + + datac := data.Encode() + var r *http.Request + r, err = http.NewRequest("POST", authEndpoint, bytes.NewBufferString(datac)) + if err != nil { + return "", fmt.Errorf("failed to construct request, got %v", err) + } + r.Header.Add(userAgentHeader, userAgent) + r.Header.Add("Content-Type", "application/x-www-form-urlencoded") + r.Header.Add("Content-Length", strconv.Itoa(len(datac))) + + var exchange *http.Response + if exchange, err = client.Do(r); err != nil { + return "", fmt.Errorf("Www-Authenticate: failed to reach auth url %s", authEndpoint) + } + + defer exchange.Body.Close() + if exchange.StatusCode != 200 { + return "", fmt.Errorf("Www-Authenticate: auth url %s responded with status code %d", authEndpoint, exchange.StatusCode) + } + + var content []byte + limitedReader := &io.LimitedReader{R: exchange.Body, N: maxReadLength} + if content, err = ioutil.ReadAll(limitedReader); err != nil { + return "", fmt.Errorf("Www-Authenticate: error reading response from %s", authEndpoint) + } + + if limitedReader.N <= 0 { + return "", errors.New("the read limit is reached") + } + + var authResp acrAuthResponse + if err = json.Unmarshal(content, &authResp); err != nil { + return "", fmt.Errorf("Www-Authenticate: unable to read response %s", content) + } + + return authResp.RefreshToken, nil +} + +// Try and parse a string of assignments in the form of: +// key1 = value1, key2 = "value 2", key3 = "" +// Note: this method and handle quotes but does not handle escaping of quotes +func parseAssignments(statements string) (*map[string]string, error) { + var cursor int + result := make(map[string]string) + var errorMsg = fmt.Errorf("malformed header value: %s", statements) + for { + // parse key + equalIndex := nextOccurrence(statements, cursor, "=") + if equalIndex == -1 { + return nil, errorMsg + } + key := strings.TrimSpace(statements[cursor:equalIndex]) + + // parse value + cursor = nextNoneSpace(statements, equalIndex+1) + if cursor == -1 { + return nil, errorMsg + } + // case: value is quoted + if statements[cursor] == '"' { + cursor = cursor + 1 + // like I said, not handling escapes, but this will skip any comma that's + // within the quotes which is somewhat more likely + closeQuoteIndex := nextOccurrence(statements, cursor, "\"") + if closeQuoteIndex == -1 { + return nil, errorMsg + } + value := statements[cursor:closeQuoteIndex] + result[key] = value + + commaIndex := nextNoneSpace(statements, closeQuoteIndex+1) + if commaIndex == -1 { + // no more comma, done + return &result, nil + } else if statements[commaIndex] != ',' { + // expect comma immediately after close quote + return nil, errorMsg + } else { + cursor = commaIndex + 1 + } + } else { + commaIndex := nextOccurrence(statements, cursor, ",") + endStatements := commaIndex == -1 + var untrimmed string + if endStatements { + untrimmed = statements[cursor:commaIndex] + } else { + untrimmed = statements[cursor:] + } + value := strings.TrimSpace(untrimmed) + + if len(value) == 0 { + // disallow empty value without quote + return nil, errorMsg + } + + result[key] = value + + if endStatements { + return &result, nil + } + cursor = commaIndex + 1 + } + } +} + +func nextOccurrence(str string, start int, sep string) int { + if start >= len(str) { + return -1 + } + offset := strings.Index(str[start:], sep) + if offset == -1 { + return -1 + } + return offset + start +} + +func nextNoneSpace(str string, start int) int { + if start >= len(str) { + return -1 + } + offset := strings.IndexFunc(str[start:], func(c rune) bool { return !unicode.IsSpace(c) }) + if offset == -1 { + return -1 + } + return offset + start +} diff --git a/pkg/azurekeyvault/client/authentication_test.go b/pkg/azure/credential_test.go similarity index 94% rename from pkg/azurekeyvault/client/authentication_test.go rename to pkg/azure/credential_test.go index 1fd1c743..b975c220 100644 --- a/pkg/azurekeyvault/client/authentication_test.go +++ b/pkg/azure/credential_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package azure import ( "os" @@ -69,12 +69,12 @@ func ensureIntegrationEnvironment(t *testing.T) { func TestAudience(t *testing.T) { ensureIntegrationEnvironment(t) - creds, err := NewAzureKeyVaultCredentialsFromEnvironment() + creds, err := NewFromEnvironment() if err != nil { t.Error(err) } - token := creds.(*azureKeyVaultCredentials).Token + token := creds.(*credentials).Token err = token.Refresh() if err != nil { t.Error(err) diff --git a/pkg/azurekeyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go similarity index 96% rename from pkg/azurekeyvault/client/azure_keyvault_service.go rename to pkg/azure/keyvault/client/azure_keyvault_service.go index 9cf0ec75..262b4564 100644 --- a/pkg/azurekeyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -23,6 +23,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" ) @@ -39,11 +40,11 @@ type Service interface { } type azureKeyVaultService struct { - credentials AzureKeyVaultCredentials + credentials azure.Credentials } // NewService creates a new AzureKeyVaultService -func NewService(credentials AzureKeyVaultCredentials) Service { +func NewService(credentials azure.Credentials) Service { return &azureKeyVaultService{ credentials: credentials, } diff --git a/pkg/azurekeyvault/client/certificate.go b/pkg/azure/keyvault/client/certificate.go similarity index 100% rename from pkg/azurekeyvault/client/certificate.go rename to pkg/azure/keyvault/client/certificate.go diff --git a/pkg/azurekeyvault/client/certificate_test.go b/pkg/azure/keyvault/client/certificate_test.go similarity index 100% rename from pkg/azurekeyvault/client/certificate_test.go rename to pkg/azure/keyvault/client/certificate_test.go diff --git a/pkg/azurekeyvault/client/authentication.go b/pkg/azurekeyvault/client/authentication.go deleted file mode 100644 index db8db884..00000000 --- a/pkg/azurekeyvault/client/authentication.go +++ /dev/null @@ -1,286 +0,0 @@ -package client - -import ( - "crypto/rsa" - "crypto/x509" - "encoding/json" - "fmt" - "io/ioutil" - "strings" - - "golang.org/x/crypto/pkcs12" - "gopkg.in/yaml.v2" - - "github.com/Azure/go-autorest/autorest" - "github.com/Azure/go-autorest/autorest/adal" - "github.com/Azure/go-autorest/autorest/azure" - azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" - cloudAuth "k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth" -) - -// AzureKeyVaultCredentials has credentials needed to authenticate with azure key vault. -// These credentials will never expire -type AzureKeyVaultCredentials interface { - Endpoint(keyVaultName string) string - Authorizer() (autorest.Authorizer, error) -} - -type azureKeyVaultCredentials struct { - Token *adal.ServicePrincipalToken - EndpointPartial string -} - -type azureKeyVaultToken struct { - token string -} - -// AzureKeyVaultOAuthCredentials has credentials need to authenticate with azure key vault. -// These credentials expires when the oauth token expire (default one our in Azure). Use the -// AzureKeyVaultCredentials interface if you want tokens to refresh. -type AzureKeyVaultOAuthCredentials struct { - OAuthToken string `json:"oauth_token"` - EndpointPartial string `json:"endpoint_partial"` -} - -// Authorizer gets an Authorizer from credentials -func (c azureKeyVaultCredentials) Authorizer() (autorest.Authorizer, error) { - return createAuthorizerFromServicePrincipalToken(c.Token) -} - -// Endpoint takes the name of the keyvault and creates a correct andpoint url -func (c azureKeyVaultCredentials) Endpoint(keyVaultName string) string { - return fmt.Sprintf(c.EndpointPartial, keyVaultName) -} - -// MarshalJSON will get a fresh oauth token from the service principal token and serialize. -// This token will expire after the default oauth token lifetime for the service principal. -func (c azureKeyVaultCredentials) MarshalJSON() ([]byte, error) { - err := c.Token.Refresh() - if err != nil { - return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err) - } - - return json.Marshal(&AzureKeyVaultOAuthCredentials{ - OAuthToken: c.Token.OAuthToken(), - EndpointPartial: c.EndpointPartial, - }) -} - -func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) { - err := token.Refresh() - if err != nil { - return nil, err - } - return createAuthorizerFromOAuthToken(token.OAuthToken()) -} - -func (t azureKeyVaultToken) OAuthToken() string { - return t.token -} - -func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) { - tokenProvider := azureKeyVaultToken{token: token} - return autorest.NewBearerAuthorizer(tokenProvider), nil -} - -// NewAzureKeyVaultCredentialsFromCloudConfig gets a credentials object from cloud config to use with Azure Key Vault -func NewAzureKeyVaultCredentialsFromCloudConfig(cloudConfigPath string) (AzureKeyVaultCredentials, error) { - authSettings, err := azureAuth.GetSettingsFromEnvironment() - if err != nil { - return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) - } - - token, err := getServicePrincipalTokenFromCloudConfig(cloudConfigPath, authSettings.Environment) - if err != nil { - return nil, fmt.Errorf("failed getting service principal token, err: %+v", err) - } - - resourceSplit := strings.SplitAfterN(authSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2) - endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - - return &azureKeyVaultCredentials{ - Token: token, - EndpointPartial: endpoint, - }, nil -} - -// NewAzureKeyVaultCredentialsFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault -func NewAzureKeyVaultCredentialsFromServicePrincipalToken(token *adal.ServicePrincipalToken) (AzureKeyVaultCredentials, error) { - resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2) - endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - - return &azureKeyVaultCredentials{ - Token: token, - EndpointPartial: endpoint, - }, nil -} - -// Authorizer gets an Authorizer from credentials -func (c AzureKeyVaultOAuthCredentials) Authorizer() (autorest.Authorizer, error) { - return createAuthorizerFromOAuthToken(c.OAuthToken) -} - -// Endpoint takes the name of the keyvault and creates a correct andpoint url -func (c AzureKeyVaultOAuthCredentials) Endpoint(keyVaultName string) string { - return fmt.Sprintf(c.EndpointPartial, keyVaultName) -} - -// NewAzureKeyVaultCredentialsFromEnvironment creates a credentials object based on available environment settings to use with Azure Key Vault -func NewAzureKeyVaultCredentialsFromEnvironment() (AzureKeyVaultCredentials, error) { - authSettings, err := azureAuth.GetSettingsFromEnvironment() - if err != nil { - return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) - } - - resourceSplit := strings.SplitAfterN(authSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2) - endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - - akvCreds := &azureKeyVaultCredentials{ - EndpointPartial: endpoint, - } - - if creds, err := authSettings.GetClientCredentials(); err == nil { - creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint - creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault - - token, err := creds.ServicePrincipalToken() - if err != nil { - return nil, err - } - - akvCreds.Token = token - return akvCreds, nil - } - - if creds, err := authSettings.GetClientCertificate(); err == nil { - creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint - creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault - - token, err := creds.ServicePrincipalToken() - if err != nil { - return nil, err - } - akvCreds.Token = token - return akvCreds, nil - } - - if creds, err := authSettings.GetUsernamePassword(); err == nil { - creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint - creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault - - token, err := creds.ServicePrincipalToken() - if err != nil { - return nil, err - } - akvCreds.Token = token - return akvCreds, nil - } - - msi := authSettings.GetMSI() - msiEndpoint, err := adal.GetMSIVMEndpoint() - if err != nil { - return nil, err - } - - if msi.ClientID != "" { - token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, msi.Resource, msi.ClientID) - if err != nil { - return nil, err - } - akvCreds.Token = token - return akvCreds, nil - } - - token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, msi.Resource) - if err != nil { - return nil, err - } - akvCreds.Token = token - return akvCreds, nil -} - -func getServicePrincipalTokenFromCloudConfig(cloudConfigPath string, env azure.Environment) (*adal.ServicePrincipalToken, error) { - config, err := readCloudConfig(cloudConfigPath) - if err != nil { - return nil, fmt.Errorf("failed reading cloud config, error: %+v", err) - } - - if config.UseManagedIdentityExtension { - // klog.V(2).Infoln("azure: using managed identity extension to retrieve access token") - msiEndpoint, err := adal.GetMSIVMEndpoint() - if err != nil { - return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) - } - - if len(config.UserAssignedIdentityID) > 0 { - // klog.V(4).Info("azure: using User Assigned MSI ID to retrieve access token") - return adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, - env.ResourceIdentifiers.KeyVault, - config.UserAssignedIdentityID) - } - // klog.V(4).Info("azure: using System Assigned MSI to retrieve access token") - return adal.NewServicePrincipalTokenFromMSI( - msiEndpoint, - env.ResourceIdentifiers.KeyVault) - } - - oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) - if err != nil { - return nil, fmt.Errorf("creating the OAuth config: %v", err) - } - - if len(config.AADClientSecret) > 0 { - // klog.V(2).Infoln("azure: using client_id+client_secret to retrieve access token") - return adal.NewServicePrincipalToken( - *oauthConfig, - config.AADClientID, - config.AADClientSecret, - env.ResourceIdentifiers.KeyVault) - } - - if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 { - // klog.V(2).Infoln("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") - certData, err := ioutil.ReadFile(config.AADClientCertPath) - if err != nil { - return nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) - } - certificate, privateKey, err := decodePkcs12(certData, config.AADClientCertPassword) - if err != nil { - return nil, fmt.Errorf("decoding the client certificate: %v", err) - } - return adal.NewServicePrincipalTokenFromCertificate( - *oauthConfig, - config.AADClientID, - certificate, - privateKey, - env.ResourceIdentifiers.KeyVault) - } - - return nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID) -} - -func readCloudConfig(path string) (*cloudAuth.AzureAuthConfig, error) { - bytes, err := ioutil.ReadFile(path) - if err != nil { - return nil, fmt.Errorf("failed to read cloud config file in an effort to get credentials for azure key vault, error: %+v", err) - } - - azureConfig := cloudAuth.AzureAuthConfig{} - if err = yaml.Unmarshal(bytes, &azureConfig); err != nil { - return nil, fmt.Errorf("Unmarshall error: %v", err) - } - return &azureConfig, nil -} - -func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) { - privateKey, certificate, err := pkcs12.Decode(pkcs, password) - if err != nil { - return nil, nil, fmt.Errorf("decoding the PKCS#12 client certificate: %v", err) - } - rsaPrivateKey, isRsaKey := privateKey.(*rsa.PrivateKey) - if !isRsaKey { - return nil, nil, fmt.Errorf("PKCS#12 certificate must contain a RSA private key") - } - - return certificate, rsaPrivateKey, nil -} diff --git a/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go index 78d54d89..e3668785 100644 --- a/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go +++ b/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go @@ -130,7 +130,7 @@ func (in *AzureKeyVaultSecret) DeepCopyObject() runtime.Object { func (in *AzureKeyVaultSecretList) DeepCopyInto(out *AzureKeyVaultSecretList) { *out = *in out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items *out = make([]AzureKeyVaultSecret, len(*in)) diff --git a/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go index 7e9e68c7..40bc74b4 100644 --- a/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go @@ -130,7 +130,7 @@ func (in *AzureKeyVaultSecret) DeepCopyObject() runtime.Object { func (in *AzureKeyVaultSecretList) DeepCopyInto(out *AzureKeyVaultSecretList) { *out = *in out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items *out = make([]AzureKeyVaultSecret, len(*in)) diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index d6177856..59aa523e 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -22,6 +22,8 @@ limitations under the License. package versioned import ( + "fmt" + azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" discovery "k8s.io/client-go/discovery" @@ -33,8 +35,6 @@ type Interface interface { Discovery() discovery.DiscoveryInterface AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface - // Deprecated: please explicitly pick a version if possible. - Azurekeyvault() azurekeyvaultv1.AzurekeyvaultV1Interface } // Clientset contains the clients for groups. Each group has exactly one @@ -55,12 +55,6 @@ func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface { return c.azurekeyvaultV1 } -// Deprecated: Azurekeyvault retrieves the default version of AzurekeyvaultClient. -// Please explicitly pick a version. -func (c *Clientset) Azurekeyvault() azurekeyvaultv1.AzurekeyvaultV1Interface { - return c.azurekeyvaultV1 -} - // Discovery retrieves the DiscoveryClient func (c *Clientset) Discovery() discovery.DiscoveryInterface { if c == nil { @@ -70,9 +64,14 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { } // NewForConfig creates a new Clientset for the given config. +// If config's RateLimiter is not set and QPS and Burst are acceptable, +// NewForConfig will generate a rate-limiter in configShallowCopy. func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + if configShallowCopy.Burst <= 0 { + return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") + } configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) } var cs Clientset diff --git a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go index d2d7da3e..481c4806 100644 --- a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go +++ b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go @@ -46,7 +46,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - cs := &Clientset{} + cs := &Clientset{tracker: o} cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} cs.AddReactor("*", "*", testing.ObjectReaction(o)) cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { @@ -68,12 +68,17 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { type Clientset struct { testing.Fake discovery *fakediscovery.FakeDiscovery + tracker testing.ObjectTracker } func (c *Clientset) Discovery() discovery.DiscoveryInterface { return c.discovery } +func (c *Clientset) Tracker() testing.ObjectTracker { + return c.tracker +} + var _ clientset.Interface = &Clientset{} // AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client @@ -85,8 +90,3 @@ func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface { return &fakeazurekeyvaultv1.FakeAzurekeyvaultV1{Fake: &c.Fake} } - -// Azurekeyvault retrieves the AzurekeyvaultV1Client -func (c *Clientset) Azurekeyvault() azurekeyvaultv1.AzurekeyvaultV1Interface { - return &fakeazurekeyvaultv1.FakeAzurekeyvaultV1{Fake: &c.Fake} -} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go index 50247754..66dbaebc 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go @@ -24,7 +24,6 @@ package v1 import ( v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" rest "k8s.io/client-go/rest" ) @@ -74,7 +73,7 @@ func setConfigDefaults(config *rest.Config) error { gv := v1.SchemeGroupVersion config.GroupVersion = &gv config.APIPath = "/apis" - config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() if config.UserAgent == "" { config.UserAgent = rest.DefaultKubernetesUserAgent() diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go index e41246c3..d3776aa3 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go @@ -24,7 +24,6 @@ package v1alpha1 import ( v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" rest "k8s.io/client-go/rest" ) @@ -74,7 +73,7 @@ func setConfigDefaults(config *rest.Config) error { gv := v1alpha1.SchemeGroupVersion config.GroupVersion = &gv config.APIPath = "/apis" - config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() if config.UserAgent == "" { config.UserAgent = rest.DefaultKubernetesUserAgent() From 7958bf94999ca8b5217a19e346dc6f21699efec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 24 Aug 2020 19:01:24 +0200 Subject: [PATCH 011/251] Included ca-bundle-controller in build and push --- Makefile | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 7c1923dd..68c9f3d4 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,19 @@ fmt: fmtcheck: $(CURDIR)/scripts/gofmtcheck.sh +codegen: + @echo "Making sure code-generator has correct version of Kubernetes ($(KUBERNETES_DEP_VERSION))" + @echo "" + rm -rf ${GOPATH}/src/k8s.io/code-generator + git clone --depth 1 --branch $(KUBERNETES_DEP_VERSION) git@github.com:kubernetes/code-generator.git ${GOPATH}/src/k8s.io/code-generator + ./hack/update-codegen.sh + +test: fmtcheck + CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/) + +build-local: fmtcheck + CGO_ENABLED=0 go build -v $(shell go list ./...) + build: build-controller build-ca-bundle-controller build-webhook build-vaultenv build-controller: @@ -52,24 +65,14 @@ build-vaultenv: build-akv2k8s-env-test: docker build . -t $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) -f images/akv2k8s-test/Dockerfile -test: fmtcheck - CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/) - -build-local: fmtcheck - CGO_ENABLED=0 go build -v $(shell go list ./...) - -codegen: - @echo "Making sure code-generator has correct version of Kubernetes ($(KUBERNETES_DEP_VERSION))" - @echo "" - rm -rf ${GOPATH}/src/k8s.io/code-generator - git clone --depth 1 --branch $(KUBERNETES_DEP_VERSION) git@github.com:kubernetes/code-generator.git ${GOPATH}/src/k8s.io/code-generator - ./hack/update-codegen.sh - -push: push-controller push-webhook push-vaultenv +push: push-controller push-ca-bundle-controller push-webhook push-vaultenv push-controller: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) +push-ca-bundle-controller: + docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) + push-webhook: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) @@ -89,11 +92,12 @@ push-akv2k8s-env-test: pull-release: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) + docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) # docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) -release: release-controller release-webhook release-vaultenv +release: release-controller release-ca-bundle-controller release-webhook release-vaultenv release-controller: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) @@ -102,6 +106,13 @@ release-controller: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest +release-ca-bundle-controller: + docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) + docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest + + docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) + docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest + release-webhook: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest From d901739cb3c3c4e691e1871cf8d50944dd4c4248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 24 Aug 2020 19:23:51 +0200 Subject: [PATCH 012/251] Skip unpolished test --- pkg/akv2k8s/controller/cabundleinjector/controller_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller_test.go b/pkg/akv2k8s/controller/cabundleinjector/controller_test.go index cbe246bc..476b984b 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller_test.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller_test.go @@ -276,6 +276,7 @@ func TestCreatesConfigMap(t *testing.T) { } func TestCreatesConfigMapInNewNamespace(t *testing.T) { + t.Skip("Not finished") f := newFixture(t) secretValue := map[string]string{ From 6e48324ff49999017929210b16da4e139fb6bdc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 24 Aug 2020 20:13:48 +0200 Subject: [PATCH 013/251] Removed publishing of dev builds to public repo --- .github/workflows/build-push.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-push.yaml b/.github/workflows/build-push.yaml index 939edd32..357f3d66 100644 --- a/.github/workflows/build-push.yaml +++ b/.github/workflows/build-push.yaml @@ -68,10 +68,10 @@ jobs: # kubectl apply -R -f ./int-tests/ - - name: Push images to public repo - run: | - docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}} - make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/} + # - name: Push images to public repo + # run: | + # docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}} + # make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/} - name: Push images to private repo run: | From bbca5f18b2b39c3b1e1c5a136b4d147aa75bebca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 24 Aug 2020 21:07:44 +0200 Subject: [PATCH 014/251] Added informer factory for akv2k8s namespace --- cmd/ca-bundle-controller/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/ca-bundle-controller/main.go b/cmd/ca-bundle-controller/main.go index a49a359e..58509b15 100644 --- a/cmd/ca-bundle-controller/main.go +++ b/cmd/ca-bundle-controller/main.go @@ -100,6 +100,7 @@ func main() { } kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30) + kubeNsInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, time.Second*30, kubeinformers.WithNamespace(akvNamespace)) log.Info("Creating event broadcaster") eventBroadcaster := record.NewBroadcaster() @@ -108,11 +109,12 @@ func main() { // recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) - controller := cabundleinjector.NewController(kubeClient, kubeInformerFactory.Core().V1().Secrets(), kubeInformerFactory.Core().V1().Namespaces(), kubeInformerFactory.Core().V1().ConfigMaps(), akvLabelName, akvNamespace, akvSecretName, caConfigMapName) + controller := cabundleinjector.NewController(kubeClient, kubeNsInformerFactory.Core().V1().Secrets(), kubeInformerFactory.Core().V1().Namespaces(), kubeInformerFactory.Core().V1().ConfigMaps(), akvLabelName, akvNamespace, akvSecretName, caConfigMapName) // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) // Start method is non-blocking and runs all registered informers in a dedicated goroutine. kubeInformerFactory.Start(stopCh) + kubeNsInformerFactory.Start(stopCh) if err = controller.Run(2, stopCh); err != nil { log.Fatalf("Error running controller: %s", err.Error()) From 193d66f0ea70aeb4e6505ead9ec15038a68774e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 24 Aug 2020 21:36:51 +0200 Subject: [PATCH 015/251] Log error an mutation failures --- cmd/azure-keyvault-secrets-webhook/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index dec10846..8d02af0d 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -126,6 +126,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { err := mutatePodSpec(pod) if err != nil { + log.Errorf("failed to mutate pod, error: %+v", err) podsMutatedFailedCounter.Inc() } From dbd6c709390946a19462d39a3af30a44787ac7d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 24 Aug 2020 23:53:09 +0200 Subject: [PATCH 016/251] more verbose logging --- cmd/azure-keyvault-secrets-webhook/main.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 8d02af0d..bb999abe 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -44,11 +44,12 @@ import ( ) const ( - dockerHubHost = "index.docker.io" - oldDockerHubHost = "docker.io" - injectorDir = "/azure-keyvault/" - injectorExecutable = "azure-keyvault-env" - clientCertDir = "/client-cert/" + dockerHubHost = "index.docker.io" + oldDockerHubHost = "docker.io" + injectorDir = "/azure-keyvault/" + injectorExecutable = "azure-keyvault-env" + clientCertDir = "/client-cert/" + initContainerVolumeName = "azure-keyvault-env" ) type azureKeyVaultConfig struct { @@ -123,8 +124,8 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { } podsInspectedCounter.Inc() - err := mutatePodSpec(pod) + err := mutatePodSpec(pod) if err != nil { log.Errorf("failed to mutate pod, error: %+v", err) podsMutatedFailedCounter.Inc() From 195c85e35a452b5470d36f3002d96e2807b165b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 00:43:24 +0200 Subject: [PATCH 017/251] Fixed configmap key name for ca cert --- cmd/azure-keyvault-secrets-webhook/pod.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index fae2d0b1..f2234a1c 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -49,7 +49,7 @@ func getInitContainers() []corev1.Container { Command: []string{"sh", "-c", cmd}, VolumeMounts: []corev1.VolumeMount{ { - Name: "azure-keyvault-env", + Name: initContainerVolumeName, MountPath: injectorDir, }, }, @@ -120,8 +120,6 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock if ok { log.Infof("found credentials to use with registry '%s'", registryName) } else { - log.Infof("did not find credentials to use with registry '%s' - getting default credentials", registryName) - // todo: acr is azure specific regCred, ok = getAcrCredentials(registryName, container.Image) } @@ -146,17 +144,22 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock if err != nil { return false, false, fmt.Errorf("failed to sign command args, error: %+v", err) } + log.Debug("signed arguments to prevent override") publicSigningKey, err := exportRsaPublicKey(pubKey) if err != nil { return false, false, fmt.Errorf("failed to export public rsa key to pem, error: %+v", err) } + log.Debugf("public signing key for argument verification: \n%s", publicSigningKey) + mutated = true fullExecPath := filepath.Join(injectorDir, injectorExecutable) + log.Debugf("full exec path: %s", fullExecPath) container.Command = []string{fullExecPath} container.Args = autoArgs + log.Debugf("container args: %+v", autoArgs) container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{ { @@ -165,6 +168,7 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock ReadOnly: true, }, }...) + log.Debugf("mounting volume '%s' to '%s'", "azure-keyvault-env", injectorDir) container.Env = append(container.Env, []corev1.EnvVar{ { @@ -187,6 +191,7 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock // Do not add env var for using auth service if already exists if config.useAuthService && !containerOverrideAuthService { + log.Debug("configure init-container to use auth service") container.Env = append(container.Env, []corev1.EnvVar{ { Name: "ENV_INJECTOR_USE_AUTH_SERVICE", @@ -208,7 +213,7 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock LocalObjectReference: corev1.LocalObjectReference{ Name: config.caBundleConfigMapName, }, - Key: "akv2k8s-ca", + Key: "caCert", }, }, }, From 09ac42d5d4afb7e23b189838e849a33ddb43ee64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 00:59:39 +0200 Subject: [PATCH 018/251] Fixed configmap to use data instead of binary data --- pkg/akv2k8s/controller/cabundleinjector/controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index 6fa66578..b185199a 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -538,8 +538,8 @@ func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigM }), }, }, - BinaryData: map[string][]byte{ - "caCert": dataByte, + Data: map[string]string{ + "caCert": string(dataByte), }, } } From f66d847d0ac042941349e009a585bed05f131c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 16:04:50 +0200 Subject: [PATCH 019/251] Output current active settings when webhook starts --- cmd/azure-keyvault-secrets-webhook/main.go | 60 ++++++++++++------- .../registry.go | 4 +- .../registry_test.go | 2 - 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index bb999abe..e5ae47a9 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -57,7 +57,6 @@ type azureKeyVaultConfig struct { customAuth bool namespace string aadPodBindingLabel string - dockerPullTimeout int cloudConfigHostPath string serveMetrics bool metricsPort string @@ -80,16 +79,12 @@ var ( Name: "akv2k8s_pod_mutations_total", Help: "The total number of pods mutated", }) -) -var ( podsInspectedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "akv2k8s_pod_inspections_total", Help: "The total number of pods inspected, including mutated", }) -) -var ( podsMutatedFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "akv2k8s_pod_mutations_failed_total", Help: "The total number of attempted pod mutations that failed", @@ -134,17 +129,6 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { return false, err } -func initConfig() { - viper.SetDefault("azurekeyvault_env_image", "spvest/azure-keyvault-env:latest") - viper.SetDefault("custom_docker_pull_timeout", 20) - viper.SetDefault("use_auth_service", true) - viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json") - viper.SetDefault("metrics_port", "80") - viper.SetDefault("port", "443") - - viper.AutomaticEnv() -} - func handlerFor(config mutating.WebhookConfig, mutator mutating.MutatorFunc, recorder metrics.Recorder, logger internalLog.Logger) http.Handler { webhook, err := mutating.NewWebhook(config, mutator, nil, nil, logger) if err != nil { @@ -207,6 +191,19 @@ func healthHandler(w http.ResponseWriter, r *http.Request) { } } +func initConfig() { + viper.SetDefault("ca_config_map_name", "akv2k8s-ca") + viper.SetDefault("azurekeyvault_env_image", "spvest/azure-keyvault-env:latest") + viper.SetDefault("custom_docker_pull_timeout", 20) + viper.SetDefault("use_auth_service", true) + viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json") + viper.SetDefault("metrics_enabled", false) + viper.SetDefault("metrics_port", "80") + viper.SetDefault("port", "443") + + viper.AutomaticEnv() +} + func main() { fmt.Fprintln(os.Stdout, "initializing config...") initConfig() @@ -218,7 +215,6 @@ func main() { config = azureKeyVaultConfig{ port: viper.GetString("port"), customAuth: viper.GetBool("custom_auth"), - dockerPullTimeout: viper.GetInt("custom_docker_pull_timeout"), serveMetrics: viper.GetBool("metrics_enabled"), metricsPort: viper.GetString("metrics_port"), certFile: viper.GetString("tls_cert_file"), @@ -231,6 +227,21 @@ func main() { cloudConfigHostPath: viper.GetString("cloud_config_host_path"), } + log.Info("Active settings:") + log.Infof("Webhook port : %s", config.port) + log.Infof("Serve metrics : %s", config.serveMetrics) + if config.serveMetrics { + log.Infof("Metrics port : %s", config.metricsPort) + } + log.Infof("Use custom auth : %s", config.customAuth) + log.Infof("Use auth service : %s", config.useAuthService) + if config.useAuthService { + log.Infof("Auth service name : %s", config.authServiceName) + log.Infof("Auth service port :%s", config.authServicePort) + } + log.Infof("CA ConfigMap name : %s", config.caBundleConfigMapName) + log.Infof("Cloud config path : %s", config.cloudConfigHostPath) + mutator := mutating.MutatorFunc(vaultSecretsMutator) metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer) @@ -261,26 +272,31 @@ func main() { log.Fatalf("Error building kubernetes clientset: %s", err.Error()) } - log.Infof("Serving unencrypted traffic at http://:%s", config.metricsPort) - httpMux := http.NewServeMux() if config.serveMetrics { httpMux.Handle("/metrics", promhttp.Handler()) + } httpMux.HandleFunc("/healthz", healthHandler) go func() { - err := http.ListenAndServe(fmt.Sprintf(":%s", config.metricsPort), httpMux) + metricsURL := fmt.Sprintf(":%s", config.metricsPort) + log.Infof("Serving metrics at %s", metricsURL) + + err := http.ListenAndServe(metricsURL, httpMux) if err != nil { - log.Fatalf("error serving on port %s: %s", config.metricsPort, err) + log.Fatalf("error serving metrics at %s: %+v", metricsURL, err) } }() router := mux.NewRouter() router.Handle("/pods", podHandler) - router.HandleFunc("/auth/{namespace}/{pod}", authHandler) router.HandleFunc("/healthz", healthHandler) + if config.useAuthService { + router.HandleFunc("/auth/{namespace}/{pod}", authHandler) + } + log.Infof("Serving TLS encrypted traffic at https://:%s", config.port) err = http.ListenAndServeTLS(fmt.Sprintf(":%s", config.port), config.certFile, config.keyFile, router) if err != nil { diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 630279b3..0641c2bf 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -72,8 +72,8 @@ type imageOptions struct { } func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { - log.Infof("timeout: %v", config.dockerPullTimeout) - timeout := time.Duration(config.dockerPullTimeout) * time.Second + log.Debugf("docker image inspection timeout: %v seconds", 20) + timeout := time.Duration(20) * time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() diff --git a/cmd/azure-keyvault-secrets-webhook/registry_test.go b/cmd/azure-keyvault-secrets-webhook/registry_test.go index 8adc2f26..aca68dd5 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry_test.go +++ b/cmd/azure-keyvault-secrets-webhook/registry_test.go @@ -10,8 +10,6 @@ import ( ) func TestDockerPull(t *testing.T) { - config.dockerPullTimeout = 120 - opts := imageOptions{ image: "openjdk:slim", credentials: types.DockerAuthConfig{}, From 36168abf57a5acdb4823b5b91a07a1f2de9b9ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 16:18:03 +0200 Subject: [PATCH 020/251] Fixed format output for bool values --- cmd/azure-keyvault-secrets-webhook/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index e5ae47a9..83d5e821 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -229,12 +229,12 @@ func main() { log.Info("Active settings:") log.Infof("Webhook port : %s", config.port) - log.Infof("Serve metrics : %s", config.serveMetrics) + log.Infof("Serve metrics : %t", config.serveMetrics) if config.serveMetrics { log.Infof("Metrics port : %s", config.metricsPort) } - log.Infof("Use custom auth : %s", config.customAuth) - log.Infof("Use auth service : %s", config.useAuthService) + log.Infof("Use custom auth : %t", config.customAuth) + log.Infof("Use auth service : %t", config.useAuthService) if config.useAuthService { log.Infof("Auth service name : %s", config.authServiceName) log.Infof("Auth service port :%s", config.authServicePort) From 880e87ff198cddbe5fdd9831c1f14b715f231fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 16:47:08 +0200 Subject: [PATCH 021/251] Added build action and individual builds per component --- .github/actions/build.yaml | 29 ++++++ .github/workflows/build-push.yaml | 134 +++++++++++++-------------- .github/workflows/build-webhook.yaml | 26 ++++++ 3 files changed, 122 insertions(+), 67 deletions(-) create mode 100644 .github/actions/build.yaml create mode 100644 .github/workflows/build-webhook.yaml diff --git a/.github/actions/build.yaml b/.github/actions/build.yaml new file mode 100644 index 00000000..dd514173 --- /dev/null +++ b/.github/actions/build.yaml @@ -0,0 +1,29 @@ +name: 'Hello World' +description: 'Greet someone' +inputs: + build-make-action: # id of input + description: 'Action in makefile to build package' + required: true + push-make-action: # id of input + description: 'Action in makefile to push package to docker repo' + required: true + +runs: + using: "composite" + steps: + - name: Setup Golang + uses: actions/setup-go@v1 + with: + go-version: '1.13.4' + + - name: Test + run: make test + + - name: Build docker image + run: make ${{ inputs.build-make-action }} + + - name: Push images to private repo + run: | + docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io + make ${{ inputs.push-make-action }} + \ No newline at end of file diff --git a/.github/workflows/build-push.yaml b/.github/workflows/build-push.yaml index 357f3d66..be630081 100644 --- a/.github/workflows/build-push.yaml +++ b/.github/workflows/build-push.yaml @@ -1,80 +1,80 @@ -name: build +# name: build -on: - push: - branches: - - master - paths: - - '.github/workflows/**' - - 'Makefile' - - 'go.mod' - - 'go.sum' - - 'cmd/**' - - 'pkg/**' - - '!docs/**' +# on: +# push: +# branches: +# - master +# paths: +# - '.github/workflows/**' +# - 'Makefile' +# - 'go.mod' +# - 'go.sum' +# - 'cmd/**' +# - 'pkg/**' +# - '!docs/**' -jobs: - build-deploy: - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@master +# jobs: +# build-deploy: +# runs-on: ubuntu-18.04 +# steps: +# - uses: actions/checkout@master - - name: Setup Golang - uses: actions/setup-go@v1 - with: - go-version: '1.13.4' +# - name: Setup Golang +# uses: actions/setup-go@v1 +# with: +# go-version: '1.13.4' - - name: Test - run: make test +# - name: Test +# run: make test - - name: Build docker images - run: make build +# - name: Build docker images +# run: make build - # - name: Setup Kind - # uses: engineerd/setup-kind@v0.3.0 - # with: - # image: "kindest/node:v1.13.7" +# # - name: Setup Kind +# # uses: engineerd/setup-kind@v0.3.0 +# # with: +# # image: "kindest/node:v1.13.7" - # - name: Load images into Kind - # run: | - # kind load docker-image dokken.azurecr.io/azure-keyvault-webhook:${GITHUB_REF##*/} - # kind load docker-image dokken.azurecr.io/azure-keyvault-env:${GITHUB_REF##*/} +# # - name: Load images into Kind +# # run: | +# # kind load docker-image dokken.azurecr.io/azure-keyvault-webhook:${GITHUB_REF##*/} +# # kind load docker-image dokken.azurecr.io/azure-keyvault-env:${GITHUB_REF##*/} - # - name: Deploy to Kubernetes cluster - # run: | - # kubectl create ns akv2k8s - # HELM_V3=3.0.2 - # echo "downloading helm ${HELM_V3}" - # curl -sSL https://get.helm.sh/helm-v${HELM_V3}-linux-amd64.tar.gz | tar xz - # ./linux-amd64/helm version - # ./linux-amd64/helm repo add spv-charts http://charts.spvapi.no - # ./linux-amd64/helm repo update - # ./linux-amd64/helm upgrade --install azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ - # --namespace akv2k8s \ - # --set keyVault.customAuth.enabled=true \ - # --set env.AZURE_TENANT_ID=${{secrets.AKV_TEST_TENANT_ID}} \ - # --set env.AZURE_CLIENT_ID=${{secrets.AKV_TEST_CLIENT_ID}} \ - # --set env.AZURE_CLIENT_SECRET=${{secrets.AKV_TEST_CLIENT_SECRET}} \ - # --set installCrd=true \ - # --set envImage.repository=dokken.azurecr.io/azure-keyvault-env \ - # --set envImage.tag=${GITHUB_REF##*/} \ - # --set image.repository=dokken.azurecr.io/azure-keyvault-webhook \ - # --set image.tag=${GITHUB_REF##*/} \ - # --version 1.1.0-beta.19 \ - # --wait +# # - name: Deploy to Kubernetes cluster +# # run: | +# # kubectl create ns akv2k8s +# # HELM_V3=3.0.2 +# # echo "downloading helm ${HELM_V3}" +# # curl -sSL https://get.helm.sh/helm-v${HELM_V3}-linux-amd64.tar.gz | tar xz +# # ./linux-amd64/helm version +# # ./linux-amd64/helm repo add spv-charts http://charts.spvapi.no +# # ./linux-amd64/helm repo update +# # ./linux-amd64/helm upgrade --install azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ +# # --namespace akv2k8s \ +# # --set keyVault.customAuth.enabled=true \ +# # --set env.AZURE_TENANT_ID=${{secrets.AKV_TEST_TENANT_ID}} \ +# # --set env.AZURE_CLIENT_ID=${{secrets.AKV_TEST_CLIENT_ID}} \ +# # --set env.AZURE_CLIENT_SECRET=${{secrets.AKV_TEST_CLIENT_SECRET}} \ +# # --set installCrd=true \ +# # --set envImage.repository=dokken.azurecr.io/azure-keyvault-env \ +# # --set envImage.tag=${GITHUB_REF##*/} \ +# # --set image.repository=dokken.azurecr.io/azure-keyvault-webhook \ +# # --set image.tag=${GITHUB_REF##*/} \ +# # --version 1.1.0-beta.19 \ +# # --wait - # - name: Test env-injection - # run: | - # kubectl apply -R -f ./int-tests/ +# # - name: Test env-injection +# # run: | +# # kubectl apply -R -f ./int-tests/ - # - name: Push images to public repo - # run: | - # docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}} - # make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/} +# # - name: Push images to public repo +# # run: | +# # docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}} +# # make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/} - - name: Push images to private repo - run: | - docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io - make push +# - name: Push images to private repo +# run: | +# docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io +# make push \ No newline at end of file diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/build-webhook.yaml new file mode 100644 index 00000000..906af9fd --- /dev/null +++ b/.github/workflows/build-webhook.yaml @@ -0,0 +1,26 @@ +name: Build WebHook + +on: + push: + branches: + - master + paths: + - '.github/workflows/build-webhook.yaml' + - 'Makefile' + - 'go.mod' + - 'go.sum' + - 'cmd/azure-keyvault-secrets-webhook/**' + - 'pkg/**' + - '!docs/**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Build + uses: ./.github/actions/build + with: + build-make-action: build-webhook + push-make-action: push-webhook From fac58dc4d26e4c72caf68d1dc7aa4bdf99bbd6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 16:49:39 +0200 Subject: [PATCH 022/251] Moved github action to correct location --- .github/actions/{build.yaml => build/action.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/actions/{build.yaml => build/action.yaml} (100%) diff --git a/.github/actions/build.yaml b/.github/actions/build/action.yaml similarity index 100% rename from .github/actions/build.yaml rename to .github/actions/build/action.yaml From f66cc002ecb4231470d6102440681375b93c381b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 16:51:03 +0200 Subject: [PATCH 023/251] Trigger builds whenever actions folder changes --- .github/workflows/build-webhook.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/build-webhook.yaml index 906af9fd..6bec553d 100644 --- a/.github/workflows/build-webhook.yaml +++ b/.github/workflows/build-webhook.yaml @@ -6,6 +6,7 @@ on: - master paths: - '.github/workflows/build-webhook.yaml' + - '.github/actions/**' - 'Makefile' - 'go.mod' - 'go.sum' From 9fdd0f078f3ba6dd68f3a277d9dd9004f3bfdd78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 16:58:48 +0200 Subject: [PATCH 024/251] fix build --- .github/actions/build/action.yaml | 9 ++------- .github/workflows/build-webhook.yaml | 5 +++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index dd514173..66828927 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -1,5 +1,5 @@ -name: 'Hello World' -description: 'Greet someone' +name: 'Build' +description: 'Build Go packages' inputs: build-make-action: # id of input description: 'Action in makefile to build package' @@ -11,11 +11,6 @@ inputs: runs: using: "composite" steps: - - name: Setup Golang - uses: actions/setup-go@v1 - with: - go-version: '1.13.4' - - name: Test run: make test diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/build-webhook.yaml index 6bec553d..5832148f 100644 --- a/.github/workflows/build-webhook.yaml +++ b/.github/workflows/build-webhook.yaml @@ -20,6 +20,11 @@ jobs: steps: - uses: actions/checkout@master + - name: Setup Golang + uses: actions/setup-go@v1 + with: + go-version: '1.13.4' + - name: Build uses: ./.github/actions/build with: From 328d2629e678c4eee98eed0f5ee9c61a8c02726d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 17:01:19 +0200 Subject: [PATCH 025/251] Added missing shell --- .github/actions/build/action.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index 66828927..ef6d4b0e 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -13,12 +13,14 @@ runs: steps: - name: Test run: make test + shell: bash - name: Build docker image run: make ${{ inputs.build-make-action }} + shell: bash - name: Push images to private repo run: | docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io make ${{ inputs.push-make-action }} - \ No newline at end of file + shell: bash From 9dd02cbbe898e98155cd8b79591837b4993b5d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 17:27:16 +0200 Subject: [PATCH 026/251] Testing out passing sensitive data to internal github action --- .github/actions/build/action.yaml | 8 ++++---- .github/workflows/build-webhook.yaml | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index ef6d4b0e..a9573830 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -1,13 +1,13 @@ name: 'Build' description: 'Build Go packages' inputs: - build-make-action: # id of input + build-make-action: description: 'Action in makefile to build package' required: true - push-make-action: # id of input + push-make-action: description: 'Action in makefile to push package to docker repo' required: true - + runs: using: "composite" steps: @@ -21,6 +21,6 @@ runs: - name: Push images to private repo run: | - docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io + echo "${{ inputs.docker-passw}}" | docker login -u ${{ inputs.docker-user }} --password-stdin dokken.azurecr.io make ${{ inputs.push-make-action }} shell: bash diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/build-webhook.yaml index 5832148f..36dbca20 100644 --- a/.github/workflows/build-webhook.yaml +++ b/.github/workflows/build-webhook.yaml @@ -30,3 +30,5 @@ jobs: with: build-make-action: build-webhook push-make-action: push-webhook + docker-user: bogus + docker-passw: fake-passw From 329d8a09b0f996c179b923d3b8784ebd24038898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 17:29:14 +0200 Subject: [PATCH 027/251] Added input params for docker creds --- .github/actions/build/action.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index a9573830..37827ee5 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -7,6 +7,12 @@ inputs: push-make-action: description: 'Action in makefile to push package to docker repo' required: true + docker-user: + description: 'Username to authenticate with docker repository' + required: true + docker-passw: + description: 'Password to authenticate with docker repository' + required: true runs: using: "composite" From 6aabfa29a71ac7fc5afc1cab0ea8204d58260282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 18:31:40 +0200 Subject: [PATCH 028/251] Split action in two - build and push --- .github/actions/build/action.yaml | 17 +---------------- .github/actions/push/action.yaml | 21 +++++++++++++++++++++ .github/workflows/build-webhook.yaml | 4 ++++ 3 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 .github/actions/push/action.yaml diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index 37827ee5..247a31f6 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -4,15 +4,6 @@ inputs: build-make-action: description: 'Action in makefile to build package' required: true - push-make-action: - description: 'Action in makefile to push package to docker repo' - required: true - docker-user: - description: 'Username to authenticate with docker repository' - required: true - docker-passw: - description: 'Password to authenticate with docker repository' - required: true runs: using: "composite" @@ -23,10 +14,4 @@ runs: - name: Build docker image run: make ${{ inputs.build-make-action }} - shell: bash - - - name: Push images to private repo - run: | - echo "${{ inputs.docker-passw}}" | docker login -u ${{ inputs.docker-user }} --password-stdin dokken.azurecr.io - make ${{ inputs.push-make-action }} - shell: bash + shell: bash \ No newline at end of file diff --git a/.github/actions/push/action.yaml b/.github/actions/push/action.yaml new file mode 100644 index 00000000..6b1064cf --- /dev/null +++ b/.github/actions/push/action.yaml @@ -0,0 +1,21 @@ +name: 'Push' +description: 'Push containers to Docker registry' +inputs: + push-make-action: + description: 'Action in makefile to push package to docker repo' + required: true + docker-user: + description: 'Username to authenticate with docker repository' + required: true + docker-passw: + description: 'Password to authenticate with docker repository' + required: true + +runs: + using: "composite" + steps: + - name: Push images to private repo + run: | + echo "${{ inputs.docker-passw}}" | docker login -u ${{ inputs.docker-user }} --password-stdin dokken.azurecr.io + make ${{ inputs.push-make-action }} + shell: bash diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/build-webhook.yaml index 36dbca20..d05499a4 100644 --- a/.github/workflows/build-webhook.yaml +++ b/.github/workflows/build-webhook.yaml @@ -29,6 +29,10 @@ jobs: uses: ./.github/actions/build with: build-make-action: build-webhook + + - name: Push + uses: ./.github/actions/push + with: push-make-action: push-webhook docker-user: bogus docker-passw: fake-passw From 8f4f7e94323e3cf0762c1f0259372da67cbbfd49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 19:29:03 +0200 Subject: [PATCH 029/251] Added fake secret, to make sure its not revealed --- .github/workflows/build-webhook.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/build-webhook.yaml index d05499a4..a63df180 100644 --- a/.github/workflows/build-webhook.yaml +++ b/.github/workflows/build-webhook.yaml @@ -35,4 +35,4 @@ jobs: with: push-make-action: push-webhook docker-user: bogus - docker-passw: fake-passw + docker-passw: ${{ secrets.FAKE_SECRET }} From eeb00952f2f68b7e1a9cc70958d15851b185be76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 19:30:33 +0200 Subject: [PATCH 030/251] Removed old build workflow --- .github/workflows/build-push.yaml | 80 ------------------------------- 1 file changed, 80 deletions(-) delete mode 100644 .github/workflows/build-push.yaml diff --git a/.github/workflows/build-push.yaml b/.github/workflows/build-push.yaml deleted file mode 100644 index be630081..00000000 --- a/.github/workflows/build-push.yaml +++ /dev/null @@ -1,80 +0,0 @@ -# name: build - -# on: -# push: -# branches: -# - master -# paths: -# - '.github/workflows/**' -# - 'Makefile' -# - 'go.mod' -# - 'go.sum' -# - 'cmd/**' -# - 'pkg/**' -# - '!docs/**' - -# jobs: -# build-deploy: -# runs-on: ubuntu-18.04 -# steps: -# - uses: actions/checkout@master - -# - name: Setup Golang -# uses: actions/setup-go@v1 -# with: -# go-version: '1.13.4' - -# - name: Test -# run: make test - -# - name: Build docker images -# run: make build - -# # - name: Setup Kind -# # uses: engineerd/setup-kind@v0.3.0 -# # with: -# # image: "kindest/node:v1.13.7" - -# # - name: Load images into Kind -# # run: | -# # kind load docker-image dokken.azurecr.io/azure-keyvault-webhook:${GITHUB_REF##*/} -# # kind load docker-image dokken.azurecr.io/azure-keyvault-env:${GITHUB_REF##*/} - -# # - name: Deploy to Kubernetes cluster -# # run: | -# # kubectl create ns akv2k8s -# # HELM_V3=3.0.2 -# # echo "downloading helm ${HELM_V3}" -# # curl -sSL https://get.helm.sh/helm-v${HELM_V3}-linux-amd64.tar.gz | tar xz -# # ./linux-amd64/helm version -# # ./linux-amd64/helm repo add spv-charts http://charts.spvapi.no -# # ./linux-amd64/helm repo update -# # ./linux-amd64/helm upgrade --install azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ -# # --namespace akv2k8s \ -# # --set keyVault.customAuth.enabled=true \ -# # --set env.AZURE_TENANT_ID=${{secrets.AKV_TEST_TENANT_ID}} \ -# # --set env.AZURE_CLIENT_ID=${{secrets.AKV_TEST_CLIENT_ID}} \ -# # --set env.AZURE_CLIENT_SECRET=${{secrets.AKV_TEST_CLIENT_SECRET}} \ -# # --set installCrd=true \ -# # --set envImage.repository=dokken.azurecr.io/azure-keyvault-env \ -# # --set envImage.tag=${GITHUB_REF##*/} \ -# # --set image.repository=dokken.azurecr.io/azure-keyvault-webhook \ -# # --set image.tag=${GITHUB_REF##*/} \ -# # --version 1.1.0-beta.19 \ -# # --wait - -# # - name: Test env-injection -# # run: | -# # kubectl apply -R -f ./int-tests/ - - -# # - name: Push images to public repo -# # run: | -# # docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}} -# # make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/} - -# - name: Push images to private repo -# run: | -# docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io -# make push - \ No newline at end of file From b30959d7c7419ab5a9ecdf8b3058496ae828928b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 19:34:59 +0200 Subject: [PATCH 031/251] Should work now2 --- .github/workflows/build-webhook.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/build-webhook.yaml index a63df180..00a0c95d 100644 --- a/.github/workflows/build-webhook.yaml +++ b/.github/workflows/build-webhook.yaml @@ -34,5 +34,5 @@ jobs: uses: ./.github/actions/push with: push-make-action: push-webhook - docker-user: bogus - docker-passw: ${{ secrets.FAKE_SECRET }} + docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }} + docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }} From 27e459123b6d0eeff2b900480c50e54fea80734b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 20:04:47 +0200 Subject: [PATCH 032/251] Restructured github workflows --- .../workflows/ca-bundle-controller/build.yaml | 38 +++++++++++++++++++ .../ca-bundle-controller/release.yaml | 23 +++++++++++ .github/workflows/controller/build.yaml | 38 +++++++++++++++++++ .github/workflows/controller/release.yaml | 23 +++++++++++ .../workflows/{ => docs}/publish-docs.yaml | 0 .github/workflows/release.yaml | 23 ----------- .github/workflows/vaultenv/build.yaml | 38 +++++++++++++++++++ .github/workflows/vaultenv/release.yaml | 23 +++++++++++ .../build.yaml} | 0 .github/workflows/webhook/release.yaml | 23 +++++++++++ 10 files changed, 206 insertions(+), 23 deletions(-) create mode 100644 .github/workflows/ca-bundle-controller/build.yaml create mode 100644 .github/workflows/ca-bundle-controller/release.yaml create mode 100644 .github/workflows/controller/build.yaml create mode 100644 .github/workflows/controller/release.yaml rename .github/workflows/{ => docs}/publish-docs.yaml (100%) delete mode 100644 .github/workflows/release.yaml create mode 100644 .github/workflows/vaultenv/build.yaml create mode 100644 .github/workflows/vaultenv/release.yaml rename .github/workflows/{build-webhook.yaml => webhook/build.yaml} (100%) create mode 100644 .github/workflows/webhook/release.yaml diff --git a/.github/workflows/ca-bundle-controller/build.yaml b/.github/workflows/ca-bundle-controller/build.yaml new file mode 100644 index 00000000..539c2acc --- /dev/null +++ b/.github/workflows/ca-bundle-controller/build.yaml @@ -0,0 +1,38 @@ +name: Build CA Bundle Controller + +on: + push: + branches: + - master + paths: + - '.github/workflows/build-ca-bundle-controller.yaml' + - '.github/actions/**' + - 'Makefile' + - 'go.mod' + - 'go.sum' + - 'cmd/ca-bundle-controller/**' + - 'pkg/**' + - '!docs/**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Setup Golang + uses: actions/setup-go@v1 + with: + go-version: '1.13.4' + + - name: Build + uses: ./.github/actions/build + with: + build-make-action: build-ca-bundle-controller + + - name: Push + uses: ./.github/actions/push + with: + push-make-action: push-ca-bundle-controller + docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }} + docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }} diff --git a/.github/workflows/ca-bundle-controller/release.yaml b/.github/workflows/ca-bundle-controller/release.yaml new file mode 100644 index 00000000..8fe3f955 --- /dev/null +++ b/.github/workflows/ca-bundle-controller/release.yaml @@ -0,0 +1,23 @@ +name: Release CA Bundle Controller + +on: + push: + tags: + - 'ca-bundle-controller-[0-9]+.[0-9]+.[0-9]+**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Pull images from private repo + run: | + echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io + make pull-ca-bundle-controller + + - name: Push images to public repo + run: | + echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin + make release-ca-bundle-controller DOCKER_RELEASE_TAG=${GITHUB_REF##*/} + \ No newline at end of file diff --git a/.github/workflows/controller/build.yaml b/.github/workflows/controller/build.yaml new file mode 100644 index 00000000..e5956842 --- /dev/null +++ b/.github/workflows/controller/build.yaml @@ -0,0 +1,38 @@ +name: Build Controller + +on: + push: + branches: + - master + paths: + - '.github/workflows/build-controller.yaml' + - '.github/actions/**' + - 'Makefile' + - 'go.mod' + - 'go.sum' + - 'cmd/azure-keyvault-controller/**' + - 'pkg/**' + - '!docs/**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Setup Golang + uses: actions/setup-go@v1 + with: + go-version: '1.13.4' + + - name: Build + uses: ./.github/actions/build + with: + build-make-action: build-controller + + - name: Push + uses: ./.github/actions/push + with: + push-make-action: push-controller + docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }} + docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }} diff --git a/.github/workflows/controller/release.yaml b/.github/workflows/controller/release.yaml new file mode 100644 index 00000000..9ba1f188 --- /dev/null +++ b/.github/workflows/controller/release.yaml @@ -0,0 +1,23 @@ +name: Release Controller + +on: + push: + tags: + - 'controller-[0-9]+.[0-9]+.[0-9]+**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Pull images from private repo + run: | + echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io + make pull-controller + + - name: Push images to public repo + run: | + echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin + make release-controller DOCKER_RELEASE_TAG=${GITHUB_REF##*/} + \ No newline at end of file diff --git a/.github/workflows/publish-docs.yaml b/.github/workflows/docs/publish-docs.yaml similarity index 100% rename from .github/workflows/publish-docs.yaml rename to .github/workflows/docs/publish-docs.yaml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index 51a6a5b5..00000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: public release - -on: - push: - tags: - - '[0-9]+.[0-9]+.[0-9]+**' - -jobs: - build-deploy: - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@master - - - name: Pull images from private repo - run: | - docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io - make pull-release - - - name: Push images to public repo - run: | - docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}} - make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/} - \ No newline at end of file diff --git a/.github/workflows/vaultenv/build.yaml b/.github/workflows/vaultenv/build.yaml new file mode 100644 index 00000000..180360a5 --- /dev/null +++ b/.github/workflows/vaultenv/build.yaml @@ -0,0 +1,38 @@ +name: Build Vault Env + +on: + push: + branches: + - master + paths: + - '.github/workflows/build-vaultenv.yaml' + - '.github/actions/**' + - 'Makefile' + - 'go.mod' + - 'go.sum' + - 'cmd/azure-keyvault-env/**' + - 'pkg/**' + - '!docs/**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Setup Golang + uses: actions/setup-go@v1 + with: + go-version: '1.13.4' + + - name: Build + uses: ./.github/actions/build + with: + build-make-action: build-vaultenv + + - name: Push + uses: ./.github/actions/push + with: + push-make-action: push-vaultenv + docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }} + docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }} diff --git a/.github/workflows/vaultenv/release.yaml b/.github/workflows/vaultenv/release.yaml new file mode 100644 index 00000000..f32d56eb --- /dev/null +++ b/.github/workflows/vaultenv/release.yaml @@ -0,0 +1,23 @@ +name: Release VaultEnv + +on: + push: + tags: + - 'vaultenv-[0-9]+.[0-9]+.[0-9]+**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Pull images from private repo + run: | + echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io + make pull-vaultenv + + - name: Push images to public repo + run: | + echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin + make release-vaultenv DOCKER_RELEASE_TAG=${GITHUB_REF##*/} + \ No newline at end of file diff --git a/.github/workflows/build-webhook.yaml b/.github/workflows/webhook/build.yaml similarity index 100% rename from .github/workflows/build-webhook.yaml rename to .github/workflows/webhook/build.yaml diff --git a/.github/workflows/webhook/release.yaml b/.github/workflows/webhook/release.yaml new file mode 100644 index 00000000..9730ddd1 --- /dev/null +++ b/.github/workflows/webhook/release.yaml @@ -0,0 +1,23 @@ +name: Release Webhook + +on: + push: + tags: + - 'webhook-[0-9]+.[0-9]+.[0-9]+**' + +jobs: + build-deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@master + + - name: Pull images from private repo + run: | + echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io + make pull-webhook + + - name: Push images to public repo + run: | + echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin + make release-webhook DOCKER_RELEASE_TAG=${GITHUB_REF##*/} + \ No newline at end of file From 7da1826650f6bf528c360556ce689c2c27a356a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 20:09:10 +0200 Subject: [PATCH 033/251] Moved workflows out of subfolder, as this was not supported --- .../build.yaml => ca-bundle-controller-build.yaml} | 0 .../release.yaml => ca-bundle-controller-release.yaml} | 0 .../workflows/{controller/build.yaml => controller-build.yaml} | 0 .../{controller/release.yaml => controller-release.yaml} | 0 .github/workflows/{docs/publish-docs.yaml => docs-publish.yaml} | 0 .github/workflows/{vaultenv/build.yaml => vaultenv-build.yaml} | 0 .../workflows/{vaultenv/release.yaml => vaultenv-release.yaml} | 0 .github/workflows/{webhook/build.yaml => webhook-build.yaml} | 0 .github/workflows/{webhook/release.yaml => webhook-release.yaml} | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{ca-bundle-controller/build.yaml => ca-bundle-controller-build.yaml} (100%) rename .github/workflows/{ca-bundle-controller/release.yaml => ca-bundle-controller-release.yaml} (100%) rename .github/workflows/{controller/build.yaml => controller-build.yaml} (100%) rename .github/workflows/{controller/release.yaml => controller-release.yaml} (100%) rename .github/workflows/{docs/publish-docs.yaml => docs-publish.yaml} (100%) rename .github/workflows/{vaultenv/build.yaml => vaultenv-build.yaml} (100%) rename .github/workflows/{vaultenv/release.yaml => vaultenv-release.yaml} (100%) rename .github/workflows/{webhook/build.yaml => webhook-build.yaml} (100%) rename .github/workflows/{webhook/release.yaml => webhook-release.yaml} (100%) diff --git a/.github/workflows/ca-bundle-controller/build.yaml b/.github/workflows/ca-bundle-controller-build.yaml similarity index 100% rename from .github/workflows/ca-bundle-controller/build.yaml rename to .github/workflows/ca-bundle-controller-build.yaml diff --git a/.github/workflows/ca-bundle-controller/release.yaml b/.github/workflows/ca-bundle-controller-release.yaml similarity index 100% rename from .github/workflows/ca-bundle-controller/release.yaml rename to .github/workflows/ca-bundle-controller-release.yaml diff --git a/.github/workflows/controller/build.yaml b/.github/workflows/controller-build.yaml similarity index 100% rename from .github/workflows/controller/build.yaml rename to .github/workflows/controller-build.yaml diff --git a/.github/workflows/controller/release.yaml b/.github/workflows/controller-release.yaml similarity index 100% rename from .github/workflows/controller/release.yaml rename to .github/workflows/controller-release.yaml diff --git a/.github/workflows/docs/publish-docs.yaml b/.github/workflows/docs-publish.yaml similarity index 100% rename from .github/workflows/docs/publish-docs.yaml rename to .github/workflows/docs-publish.yaml diff --git a/.github/workflows/vaultenv/build.yaml b/.github/workflows/vaultenv-build.yaml similarity index 100% rename from .github/workflows/vaultenv/build.yaml rename to .github/workflows/vaultenv-build.yaml diff --git a/.github/workflows/vaultenv/release.yaml b/.github/workflows/vaultenv-release.yaml similarity index 100% rename from .github/workflows/vaultenv/release.yaml rename to .github/workflows/vaultenv-release.yaml diff --git a/.github/workflows/webhook/build.yaml b/.github/workflows/webhook-build.yaml similarity index 100% rename from .github/workflows/webhook/build.yaml rename to .github/workflows/webhook-build.yaml diff --git a/.github/workflows/webhook/release.yaml b/.github/workflows/webhook-release.yaml similarity index 100% rename from .github/workflows/webhook/release.yaml rename to .github/workflows/webhook-release.yaml From a340a9e63ddb53a7f2b7510d107182ac86c0881e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 20:11:13 +0200 Subject: [PATCH 034/251] Changed trigger to work with new workflow file names --- .github/workflows/ca-bundle-controller-build.yaml | 2 +- .github/workflows/controller-build.yaml | 2 +- .github/workflows/vaultenv-build.yaml | 2 +- .github/workflows/webhook-build.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index 539c2acc..e4597660 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -5,7 +5,7 @@ on: branches: - master paths: - - '.github/workflows/build-ca-bundle-controller.yaml' + - '.github/workflows/ca-bundle-controller-build.yaml' - '.github/actions/**' - 'Makefile' - 'go.mod' diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index e5956842..3ad70193 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -5,7 +5,7 @@ on: branches: - master paths: - - '.github/workflows/build-controller.yaml' + - '.github/workflows/controller-build.yaml' - '.github/actions/**' - 'Makefile' - 'go.mod' diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index 180360a5..075f46f5 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -5,7 +5,7 @@ on: branches: - master paths: - - '.github/workflows/build-vaultenv.yaml' + - '.github/workflows/vaultenv-build.yaml' - '.github/actions/**' - 'Makefile' - 'go.mod' diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index 00a0c95d..9184e6cc 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -5,7 +5,7 @@ on: branches: - master paths: - - '.github/workflows/build-webhook.yaml' + - '.github/workflows/webhook-build.yaml' - '.github/actions/**' - 'Makefile' - 'go.mod' From 5ec2271d3749aff6058b051216b37bf52ac2cc0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 22:01:42 +0200 Subject: [PATCH 035/251] action for releaseing webhook --- .github/workflows/webhook-release.yaml | 4 ++-- Makefile | 26 ++++++++++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/workflows/webhook-release.yaml b/.github/workflows/webhook-release.yaml index 9730ddd1..cdaeb555 100644 --- a/.github/workflows/webhook-release.yaml +++ b/.github/workflows/webhook-release.yaml @@ -11,12 +11,12 @@ jobs: steps: - uses: actions/checkout@master - - name: Pull images from private repo + - name: Pull image from private repo run: | echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io make pull-webhook - - name: Push images to public repo + - name: Push image to public repo run: | echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin make release-webhook DOCKER_RELEASE_TAG=${GITHUB_REF##*/} diff --git a/Makefile b/Makefile index 68c9f3d4..6c7fd78e 100644 --- a/Makefile +++ b/Makefile @@ -15,12 +15,19 @@ DOCKER_AKV2K8S_TEST_IMAGE=akv2k8s-env-test DOCKER_INTERNAL_TAG := $(shell git rev-parse --short HEAD) DOCKER_RELEASE_TAG := $(shell git describe --tags) +DOCKER_RELEASE_TAG_WEBHOOK := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"webhook-"/""/g) +DOCKER_RELEASE_TAG_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"controller-"/""/g) +DOCKER_RELEASE_TAG_VAULTENV := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"vaultenv-"/""/g) +DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"ca-bundle-controller-"/""/g) BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") VCS_URL := https://$(PACKAGE) .PHONY: run-docs-dev build build-controller build-webhook build-auth-service build-vaultenv build-akv2k8s-env-test test push push-controller push-webhook push-auth-service push-vaultenv push-akv2k8s-env-test pull-release release release-controller release-webhook release-auth-service release-vaultenv +print-v-webhook: + @echo $(DOCKER_RELEASE_TAG_WEBHOOK) + run-docs-dev: cd ./docs && npm install && GATSBY_ALGOLIA_ENABLED=false npm run start @@ -56,9 +63,6 @@ build-ca-bundle-controller: build-webhook: docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/env-injector/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-secrets-webhook" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) -build-auth-service: - docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/auth-service/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-auth-service" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) - build-vaultenv: docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/vault-env/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-env" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) @@ -85,16 +89,18 @@ push-vaultenv: push-akv2k8s-env-test: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) -# release: -# $(call release_image,$(DOCKER_CONTROLLER_IMAGE)) -# $(call release_image,$(DOCKER_WEBHOOK_IMAGE)) -# $(call release_image,$(DOCKER_VAULTENV_IMAGE)) +pull-all: pull-webhook pull-controller pull-ca-bundle-controller pull-vaultenv + +pull-webhook: + docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) -pull-release: +pull-controller: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) + +pull-ca-bundle-controller: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) - docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) - # docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) + +pull-vaultenv: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) release: release-controller release-ca-bundle-controller release-webhook release-vaultenv From e9a510061d1d8361cf53528dc730fea3edeb7021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 25 Aug 2020 22:10:28 +0200 Subject: [PATCH 036/251] Added specific release tags per component --- Makefile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 6c7fd78e..f356ab95 100644 --- a/Makefile +++ b/Makefile @@ -106,24 +106,24 @@ pull-vaultenv: release: release-controller release-ca-bundle-controller release-webhook release-vaultenv release-controller: - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) + docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CONTROLLER) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) + docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CONTROLLER) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest release-ca-bundle-controller: - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) + docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG) + docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest release-webhook: - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG) + docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG) + docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest release-auth-service: @@ -134,10 +134,10 @@ release-auth-service: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):latest release-vaultenv: - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG) + docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG_VAULTENV) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):latest - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG) + docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG_VAULTENV) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):latest # define release_image From ccf3868d922a44b83b97c27973c9155dbfb63afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 09:17:10 +0200 Subject: [PATCH 037/251] Removed unused target --- Makefile | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Makefile b/Makefile index f356ab95..1ff1cb42 100644 --- a/Makefile +++ b/Makefile @@ -126,13 +126,6 @@ release-webhook: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest -release-auth-service: - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_RELEASE_TAG) - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):latest - - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_RELEASE_TAG) - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):latest - release-vaultenv: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG_VAULTENV) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):latest From 7c1fbdb33bbc0c63e77ce35b2a196ead4d01fc68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 09:19:21 +0200 Subject: [PATCH 038/251] Removed metrics port in favor of http port --- cmd/azure-keyvault-secrets-webhook/main.go | 29 ++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 83d5e821..002f27b0 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -59,7 +59,7 @@ type azureKeyVaultConfig struct { aadPodBindingLabel string cloudConfigHostPath string serveMetrics bool - metricsPort string + httpPort string certFile string keyFile string caFile string @@ -198,7 +198,7 @@ func initConfig() { viper.SetDefault("use_auth_service", true) viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json") viper.SetDefault("metrics_enabled", false) - viper.SetDefault("metrics_port", "80") + viper.SetDefault("port_http", "80") viper.SetDefault("port", "443") viper.AutomaticEnv() @@ -214,9 +214,9 @@ func main() { config = azureKeyVaultConfig{ port: viper.GetString("port"), + httpPort: viper.GetString("port_http"), customAuth: viper.GetBool("custom_auth"), serveMetrics: viper.GetBool("metrics_enabled"), - metricsPort: viper.GetString("metrics_port"), certFile: viper.GetString("tls_cert_file"), keyFile: viper.GetString("tls_private_key_file"), caFile: viper.GetString("tls_ca_file"), @@ -230,9 +230,6 @@ func main() { log.Info("Active settings:") log.Infof("Webhook port : %s", config.port) log.Infof("Serve metrics : %t", config.serveMetrics) - if config.serveMetrics { - log.Infof("Metrics port : %s", config.metricsPort) - } log.Infof("Use custom auth : %t", config.customAuth) log.Infof("Use auth service : %t", config.useAuthService) if config.useAuthService { @@ -273,32 +270,38 @@ func main() { } httpMux := http.NewServeMux() + httpURL := fmt.Sprintf(":%s", config.httpPort) + if config.serveMetrics { httpMux.Handle("/metrics", promhttp.Handler()) - + log.Infof("Serving metrics at %s/metrics", httpURL) } httpMux.HandleFunc("/healthz", healthHandler) + log.Infof("Serving healthz at %s/healthz", httpURL) go func() { - metricsURL := fmt.Sprintf(":%s", config.metricsPort) - log.Infof("Serving metrics at %s", metricsURL) - err := http.ListenAndServe(metricsURL, httpMux) + err := http.ListenAndServe(httpURL, httpMux) if err != nil { - log.Fatalf("error serving metrics at %s: %+v", metricsURL, err) + log.Fatalf("error serving metrics at %s: %+v", httpURL, err) } }() router := mux.NewRouter() + tlsURL := fmt.Sprintf(":%s", config.port) + router.Handle("/pods", podHandler) + log.Infof("Serving encrypted webhook at %s/pods", tlsURL) + router.HandleFunc("/healthz", healthHandler) + log.Infof("Serving encrypted healthz at %s/healthz", tlsURL) if config.useAuthService { router.HandleFunc("/auth/{namespace}/{pod}", authHandler) + log.Infof("Serving encrypted auth at %s/auth", tlsURL) } - log.Infof("Serving TLS encrypted traffic at https://:%s", config.port) - err = http.ListenAndServeTLS(fmt.Sprintf(":%s", config.port), config.certFile, config.keyFile, router) + err = http.ListenAndServeTLS(tlsURL, config.certFile, config.keyFile, router) if err != nil { log.Fatalf("error serving webhook: %+v", err) } From 752f2da7d7494f4395e2318b0e8180c3e0be1337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 09:20:14 +0200 Subject: [PATCH 039/251] Ignore test.yaml --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c85f3f3c..927e4d19 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ bin debug.test .vscode /vendor/ -*.tmp \ No newline at end of file +*.tmp +test.yaml \ No newline at end of file From 9151fc9c93f4c50ad34725c17b3f9697b91c7730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 09:20:27 +0200 Subject: [PATCH 040/251] Added some future docs --- docs/source/content/faq.md | 8 ++++++++ .../troubleshooting/container-injection-log-level.md | 0 docs/source/content/troubleshooting/where-to-look.md | 0 3 files changed, 8 insertions(+) create mode 100644 docs/source/content/faq.md create mode 100644 docs/source/content/troubleshooting/container-injection-log-level.md create mode 100644 docs/source/content/troubleshooting/where-to-look.md diff --git a/docs/source/content/faq.md b/docs/source/content/faq.md new file mode 100644 index 00000000..aeff61c4 --- /dev/null +++ b/docs/source/content/faq.md @@ -0,0 +1,8 @@ +--- +title: "Frequently Asked Questions" +description: "Most frequently asked questions" +--- + +### How does akv2k8s compare to Azure Key Vault Provider for Secrets Store CSI Driver? + +On a high level, Azure Key Vault for Kubernetes was created to securely pass secrets through environment variables into Docker containers and applications. Azure Key Vault Provider for Secrets Store CSI Driver on the other hand was created to access secrets through volumes. It boils down how to how you want your application to access secrets. The akv2k8s project is highly motivated by the 12 Factor App principles and believes passing configuration (including secrets) through environment variables is the way to go. If you prefer accessing secrets from a volume, use Azure Key Vault Provider for Secrets Store CSI Driver. \ No newline at end of file diff --git a/docs/source/content/troubleshooting/container-injection-log-level.md b/docs/source/content/troubleshooting/container-injection-log-level.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/source/content/troubleshooting/where-to-look.md b/docs/source/content/troubleshooting/where-to-look.md new file mode 100644 index 00000000..e69de29b From 2d3d964991bd46ac87873fa08c37ee9f92e0c3dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 09:31:44 +0200 Subject: [PATCH 041/251] proper gofmt --- .../controller/secret_handler.go | 2 +- cmd/azure-keyvault-env/secret_handler.go | 6 +++--- pkg/azure/keyvault/client/certificate_test.go | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 9cf0155d..d1b4d2a9 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -144,7 +144,7 @@ func (h *AzureCertificateHandler) Handle() (map[string][]byte, error) { values := make(map[string][]byte) var err error options := vault.CertificateOptions{ - ExportPrivateKey: h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeTLS || h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque, + ExportPrivateKey: h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeTLS || h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque, EnsureServerFirst: h.secretSpec.Spec.Output.Secret.ChainOrder == "ensureserverfirst", } diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go index b62ac76a..a83966a2 100644 --- a/cmd/azure-keyvault-env/secret_handler.go +++ b/cmd/azure-keyvault-env/secret_handler.go @@ -136,11 +136,11 @@ func (h *AzureKeyVaultSecretHandler) Handle() (string, error) { // Handle getting and formating Azure Key Vault Certificate from Azure Key Vault to Kubernetes func (h *AzureKeyVaultCertificateHandler) Handle() (string, error) { - options := vault.CertificateOptions { - ExportPrivateKey: h.query == corev1.TLSPrivateKeyKey, + options := vault.CertificateOptions{ + ExportPrivateKey: h.query == corev1.TLSPrivateKeyKey, EnsureServerFirst: h.secretSpec.Spec.Output.Secret.ChainOrder == "ensureserverfirst", } - + cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, &options) if err != nil { diff --git a/pkg/azure/keyvault/client/certificate_test.go b/pkg/azure/keyvault/client/certificate_test.go index 59912a35..4554c36c 100644 --- a/pkg/azure/keyvault/client/certificate_test.go +++ b/pkg/azure/keyvault/client/certificate_test.go @@ -23,10 +23,10 @@ import ( ) var ( - pemTestCert = "-----BEGIN PRIVATE KEY-----\n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\nk125vXj8DvpA/GTS1kARDjKz8dET\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIFUjCCAzqgAwIBAgIQFwNmpFLpQLWUtRrCdyrn0TANBgkqhkiG9w0BAQsFADAm\nMSQwIgYDVQQDExtjdW11bHVzLXRlc3QtY2VydC5zcHZlc3Qubm8wHhcNMTkwMjAx\nMTUzNjMxWhcNMTkwMzAxMTU0NjMxWjAmMSQwIgYDVQQDExtjdW11bHVzLXRlc3Qt\nY2VydC5zcHZlc3Qubm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv\nOy4KydxUOW6KmMhq01IAu5Rz47U1oE6ewq0Yi5ea9CrGN7eUWLOogapoKmFFhO2s\n5SDdPt9HOkDNvh75k4B7OFhM+GaOTRubXgPEg8PV7dFFS52+3C0xORdS+wvgI2i9\neIMqbr1Y8Znw5H3pLG8DsU6Q8FCo14mvW8/ou+xKbSOzWFFaP+dNHFBCARqI+DhQ\nYJFkeg4vPd+nFGxfPH/lbbR9WN0tChOTVUJlGkJlht9/0bsVmM8xAdUS/zQ6qK8n\nKWhLpCtWyo8zKDWg5gsdcMoWYgAIXpinc1NcOyGlMv263Zhw7gB+y7JEMK2Ro3e3\nSmhSpH48CkejpIsUOBNnvr514wkLNLet9sXGZvFXs7oiTkUzgu0MFsZPVAkiYhdH\ndYdg2I9e5t4yyxbu+DSr/OvRbUtC9PrO1ncJaO7p9QcXVuRNi2wxLDeaTZgd9S6M\n2fzR2xcwq3Fxk53gDlRTXgqIM/VCPA+3vp5di+MKGK7aLyNRPxeKcsDLEPHF7MeF\nZJw21xTupEMl8w5KaBd5NiKAwxbLyV8YCZFjJG3V2MOxVAA01BAm7w3lz1/iMbKi\nPGbDA0p3cxvaLYs0RdcNfZ6+4X7al7vBXj8+Hwf/tADY648eBEjTqctVDirElCmj\nN8A0ysqldwqCr+8F8k8PUfR3yb809m8QURE7mEAPVQIDAQABo3wwejAOBgNVHQ8B\nAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH\nAwIwHwYDVR0jBBgwFoAUlJOHnXHhHeY+AjaPPmKFVRw3K1MwHQYDVR0OBBYEFJST\nh51x4R3mPgI2jz5ihVUcNytTMA0GCSqGSIb3DQEBCwUAA4ICAQAn/chFtfLEebP5\n5Tmb+H+eEzOXaHRonUsVriV/66htOeffkNX2b2DOIosvSwKukOkVggLFmyMKhxiq\neZkkAYyMMjjtWqbkCwoCyb8iDUQLaEovy4Pzwpm3YMVK9+o6cIf4zs3AgzaSSpbo\npq8HQbmFGrUGNEyGMclvf5VL1vCw+0jLpJ1+9b79DRY7puPG19zwWWcHk2hNV3aD\n6lWar7/pjqA9ESQhDTeUsXaFMGVm0Ez97IDI/ZVO+ia5+rIo5wAcUGKuYLIs57Wl\ndhlzMil3mz2g4STiWI+VhtPnqPot6MaWuKIN4R+kJocN365WJf2wozYgEjNFANK+\n3hO396cieWBTqyoYYZRxDxz7slD5NikixrJd50QshYCzqKiNopKsafqMHqc3JKZu\nz9tBZ25g43vdSuAwxjSab5DyYGF3Z447jdKOLUYReNnoB7nlTuW5LYfOX20F/XtC\n+4iL+IDjtAfwATruKzbLnKL9IoemLs7XMoW2qYBmCAcfHrI2F3alAar2XTA9lkDR\nMPpJf9q3VzxkPhjlvi8RPJfWLD1Kw4gMVfhao/NQv3SlhQ2rBpczP8XQOWdTNWp/\n043EPQis8+56AEHis/5+NKoNcQYZJwu2uwK0fdILcStJXR//EI04zBzWo/ULe5nc\nU0GaEMA+K/ZUHV2BxSMA3Br0IwdNvg==\n-----END CERTIFICATE-----\n" - pfxTestCert = "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" - derTestCert = "MIIDPjCCAiagAwIBAgIQJVHUTfH7TVCyXO649HajejANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDExFjdW11bHVzLnNwdmVzdC5ubzAeFw0xOTAyMDQxNDE0NTZaFw0xOTAzMDQxNDI0NTZaMBwxGjAYBgNVBAMTEWN1bXVsdXMuc3B2ZXN0Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsCYvQCbABVTAUx8G8Lg7SiNzRHCxaTPG8qp5La+SfnSPAX80u3EpVZc84vYGE9QlGWth1LmhHXfGneTAq7yMRYiBFNc0Y9O+66eZDuIErQ7RDL7N7TSyMzoXgH1xhI14x0XvkZqJwaNqJBvBzSlADNWuKBvPQ2nChKlnjuY3Zrg9KJ1A5T1KF/UW4ZKSZrwyu0fyAzfpBMWkrHa+mYv1wSL0cVDOFGvZIldCMew0gXGHY4ydM0iTW878/epTNQNgeno9M4jnFUXyoVguSH8ZjsFXBOtenIUJWoJs72zHJn5yNz2Bipu0zVrHBJXLi40FBY913/t1X5iBj7WejzUXmQIDAQABo3wwejAOBgNVHQ8BAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUZptBMgsn6JCzZp4So23dBSdWfcowHQYDVR0OBBYEFGabQTILJ+iQs2aeEqNt3QUnVn3KMA0GCSqGSIb3DQEBCwUAA4IBAQAbvqmrDHz6UXbddj/VYWO/m2m5Hm2cudMfInuwnGuOzO0MtKYthkELTu+CirlQjyMya/iLKb/SZ3hRQwyJP4XBWqUm2uaTHfbrv4gpc/hMQ80n8f6hOBofLrEPogaYNGHhWMjSJXj3nDKrp2cDyusTnQkLQWaix0c2GLIif3UfGJBgptUwMgsx1kaiCzbyBW/Kv8BiQSA82ocXqqxAzHBGfKhLHZZXPdoTgEE+vwwPLM1wzvhDzDAkR96/yCwGBr53dUeXXCUh70IiJbJpGNiVc33QEVYw0+Gua7rj99LK4EljlY1E1xbPadSFYeK9KsDlmb9ota2p7iKg1D1JiydK" - pfxTestCertOrderWrong = "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" + pemTestCert = "-----BEGIN PRIVATE KEY-----\n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\nk125vXj8DvpA/GTS1kARDjKz8dET\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIFUjCCAzqgAwIBAgIQFwNmpFLpQLWUtRrCdyrn0TANBgkqhkiG9w0BAQsFADAm\nMSQwIgYDVQQDExtjdW11bHVzLXRlc3QtY2VydC5zcHZlc3Qubm8wHhcNMTkwMjAx\nMTUzNjMxWhcNMTkwMzAxMTU0NjMxWjAmMSQwIgYDVQQDExtjdW11bHVzLXRlc3Qt\nY2VydC5zcHZlc3Qubm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv\nOy4KydxUOW6KmMhq01IAu5Rz47U1oE6ewq0Yi5ea9CrGN7eUWLOogapoKmFFhO2s\n5SDdPt9HOkDNvh75k4B7OFhM+GaOTRubXgPEg8PV7dFFS52+3C0xORdS+wvgI2i9\neIMqbr1Y8Znw5H3pLG8DsU6Q8FCo14mvW8/ou+xKbSOzWFFaP+dNHFBCARqI+DhQ\nYJFkeg4vPd+nFGxfPH/lbbR9WN0tChOTVUJlGkJlht9/0bsVmM8xAdUS/zQ6qK8n\nKWhLpCtWyo8zKDWg5gsdcMoWYgAIXpinc1NcOyGlMv263Zhw7gB+y7JEMK2Ro3e3\nSmhSpH48CkejpIsUOBNnvr514wkLNLet9sXGZvFXs7oiTkUzgu0MFsZPVAkiYhdH\ndYdg2I9e5t4yyxbu+DSr/OvRbUtC9PrO1ncJaO7p9QcXVuRNi2wxLDeaTZgd9S6M\n2fzR2xcwq3Fxk53gDlRTXgqIM/VCPA+3vp5di+MKGK7aLyNRPxeKcsDLEPHF7MeF\nZJw21xTupEMl8w5KaBd5NiKAwxbLyV8YCZFjJG3V2MOxVAA01BAm7w3lz1/iMbKi\nPGbDA0p3cxvaLYs0RdcNfZ6+4X7al7vBXj8+Hwf/tADY648eBEjTqctVDirElCmj\nN8A0ysqldwqCr+8F8k8PUfR3yb809m8QURE7mEAPVQIDAQABo3wwejAOBgNVHQ8B\nAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH\nAwIwHwYDVR0jBBgwFoAUlJOHnXHhHeY+AjaPPmKFVRw3K1MwHQYDVR0OBBYEFJST\nh51x4R3mPgI2jz5ihVUcNytTMA0GCSqGSIb3DQEBCwUAA4ICAQAn/chFtfLEebP5\n5Tmb+H+eEzOXaHRonUsVriV/66htOeffkNX2b2DOIosvSwKukOkVggLFmyMKhxiq\neZkkAYyMMjjtWqbkCwoCyb8iDUQLaEovy4Pzwpm3YMVK9+o6cIf4zs3AgzaSSpbo\npq8HQbmFGrUGNEyGMclvf5VL1vCw+0jLpJ1+9b79DRY7puPG19zwWWcHk2hNV3aD\n6lWar7/pjqA9ESQhDTeUsXaFMGVm0Ez97IDI/ZVO+ia5+rIo5wAcUGKuYLIs57Wl\ndhlzMil3mz2g4STiWI+VhtPnqPot6MaWuKIN4R+kJocN365WJf2wozYgEjNFANK+\n3hO396cieWBTqyoYYZRxDxz7slD5NikixrJd50QshYCzqKiNopKsafqMHqc3JKZu\nz9tBZ25g43vdSuAwxjSab5DyYGF3Z447jdKOLUYReNnoB7nlTuW5LYfOX20F/XtC\n+4iL+IDjtAfwATruKzbLnKL9IoemLs7XMoW2qYBmCAcfHrI2F3alAar2XTA9lkDR\nMPpJf9q3VzxkPhjlvi8RPJfWLD1Kw4gMVfhao/NQv3SlhQ2rBpczP8XQOWdTNWp/\n043EPQis8+56AEHis/5+NKoNcQYZJwu2uwK0fdILcStJXR//EI04zBzWo/ULe5nc\nU0GaEMA+K/ZUHV2BxSMA3Br0IwdNvg==\n-----END CERTIFICATE-----\n" + pfxTestCert = "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" + derTestCert = "MIIDPjCCAiagAwIBAgIQJVHUTfH7TVCyXO649HajejANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDExFjdW11bHVzLnNwdmVzdC5ubzAeFw0xOTAyMDQxNDE0NTZaFw0xOTAzMDQxNDI0NTZaMBwxGjAYBgNVBAMTEWN1bXVsdXMuc3B2ZXN0Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsCYvQCbABVTAUx8G8Lg7SiNzRHCxaTPG8qp5La+SfnSPAX80u3EpVZc84vYGE9QlGWth1LmhHXfGneTAq7yMRYiBFNc0Y9O+66eZDuIErQ7RDL7N7TSyMzoXgH1xhI14x0XvkZqJwaNqJBvBzSlADNWuKBvPQ2nChKlnjuY3Zrg9KJ1A5T1KF/UW4ZKSZrwyu0fyAzfpBMWkrHa+mYv1wSL0cVDOFGvZIldCMew0gXGHY4ydM0iTW878/epTNQNgeno9M4jnFUXyoVguSH8ZjsFXBOtenIUJWoJs72zHJn5yNz2Bipu0zVrHBJXLi40FBY913/t1X5iBj7WejzUXmQIDAQABo3wwejAOBgNVHQ8BAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUZptBMgsn6JCzZp4So23dBSdWfcowHQYDVR0OBBYEFGabQTILJ+iQs2aeEqNt3QUnVn3KMA0GCSqGSIb3DQEBCwUAA4IBAQAbvqmrDHz6UXbddj/VYWO/m2m5Hm2cudMfInuwnGuOzO0MtKYthkELTu+CirlQjyMya/iLKb/SZ3hRQwyJP4XBWqUm2uaTHfbrv4gpc/hMQ80n8f6hOBofLrEPogaYNGHhWMjSJXj3nDKrp2cDyusTnQkLQWaix0c2GLIif3UfGJBgptUwMgsx1kaiCzbyBW/Kv8BiQSA82ocXqqxAzHBGfKhLHZZXPdoTgEE+vwwPLM1wzvhDzDAkR96/yCwGBr53dUeXXCUh70IiJbJpGNiVc33QEVYw0+Gua7rj99LK4EljlY1E1xbPadSFYeK9KsDlmb9ota2p7iKg1D1JiydK" + pfxTestCertOrderWrong = "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" pemTestCertOrderExpected = "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIJAPOREtFE1TsGMA0GCSqGSIb3DQEBBQUAMBoxGDAWBgNV\nBAMMD3d3dy5leGFtcGxlLmNvbTAeFw0yMDAzMjYwODU1MDZaFw0zMDAzMjQwODU1\nMDZaMBoxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBAKl3qkYFwsp43MDcYj23agGuJQPGtZZetTvarWI4xsys\nShHePvb/nzgLiVkSNvZthCdBaHKWa62ZJMS19OqWEWgAj2v89n/1c4fN/LN8QwYa\n75tOZ5k5rB/2V5Zw4pq49WjTDPIkFlsKtvepSjxbG8Ie612R9Dwc+L+8OycyoalK\nYdZtUgcttidAS9Ty6Vhc9BaC3JbIB9STB2iQw+qTjDasHXCZoSNB4Jr3/u3RFkKD\n8t3uqnIwa1RH3UbN8seQRTEhtCo5DFIn+H76kXkQ1wM4LCjW6WHjUyfxwRTzr5Qf\nZ56FiKxlbfivr6Xr6dzRG0pcbAMOSFx45OgAzTWeh0ECAwEAAaNQME4wHQYDVR0O\nBBYEFEwA39G1twh6lTo2og8xnQuwJRN6MB8GA1UdIwQYMBaAFEwA39G1twh6lTo2\nog8xnQuwJRN6MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBACVm4DrM\nmoiQC+tKipYHQft5AzI7l5/jFzICl6HAEhvgZ7+dSiToPKFnCY7Rg6iGGHvEwquw\ng3330OHIwMUDEhUh+ylqTflSN4msKRxdbCy3v84KKp0LN+w4x6wHY1CQiExzvWe8\nD62GGZQBXXdNq7K+/BAotZCh9tpoesw62rUvbWjbRt9gZKhuq2WbqtBRQAuB91Yq\nGyXC/Zpe9Bxm91qPOSzyiE+6yhTEaO2cdBkyCy0aP/JTJIowE/pw2hCrAVY8BlMs\n1FPrKRRC8qH+n6ahR0g7pViCxhQv8cq6LV9C5z70ZKtIWobL2lVjiOBSWt1fVnXn\nL/VUlQqA4z8na6o=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICQDCCAakCFHNdlFiLlaeRn0se50n3MIm9xkc2MA0GCSqGSIb3DQEBCwUAMF8x\nCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl\ncm5ldCBXaWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTAe\nFw0yMDAzMjYwODU5MjhaFw0yMTAzMjYwODU5MjhaMF8xCzAJBgNVBAYTAkFVMRMw\nEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0\neSBMdGQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEF\nAAOBjQAwgYkCgYEAr6s6nN6RSgvUZ4AUsq9UdbdezdHyAmn1ZhDD5XmteK4Td31P\nYCvED8Liddz7qO156m4TbbH1ghdWjNyLWS8ydzAbA7fE7wGYazj5iGahljCTxnIm\nsvQ8t1NJVk7AUyzgO1Xx4S1v2LVM82DU0chb+VrhWrPc/6JySxfQNRNqbu8CAwEA\nATANBgkqhkiG9w0BAQsFAAOBgQCJNuDeN1hf3lorCykH4l5ebjqI5t4Zichx8k51\nQ9cRoDWgLr8jpGbcnUqPdCQYR7J1YITtcZUxZE+O7q1A0te52hAytohspkpMVILr\nD3rBJmblkfKqOTXY6tj1ZcA4dSphcmSiy1lugnlKcGj3PSiB7QTDjMBKL6XUFmRX\nn0UL+A==\n-----END CERTIFICATE-----\n" ) @@ -130,7 +130,7 @@ func TestGetPublicKeyPemChainOrder(t *testing.T) { t.Error("Pem is empty") } - if string(pemCert) != pemTestCertOrderExpected { + if string(pemCert) != pemTestCertOrderExpected { t.Error("Certificate order wrong") } } From 1a8594a3d4708287d3a429a1c74c4fa6d632b45e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 9 Aug 2020 23:12:26 +0000 Subject: [PATCH 042/251] fix: docs/package.json & docs/package-lock.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-FLAT-596927 --- docs/package-lock.json | 19346 ++++++++++++++++++++++++--------------- docs/package.json | 2 +- 2 files changed, 11781 insertions(+), 7567 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 52b4b65b..90a9cfd7 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -130,6 +130,11 @@ "tinycolor2": "^1.4.1" } }, + "@ardatan/aggregate-error": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.1.tgz", + "integrity": "sha512-UQ9BequOTIavs0pTHLMwQwKQF8tTV1oezY/H2O9chA+JNPFZSua55xpU5dPSjAU9/jLJ1VwU+HJuTVN8u7S6Fg==" + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -291,6 +296,54 @@ "esutils": "^2.0.0" } }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", + "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.10.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, "@babel/helper-compilation-targets": { "version": "7.8.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", @@ -600,6 +653,36 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "requires": { + "@babel/types": "^7.11.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, "@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", @@ -660,12 +743,172 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, "@babel/plugin-proposal-dynamic-import": { @@ -677,6 +920,22 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@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", @@ -686,6 +945,22 @@ "@babel/plugin-syntax-json-strings": "^7.8.0" } }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@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", @@ -723,12 +998,189 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, "@babel/plugin-proposal-unicode-property-regex": { @@ -748,6 +1200,21 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@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", @@ -756,6 +1223,14 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -772,6 +1247,21 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@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", @@ -1125,6 +1615,31 @@ "@babel/plugin-syntax-jsx": "^7.8.3" } }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", + "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + } + } + }, "@babel/plugin-transform-react-jsx-self": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", @@ -1143,6 +1658,50 @@ "@babel/plugin-syntax-jsx": "^7.8.3" } }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", + "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, "@babel/plugin-transform-regenerator": { "version": "7.8.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", @@ -1160,14 +1719,49 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", - "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", + "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, "@babel/plugin-transform-shorthand-properties": { @@ -1222,6 +1816,21 @@ "@babel/plugin-syntax-typescript": "^7.8.3" } }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@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", @@ -1232,18 +1841,18 @@ } }, "@babel/polyfill": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.8.7.tgz", - "integrity": "sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.10.4.tgz", + "integrity": "sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg==", "requires": { "core-js": "^2.6.5", "regenerator-runtime": "^0.13.4" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -1458,21 +2067,26 @@ } }, "@babel/runtime-corejs3": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz", - "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", + "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, + "@babel/standalone": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.3.tgz", + "integrity": "sha512-rcoT32Hw0faYhmCDR0P84ODKL5kpEdhYPgdzlTKs7+v9oJaVLsGvq0xlkmLRj01F6LrItH3tY9eEoRsPLie4RQ==" + }, "@babel/template": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", @@ -1652,6 +2266,68 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, + "@graphql-tools/schema": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.0.16.tgz", + "integrity": "sha512-e5jqE13L5eywCc0Uqlf2ThgScj1KgrCQmwvm+giVK0Dh9goMbwLZt/ciEJSr/LYn/vsH5sec9Qu5Jml6IX7zLA==", + "requires": { + "@graphql-tools/utils": "6.0.16", + "tslib": "~2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } + } + }, + "@graphql-tools/utils": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.0.16.tgz", + "integrity": "sha512-WSYVqiIpda0CzXgHuKBJkqE0zZs4aruoVxn5KVMmqDoZbPVJ4f/pATVgKYyelOlBlx5gOfs8PCFpWcQhDB39LA==", + "requires": { + "@ardatan/aggregate-error": "0.0.1", + "camel-case": "4.1.1" + }, + "dependencies": { + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + } + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -1686,6 +2362,63 @@ "@hapi/hoek": "^8.3.0" } }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "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==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@mapbox/hast-util-table-cell-style": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", @@ -1734,4185 +2467,6670 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.8.tgz", "integrity": "sha512-L3rehITVxqDHOPJFGBSHKt3Mv/p3MENYlGIwLNYU89/iVqTLMD/vz8hL9RQtKqRoMbKuWpzzLlKIObqJzthNYg==" }, - "@mdx-js/util": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.8.tgz", - "integrity": "sha512-a7Gjjw8bfBSertA/pTWBA/9WKEhgaSxvQE2NTSUzaknrzGFOhs4alZSHh3RHmSFdSWv5pUuzAgsWseMLhWEVkQ==" - }, - "@mikaelkristiansson/domready": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mikaelkristiansson/domready/-/domready-1.0.10.tgz", - "integrity": "sha512-6cDuZeKSCSJ1KvfEQ25Y8OXUjqDJZ+HgUs6dhASWbAX8fxVraTfPsSeRe2bN+4QJDsgUaXaMWBYfRomCr04GGg==" - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - }, - "dependencies": { - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" - } - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@pieh/friendly-errors-webpack-plugin": { - "version": "1.7.0-chalk-2", - "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz", - "integrity": "sha512-65+vYGuDkHBCWWjqzzR/Ck318+d6yTI00EqII9qe3aPD1J3Olhvw0X38uM5moQb1PK/ksDXwSoPGt/5QhCiotw==", - "requires": { - "chalk": "^2.4.2", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0", - "strip-ansi": "^3" - } - }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.2.0.tgz", - "integrity": "sha512-rjdNzcWroULJeD/Y0+eETy9LhM7c5tbPF+wqT5G680rwDkh3iothIPEqGAuEE2WJlXEaAq293aO6ySzsIU518Q==", + "@mdx-js/runtime": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/runtime/-/runtime-2.0.0-next.7.tgz", + "integrity": "sha512-+Nnjjs1LsdxkkdLODnFE0gz0B69uYJ+eUxScUBDoOY61jnm1NTvq/Axu3/Ax4YMtNwVCQMqBXXeOgLBDku1ISg==", "requires": { - "ansi-html": "^0.0.7", - "error-stack-parser": "^2.0.4", - "html-entities": "^1.2.1", - "lodash.debounce": "^4.0.8", - "react-dev-utils": "^9.1.0" + "@mdx-js/mdx": "^2.0.0-next.7", + "@mdx-js/react": "^2.0.0-next.7", + "buble-jsx-only": "^0.19.8" }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.10.4" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "@babel/core": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } }, - "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "ms": "2.0.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" + "@babel/types": "^7.10.4" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@babel/types": "^7.11.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "requires": { - "p-try": "^1.0.0" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "p-limit": "^1.1.0" + "@babel/types": "^7.10.4" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - } + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "react-dev-utils": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", - "integrity": "sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==", - "requires": { - "@babel/code-frame": "7.5.5", - "address": "1.1.2", - "browserslist": "4.7.0", - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "1.0.5", - "filesize": "3.6.1", - "find-up": "3.0.0", - "fork-ts-checker-webpack-plugin": "1.5.0", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.1.1", - "immer": "1.10.0", - "inquirer": "6.5.0", - "is-root": "2.1.0", - "loader-utils": "1.2.3", - "open": "^6.3.0", - "pkg-up": "2.0.0", - "react-error-overlay": "^6.0.3", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "sockjs-client": "1.4.0", - "strip-ansi": "5.2.0", - "text-table": "0.2.0" - } - }, - "react-error-overlay": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", - "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "ansi-regex": "^4.1.0" + "@babel/types": "^7.11.0" } - } - } - }, - "@reach/router": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.3.tgz", - "integrity": "sha512-gOIAiFhWdiVGSVjukKeNKkCRBLmnORoTPyBihI/jLunICPgxdP30DroAvPQuf1eVfQbfGJQDJkwhJXsNPMnVWw==", - "requires": { - "create-react-context": "0.3.0", - "invariant": "^2.2.3", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@sindresorhus/slugify": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-0.9.1.tgz", - "integrity": "sha512-b6heYM9dzZD13t2GOiEQTDE0qX+I1GyOotMwKh9VQqzuNiVdPVT8dM43fe9HNb/3ul+Qwd5oKSEDrDIfhq3bnQ==", - "requires": { - "escape-string-regexp": "^1.0.5", - "lodash.deburr": "^4.1.0" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "import-fresh": { + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@mdx-js/mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", + "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", + "requires": { + "@babel/core": "7.10.5", + "@babel/plugin-syntax-jsx": "7.10.4", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "^2.0.0-next.7", + "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", + "babel-plugin-extract-export-names": "^2.0.0-next.7", + "babel-plugin-extract-import-names": "^2.0.0-next.7", + "camelcase-css": "2.0.1", + "detab": "2.0.3", + "hast-to-hyperscript": "9.0.0", + "hast-util-raw": "6.0.0", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "9.1.0", + "remark-footnotes": "1.0.0", + "remark-mdx": "^2.0.0-next.7", + "remark-mdxjs": "^2.0.0-next.7", + "remark-parse": "8.0.2", + "remark-squeeze-paragraphs": "4.0.0", + "unified": "9.0.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + } + }, + "@mdx-js/react": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", + "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" + }, + "@mdx-js/util": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", + "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", + "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "^2.0.0-next.7" + } + }, + "babel-plugin-extract-import-names": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", + "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "hast-to-hyperscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz", + "integrity": "sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-from-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz", + "integrity": "sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q==", + "requires": { + "@types/parse5": "^5.0.0", + "ccount": "^1.0.0", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-raw": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.0.tgz", + "integrity": "sha512-IQo6tv3bMMKxk53DljswliucCJOQxaZFCuKEJ7X80249dmJ1nA9LtOnnylsLlqTG98NjQ+iGcoLAYo9q5FRhRg==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "markdown-table": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "repeat-string": "^1.0.0" } }, - "parse-json": { + "mdast-squeeze-paragraphs": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "unist-util-remove": "^2.0.0" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "unist-util-visit": "^2.0.0" } }, - "import-fresh": { + "mdast-util-definitions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz", + "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-hast": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.0.tgz", + "integrity": "sha512-Akl2Vi9y9cSdr19/Dfu58PVwifPXuFt1IrHe7l+Crme1KvgUT+5z+cHLVcQVGCiNTZZcdqjnuv9vPkGsqWytWA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.3", + "collapse-white-space": "^1.0.0", + "detab": "^2.0.0", + "mdast-util-definitions": "^3.0.0", + "mdurl": "^1.0.0", + "trim-lines": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "parse-entities": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, - "parse-json": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "remark-mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", + "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", + "requires": { + "parse-entities": "^2.0.0", + "remark-stringify": "^8.1.0", + "stringify-entities": "^3.0.1", + "strip-indent": "^3.0.0", + "unist-util-stringify-position": "^2.0.3" + } + }, + "remark-parse": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", + "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-squeeze-paragraphs": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "mdast-squeeze-paragraphs": "^4.0.0" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" + "remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } + }, + "stringify-entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", + "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.2", + "is-hexadecimal": "^1.0.0" + } + }, + "unified": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", + "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-is": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", + "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" + }, + "unist-util-remove": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.0.tgz", + "integrity": "sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", + "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "vfile-location": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz", + "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==" + } } }, - "@types/classnames": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", - "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" - }, - "@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/configstore": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", - "integrity": "sha1-zR6FU2M60xhcPy8jns/10mQ+krY=" - }, - "@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" - }, - "@types/estree": { - "version": "0.0.44", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz", - "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==" - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + "@mdx-js/util": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.8.tgz", + "integrity": "sha512-a7Gjjw8bfBSertA/pTWBA/9WKEhgaSxvQE2NTSUzaknrzGFOhs4alZSHh3RHmSFdSWv5pUuzAgsWseMLhWEVkQ==" }, - "@types/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" + "@mikaelkristiansson/domready": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mikaelkristiansson/domready/-/domready-1.0.10.tgz", + "integrity": "sha512-6cDuZeKSCSJ1KvfEQ25Y8OXUjqDJZ+HgUs6dhASWbAX8fxVraTfPsSeRe2bN+4QJDsgUaXaMWBYfRomCr04GGg==" }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, - "@types/history": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.5.tgz", - "integrity": "sha512-wLD/Aq2VggCJXSjxEwrMafIP51Z+13H78nXIX0ABEuIGhmB5sNGbR113MOKo+yfw+RDo1ZU3DM6yfnnRF/+ouw==" - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==" - }, - "@types/lodash": { - "version": "4.14.149", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", - "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" - }, - "@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "requires": { - "@types/unist": "*" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "requires": { - "@types/node": "*" + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" + "@pieh/friendly-errors-webpack-plugin": { + "version": "1.7.0-chalk-2", + "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz", + "integrity": "sha512-65+vYGuDkHBCWWjqzzR/Ck318+d6yTI00EqII9qe3aPD1J3Olhvw0X38uM5moQb1PK/ksDXwSoPGt/5QhCiotw==", + "requires": { + "chalk": "^2.4.2", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0", + "strip-ansi": "^3" + } }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.3.3.tgz", + "integrity": "sha512-uc6FmPEegAZawSHjUMFQwU7EjaDn7zy1iD/KD/wBROL9F4378OES8MKMYHoRAKT61Fk7LxVKZSDR5VespMQiqw==", + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "lodash.debounce": "^4.0.8", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5" + } }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "@reach/alert": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/alert/-/alert-0.10.3.tgz", + "integrity": "sha512-Nu0XRKsHdM4gblgIgfTyJSl2KV1vrRTVVCVpol/f/ZVckTXAM/qN0C+JCCZSMfdjtt3u29CX6pRNkVu3PLfYsQ==", + "requires": { + "@reach/utils": "^0.10.3", + "@reach/visually-hidden": "^0.10.2", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + "@reach/auto-id": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/auto-id/-/auto-id-0.10.5.tgz", + "integrity": "sha512-we4/bwjFxJ3F+2eaddQ1HltbKvJ7AB8clkN719El7Zugpn/vOjfPMOVUiBqTmPGLUvkYrq4tpuFwLvk2HyOVHg==", + "requires": { + "@reach/utils": "0.10.5", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } + } }, - "@types/reach__router": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.3.tgz", - "integrity": "sha512-HTHMGJLdH3czgPP1nHF82y+TYLV1KSh1qYeezqHNDNuESBy55ij1LCn8jDYFeKCuAxm0gd9J25zyYy7mhOcgOw==", + "@reach/combobox": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/combobox/-/combobox-0.10.3.tgz", + "integrity": "sha512-Z9Xl+j4Tm9JNC6ouHhzL0lv2Y+Of5/tD7CnpxaVudeIeXQKjeg5YSUCnIBU/OTUtRsIllkgACk70SGHqvntQAw==", "requires": { - "@types/history": "*", - "@types/react": "*" + "@reach/auto-id": "^0.10.3", + "@reach/descendants": "^0.10.3", + "@reach/popover": "^0.10.3", + "@reach/portal": "^0.10.3", + "@reach/utils": "^0.10.3", + "highlight-words-core": "1.2.2", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@types/react": { - "version": "16.9.32", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.32.tgz", - "integrity": "sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ==", + "@reach/descendants": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/descendants/-/descendants-0.10.5.tgz", + "integrity": "sha512-8HhN4DwS/HsPQ+Ym/Ft/XJ1spXBYdE8hqpnbYR9UcU7Nx3oDbTIdhjA6JXXt23t5avYIx2jRa8YHCtVKSHuiwA==", "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" + "@reach/utils": "0.10.5", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "@reach/dialog": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/dialog/-/dialog-0.10.3.tgz", + "integrity": "sha512-RMpUHNjRQhkjGzKt9/oLmDhwUBikW3JbEzgzZngq5MGY5kWRPwYInLDkEA8We4E43AbBsl5J/PRzQha9V+EEXw==", "requires": { - "@types/node": "*" + "@reach/portal": "^0.10.3", + "@reach/utils": "^0.10.3", + "prop-types": "^15.7.2", + "react-focus-lock": "^2.3.1", + "react-remove-scroll": "^2.3.0", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@types/rimraf": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz", - "integrity": "sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==", + "@reach/menu-button": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/menu-button/-/menu-button-0.10.3.tgz", + "integrity": "sha512-50C5nl7JJG9YcKqngmwTLVft+ZF2MMieto1GSCC7qEU8ykUNz0p69Ipup+Eqjk7KRHpSIYPlYIfAOS75dDuiZQ==", "requires": { - "@types/glob": "*", - "@types/node": "*" + "@reach/auto-id": "^0.10.3", + "@reach/descendants": "^0.10.3", + "@reach/popover": "^0.10.3", + "@reach/utils": "^0.10.3", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@types/tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==" + "@reach/observe-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", + "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" }, - "@types/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=" + "@reach/popover": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/popover/-/popover-0.10.3.tgz", + "integrity": "sha512-41iNfdjd9/5HtYuhezTc9z9WGkloYFVB8wBmPX3QOTuBP4qYd0La5sXClrfyiVqPn/uj1gGzehrZKuh8oSkorw==", + "requires": { + "@reach/portal": "^0.10.3", + "@reach/rect": "^0.10.3", + "@reach/utils": "^0.10.3", + "tabbable": "^4.0.0", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "@reach/portal": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/portal/-/portal-0.10.5.tgz", + "integrity": "sha512-K5K8gW99yqDPDCWQjEfSNZAbGOQWSx5AN2lpuR1gDVoz4xyWpTJ0k0LbetYJTDVvLP/InEcR7AU42JaDYDCXQw==", "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" + "@reach/utils": "0.10.5", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@types/vfile-message": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", - "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "@reach/rect": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/rect/-/rect-0.10.5.tgz", + "integrity": "sha512-JBKs2HniYecq5zLO6UFReX28SUBPM3n0aizdNgHuvwZmDcTfNV4jsuJYQLqJ+FbCQsrSHkBxKZqWpfGXY9bUEg==", "requires": { - "vfile-message": "*" + "@reach/observe-rect": "1.2.0", + "@reach/utils": "0.10.5", + "prop-types": "^15.7.2", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@types/yoga-layout": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.1.tgz", - "integrity": "sha512-OpfgQXWLZn5Dl7mOd8dBNcV8NywXbYYoHjUpa64vJ/RQABaxMzJ5bVicKLGIvIiMnQPtPgKNgXb5jkv9fkOQtw==", - "optional": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz", - "integrity": "sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==", + "@reach/router": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.4.tgz", + "integrity": "sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==", "requires": { - "@typescript-eslint/experimental-utils": "2.26.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" + "create-react-context": "0.3.0", + "invariant": "^2.2.3", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4" } }, - "@typescript-eslint/experimental-utils": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz", - "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==", + "@reach/tabs": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/tabs/-/tabs-0.10.3.tgz", + "integrity": "sha512-yKHyb4NRah9+V8kjkgzIXnj+FPG9aNfHX9uBs32A4MAG4RQLsZr9jBVSoWV1jxMUcYDe4CLtQj8qVphaW/GB2A==", "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.26.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@reach/auto-id": "^0.10.3", + "@reach/descendants": "^0.10.3", + "@reach/utils": "^0.10.3", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@typescript-eslint/parser": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.26.0.tgz", - "integrity": "sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==", + "@reach/tooltip": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/tooltip/-/tooltip-0.10.3.tgz", + "integrity": "sha512-tbj569uSJ+O86fAvR62lK8Tb00aTQxah6dFKgf06lskCGUoYzeFxkZTds9b+TRjzz9G1v68McQHwuAZUH0XrGA==", "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.26.0", - "@typescript-eslint/typescript-estree": "2.26.0", - "eslint-visitor-keys": "^1.1.0" + "@reach/auto-id": "^0.10.3", + "@reach/portal": "^0.10.3", + "@reach/rect": "^0.10.3", + "@reach/utils": "^0.10.3", + "@reach/visually-hidden": "^0.10.2", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@typescript-eslint/typescript-estree": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz", - "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==", + "@reach/utils": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/utils/-/utils-0.10.5.tgz", + "integrity": "sha512-5E/xxQnUbmpI/LrufBAOXjunl96DnqX6B4zC2MO2KH/dRzLug5gM5VuOwV26egsp0jvsSPxojwciOhS43px3qw==", "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" + "@types/warning": "^3.0.0", + "tslib": "^2.0.0", + "warning": "^4.0.3" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" } } }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "@reach/visually-hidden": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.10.4.tgz", + "integrity": "sha512-GnuPuTRCf+Ih47BoKvGyB+jP8EVWLb04GfbGa5neOrjdp90qrb4zr7pMSL4ZvTsrxt9MRooJA2BhSxs5DbyqCQ==", "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@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==" - }, - "@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==" - }, - "@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==" + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, - "@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==", + "@sindresorhus/slugify": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-0.9.1.tgz", + "integrity": "sha512-b6heYM9dzZD13t2GOiEQTDE0qX+I1GyOotMwKh9VQqzuNiVdPVT8dM43fe9HNb/3ul+Qwd5oKSEDrDIfhq3bnQ==", "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "escape-string-regexp": "^1.0.5", + "lodash.deburr": "^4.1.0" } }, - "@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==" + "@styled-system/css": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", + "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==" }, - "@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==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" }, - "@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==" + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" }, - "@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==", - "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" - } + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "requires": { - "@xtuc/long": "4.2.2" - } + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" }, - "@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==", - "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" - } + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" }, - "@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==", - "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" - } + "@svgr/babel-plugin-transform-svg-component": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" }, - "@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==", + "@svgr/babel-preset": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" } }, - "@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==", + "@svgr/core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", "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==", - "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" + "@svgr/plugin-jsx": "^4.3.3", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "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=" + } } }, - "@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==", + "@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" + "@babel/types": "^7.4.4" } }, - "@wry/equality": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.9.tgz", - "integrity": "sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ==", + "@svgr/plugin-jsx": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", "requires": { - "tslib": "^1.9.3" + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.3", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@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==" - }, - "abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", + "@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", "requires": { - "xtend": "~3.0.0" + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" }, "dependencies": { - "xtend": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" } } }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "@svgr/webpack": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", + "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.3.3", + "@svgr/plugin-jsx": "^4.3.3", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" } }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" - }, - "address": { + "@szmarczak/http-timer": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "requires": { - "es6-promisify": "^5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - } + "defer-to-connect": "^1.0.1" } }, - "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==", + "@turist/fetch": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.1.6.tgz", + "integrity": "sha512-+wd8+GhYWRxjsqhzJLozcvj0Vo9bi9EMiAzsgDM187HrnEUOrk0jY+t61UEtmN8gZYqvs87aP1vjXL1uq11nQw==", "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@types/node-fetch": "2" } }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "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" - } + "@turist/time": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.1.tgz", + "integrity": "sha512-M2BiThcbxMxSKX8W4z5u9jKZn6datnM3+FpEU+eYw0//l31E2xhqi7vTAuJ/Sf0P3yhp66SDJgPu3bRRpvrdQQ==" }, - "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==" + "@types/classnames": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", + "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + "@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==" }, - "algoliasearch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.0.3.tgz", - "integrity": "sha512-/4aFAPDoFGEDsx3c0ggKfRC1FeEdtM1HyWMwVe/wkHf/GH6CF67NFNIaBgkqt4i/SYAs92WL8B2Y8cDEMQGfGg==", + "@types/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-htRqZr5qn8EzMelhX/Xmx142z218lLyGaeZ3YR8jlze4TATRU9huKKvuBmAJEW4LCC4pnY1N6JAm6p85fMHjhg==" + }, + "@types/configstore": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", + "integrity": "sha1-zR6FU2M60xhcPy8jns/10mQ+krY=" + }, + "@types/debug": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" + }, + "@types/estree": { + "version": "0.0.44", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz", + "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "requires": { - "@algolia/cache-browser-local-storage": "4.0.3", - "@algolia/cache-common": "4.0.3", - "@algolia/cache-in-memory": "4.0.3", - "@algolia/client-account": "4.0.3", - "@algolia/client-analytics": "4.0.3", - "@algolia/client-common": "4.0.3", - "@algolia/client-recommendation": "4.0.3", - "@algolia/client-search": "4.0.3", - "@algolia/logger-common": "4.0.3", - "@algolia/logger-console": "4.0.3", - "@algolia/requester-browser-xhr": "4.0.3", - "@algolia/requester-common": "4.0.3", - "@algolia/requester-node-http": "4.0.3", - "@algolia/transporter": "4.0.3" + "@types/minimatch": "*", + "@types/node": "*" } }, - "algoliasearch-helper": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.1.1.tgz", - "integrity": "sha512-Jkqlp8jezQRixf7sbQ2zFXHpdaT41g9sHBqT6pztv5nfDmg94K+pwesAy6UbxRY78IL54LIaV1FLttMtT+IzzA==", + "@types/hast": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz", + "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==", "requires": { - "events": "^1.1.1" - }, - "dependencies": { - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - } + "@types/unist": "*" } }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + "@types/history": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.7.tgz", + "integrity": "sha512-2xtoL22/3Mv6a70i4+4RB7VgbDDORoWwjcqeNysojZA0R7NK17RbY5Gof/2QiFfJgX+KkWghbwJ+d/2SB8Ndzg==" }, - "ansi-align": { + "@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + }, + "@types/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "@types/istanbul-lib-coverage": "*" } }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "@types/lodash": { + "version": "4.14.159", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.159.tgz", + "integrity": "sha512-gF7A72f7WQN33DpqOWw9geApQPh4M3PxluMtaHxWHXEGSN12/WbcEk/eNSqWNQcQhF66VSZ06vCF94CrHwXJDg==" }, - "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==", + "@types/lodash.sample": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@types/lodash.sample/-/lodash.sample-4.2.6.tgz", + "integrity": "sha512-hxBvsUjPcW1O8mC9TiBE4m8TwvLuUU+zW8J6GI1M6WmPg8J87mXGt7zavpJ/9Znb+0rVsSB3VNAjCFaJ9YUJKg==", "requires": { - "color-convert": "^1.9.0" + "@types/lodash": "*" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "@types/unist": "*" } }, - "apollo-link": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.13.tgz", - "integrity": "sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw==", - "requires": { - "apollo-utilities": "^1.3.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3", - "zen-observable-ts": "^0.8.20" - } + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, - "apollo-link-http": { - "version": "1.5.16", - "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.16.tgz", - "integrity": "sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw==", + "@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", "requires": { - "apollo-link": "^1.2.13", - "apollo-link-http-common": "^0.2.15", - "tslib": "^1.9.3" + "@types/node": "*" } }, - "apollo-link-http-common": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz", - "integrity": "sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg==", - "requires": { - "apollo-link": "^1.2.13", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3" - } + "@types/node": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", + "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" }, - "apollo-utilities": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.3.tgz", - "integrity": "sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw==", + "@types/node-fetch": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", + "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", "requires": { - "@wry/equality": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" + "@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" + } + } } }, - "application-config-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", - "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=" + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, - "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@types/reach__router": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.5.tgz", + "integrity": "sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ==", "requires": { - "sprintf-js": "~1.0.2" + "@types/history": "*", + "@types/react": "*" } }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "@types/react": { + "version": "16.9.45", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.45.tgz", + "integrity": "sha512-vv950slTF5UZ5eDOf13b8qC1SD4rTvkqg3HfaUKzr17U97oeJZAa+dUaIHn0QoOJflNTIt6Pem9MmapULs9dkA==", "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "@types/prop-types": "*", + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", + "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" + } } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "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==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, - "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=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } }, - "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==", + "@types/rimraf": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz", + "integrity": "sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" + "@types/glob": "*", + "@types/node": "*" } }, - "array-iterate": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", - "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" + "@types/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==" }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + "@types/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=" }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "@types/vfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", + "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", "requires": { - "array-uniq": "^1.0.1" + "@types/node": "*", + "@types/unist": "*", + "@types/vfile-message": "*" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "requires": { + "vfile-message": "*" + } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" }, - "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==", + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "@types/yargs-parser": "*" } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "@types/yoga-layout": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", + "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "requires": { - "safer-buffer": "~2.1.0" + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "inherits": "2.0.1" + "ms": "^2.1.1" } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "@urql/core": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-1.12.3.tgz", + "integrity": "sha512-e4IXXQ4nes3KyusgYV925DuzfDAfo4ex7Ls3tZfOExkxEcXh0i0XnizXp0rvZmWRch69YCkc+Lh1Gy2aY49HTQ==", + "requires": { + "wonka": "^4.0.14" + } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, - "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==" + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } }, - "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==" + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, - "auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", - "optional": true + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } }, - "autoprefixer": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", - "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "requires": { - "browserslist": "^4.11.0", - "caniuse-lite": "^1.0.30001036", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.27", - "postcss-value-parser": "^4.0.3" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001038", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", - "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==" - } + "@xtuc/ieee754": "^1.2.0" } }, - "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=" + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "requires": { - "follow-redirects": "1.5.10" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==" + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "@wry/equality": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.9.tgz", + "integrity": "sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ==", "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" + "tslib": "^1.9.3" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@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==" + }, + "abstract-leveldown": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", + "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", + "requires": { + "xtend": "~3.0.0" }, "dependencies": { - "emojis-list": { + "xtend": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "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==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - } - } + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" } } }, - "babel-plugin-add-module-exports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.3.3.tgz", - "integrity": "sha512-hC37mm7aAdEb1n8SgggG8a1QuhZapsY/XLCi4ETSH6AVjXBCWEa50CXlOsAMPPWLnSx5Ns6mzz39uvuseh0Xjg==", + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "chokidar": "^2.0.4" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" }, "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "optional": true, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "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" + "es6-promise": "^4.0.3" } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true } } }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.8.tgz", - "integrity": "sha512-xYp5F9mAnZdDRFSd1vF3XQ0GQUbIulCpnuht2jCmK30GAHL8szVL7TgzwhEGamQ6yJmP/gEyYNM9OR5D2n26eA==", + "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==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@mdx-js/util": "^1.5.8" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, - "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==", + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", "requires": { - "object.assign": "^4.1.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "babel-plugin-emotion": { - "version": "10.0.33", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", - "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } + "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==" }, - "babel-plugin-extract-import-names": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.8.tgz", - "integrity": "sha512-LcLfP8ZRBZMdMAXHLugyvvd5PY0gMmLMWFogWAUsG32X6TYW2Eavx+il2bw73KDbW+UdCC1bAJ3NuU25T1MI3g==", - "requires": { - "@babel/helper-plugin-utils": "7.8.3" - } + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "algoliasearch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.0.3.tgz", + "integrity": "sha512-/4aFAPDoFGEDsx3c0ggKfRC1FeEdtM1HyWMwVe/wkHf/GH6CF67NFNIaBgkqt4i/SYAs92WL8B2Y8cDEMQGfGg==", "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "@algolia/cache-browser-local-storage": "4.0.3", + "@algolia/cache-common": "4.0.3", + "@algolia/cache-in-memory": "4.0.3", + "@algolia/client-account": "4.0.3", + "@algolia/client-analytics": "4.0.3", + "@algolia/client-common": "4.0.3", + "@algolia/client-recommendation": "4.0.3", + "@algolia/client-search": "4.0.3", + "@algolia/logger-common": "4.0.3", + "@algolia/logger-console": "4.0.3", + "@algolia/requester-browser-xhr": "4.0.3", + "@algolia/requester-common": "4.0.3", + "@algolia/requester-node-http": "4.0.3", + "@algolia/transporter": "4.0.3" } }, - "babel-plugin-preval": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz", - "integrity": "sha512-s8hmTlRSmzcL7cHSIi0s6WxmpOAxfIlWqSVQwBIt7V5bNBaac+8JMZ6kJXLOazMJ8gCIcb5AJgQUgPHvbSYUzw==", + "algoliasearch-helper": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.1.1.tgz", + "integrity": "sha512-Jkqlp8jezQRixf7sbQ2zFXHpdaT41g9sHBqT6pztv5nfDmg94K+pwesAy6UbxRY78IL54LIaV1FLttMtT+IzzA==", "requires": { - "babel-plugin-macros": "^2.2.2", - "require-from-string": "^2.0.2" + "events": "^1.1.1" + }, + "dependencies": { + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + } } }, - "babel-plugin-remove-graphql-queries": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.8.1.tgz", - "integrity": "sha512-c/JNri17WypqZNnMsX2PweMe8e5hsJcYNO/VnUBX9iUIvmKBjd143RaUQq0xYa6bpQF0kzpTFVR0sOp+cQlBOQ==" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, - "babel-preset-gatsby": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.36.tgz", - "integrity": "sha512-vmqN6ht4B28dHlK7Qsau3JseHwTEkLjf2QkUcUKlYCuVk7skZkbN2B6O8QeJQTQ30V/6uUKiNMU/U0nc0RYMNQ==", + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "requires": { - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/preset-env": "^7.8.7", - "@babel/preset-react": "^7.8.3", - "@babel/runtime": "^7.8.7", - "babel-plugin-dynamic-import-node": "^2.3.0", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "gatsby-core-utils": "^1.0.34" + "string-width": "^3.0.0" }, "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "regenerator-runtime": "^0.13.4" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "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=", - "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==" + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "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=", - "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==", - "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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "color-convert": "^1.9.0" } }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "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==" + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, - "base64id": { + "anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "apollo-link": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.13.tgz", + "integrity": "sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw==", "requires": { - "tweetnacl": "^0.14.3" + "apollo-utilities": "^1.3.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.20" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "apollo-link-http": { + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.16.tgz", + "integrity": "sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw==", "requires": { - "callsite": "1.0.0" + "apollo-link": "^1.2.13", + "apollo-link-http-common": "^0.2.15", + "tslib": "^1.9.3" } }, - "better-opn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-1.0.0.tgz", - "integrity": "sha512-q3eO2se4sFbTERB1dFBDdjTiIIpRohMErpwBX21lhPvmgmQNNrcQj0zbWRhMREDesJvyod9kxBS3kOtdAvkB/A==", + "apollo-link-http-common": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz", + "integrity": "sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg==", "requires": { - "open": "^6.4.0" + "apollo-link": "^1.2.13", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" } }, - "better-queue": { - "version": "3.8.10", - "resolved": "https://registry.npmjs.org/better-queue/-/better-queue-3.8.10.tgz", - "integrity": "sha512-e3gwNZgDCnNWl0An0Tz6sUjKDV9m6aB+K9Xg//vYeo8+KiH8pWhLFxkawcXhm6FpM//GfD9IQv/kmvWCAVVpKA==", + "apollo-utilities": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.3.tgz", + "integrity": "sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw==", "requires": { - "better-queue-memory": "^1.0.1", - "node-eta": "^0.9.0", - "uuid": "^3.0.0" + "@wry/equality": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" } }, - "better-queue-memory": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/better-queue-memory/-/better-queue-memory-1.0.4.tgz", - "integrity": "sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA==" + "application-config-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", + "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=" }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "arch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", + "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "file-uri-to-path": "1.0.0" + "sprintf-js": "~1.0.2" } }, - "bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "requires": { - "readable-stream": "~1.0.26" + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "regenerator-runtime": "^0.13.4" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "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==" }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "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==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "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=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "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==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "array-iterate": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", + "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "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==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "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==", "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" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - } + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + } }, - "bowser": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", - "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "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==", "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "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==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } + "safer-buffer": "~2.1.0" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "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" + "object-assign": "^4.1.1", + "util": "0.10.3" }, "dependencies": { - "extend-shallow": { + "inherits": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { - "is-extendable": "^0.1.0" + "inherits": "2.0.1" } } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "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==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, - "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==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" }, - "browserify-fs": { + "astral-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", - "requires": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" - } + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "async-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", + "integrity": "sha1-SppaidBl7F2OUlS9nulrp2xTK1o=", "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" + "lru-cache": "^4.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==", - "requires": { - "pako": "~1.0.5" - } + "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==" }, - "browserslist": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", - "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "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==" + }, + "async-retry-ng": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-retry-ng/-/async-retry-ng-2.0.1.tgz", + "integrity": "sha512-iitlc2murdQ3/A5Re3CcplQBEf7vOmFrFQ6RFn3+/+zZUyIHYkZnnEziMSa6YIb2Bs2EJEPZWReTxjHqvQbDbw==" + }, + "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==" + }, + "auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "requires": { - "caniuse-lite": "^1.0.30001038", - "electron-to-chromium": "^1.3.390", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" }, "dependencies": { "caniuse-lite": { - "version": "1.0.30001038", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", - "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==" - }, - "electron-to-chromium": { - "version": "1.3.395", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz", - "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw==" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } + "version": "1.0.30001112", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz", + "integrity": "sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==" }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { - "p-try": "^1.0.0" + "has-flag": "^3.0.0" } + } + } + }, + "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=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "axe-core": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", + "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==" + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "p-limit": "^1.1.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, - "pkg-up": { + "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "^2.1.0" - } + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" } }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-es6": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", - "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "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==" - }, - "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==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" - }, - "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=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "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" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" }, "dependencies": { - "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==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { - "yallist": "^3.0.2" + "minimist": "^1.2.0" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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==", "requires": { - "glob": "^7.1.3" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } } } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "babel-plugin-add-module-exports": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.3.3.tgz", + "integrity": "sha512-hC37mm7aAdEb1n8SgggG8a1QuhZapsY/XLCi4ETSH6AVjXBCWEa50CXlOsAMPPWLnSx5Ns6mzz39uvuseh0Xjg==", "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" + "chokidar": "^2.0.4" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": 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" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + } } }, - "cache-manager": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", - "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", + "babel-plugin-apply-mdx-type-prop": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.8.tgz", + "integrity": "sha512-xYp5F9mAnZdDRFSd1vF3XQ0GQUbIulCpnuht2jCmK30GAHL8szVL7TgzwhEGamQ6yJmP/gEyYNM9OR5D2n26eA==", "requires": { - "async": "1.5.2", - "lodash.clonedeep": "4.5.0", - "lru-cache": "4.0.0" + "@babel/helper-plugin-utils": "7.8.3", + "@mdx-js/util": "^1.5.8" } }, - "cache-manager-fs-hash": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/cache-manager-fs-hash/-/cache-manager-fs-hash-0.0.7.tgz", - "integrity": "sha512-7X+FPItAJf1tKKqJx6ljDJQc0fgSR5B+KPxFQLj+vYSL4q9XdrCbZldgsNb6wueRuIooj01wt0FubB08zaefRg==", + "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==", "requires": { - "es6-promisify": "^6.0.0", - "lockfile": "^1.0.4" + "object.assign": "^4.1.0" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "babel-plugin-emotion": { + "version": "10.0.33", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", + "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" - } + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "babel-plugin-extract-export-names": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-export-names/-/babel-plugin-extract-export-names-2.0.0-next.7.tgz", + "integrity": "sha512-CTsKh5l99oBd5jemej5BHdzxwaXDYNi3zryGEHaCcO6h3H6OAx7sQyHV76yO7eWHXFBc+t30YSuubpwJQwLHhg==", "requires": { - "callsites": "^2.0.0" + "@babel/helper-plugin-utils": "7.10.4" }, "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "babel-plugin-extract-import-names": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.8.tgz", + "integrity": "sha512-LcLfP8ZRBZMdMAXHLugyvvd5PY0gMmLMWFogWAUsG32X6TYW2Eavx+il2bw73KDbW+UdCC1bAJ3NuU25T1MI3g==", "requires": { - "caller-callsite": "^2.0.0" + "@babel/helper-plugin-utils": "7.8.3" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "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==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001025", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz", - "integrity": "sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "ccount": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", - "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" } }, - "change-case": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", - "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", + "babel-plugin-preval": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz", + "integrity": "sha512-s8hmTlRSmzcL7cHSIi0s6WxmpOAxfIlWqSVQwBIt7V5bNBaac+8JMZ6kJXLOazMJ8gCIcb5AJgQUgPHvbSYUzw==", "requires": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" + "babel-plugin-macros": "^2.2.2", + "require-from-string": "^2.0.2" } }, - "change-emitter": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", - "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + "babel-plugin-remove-export-keywords": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-export-keywords/-/babel-plugin-remove-export-keywords-1.6.16.tgz", + "integrity": "sha512-JrB9ZASlMAfkRF+5NdgoQxgenhJxzXFEO1vrqsSDJdzLrC38L2wrvXF9mm1YLbrehkZxcrNz9UYDyARP4jaY9g==" }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + "babel-plugin-remove-graphql-queries": { + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.16.tgz", + "integrity": "sha512-7Z+awkeghPRk4axY8N6ywQu9GpxpqHTkXRiZ+VxDaIppbybeZsAQ7uA6B4B63M4nm0BSOrHZzZWuT/kOg2RA8g==" }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, - "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "babel-preset-gatsby": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.5.5.tgz", + "integrity": "sha512-gkBRAEv5OvSerqh15gMHCCtExiUpTuKiKwb6QBImb3nSBAuCcjr0ESHzpgk4m0eZLbxUaeooVd0uPyC6FQsCBQ==", "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" + "@babel/plugin-proposal-class-properties": "^7.10.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.10.3", + "@babel/plugin-transform-spread": "^7.10.1", + "@babel/preset-env": "^7.10.3", + "@babel/preset-react": "^7.10.1", + "@babel/runtime": "^7.10.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24", + "gatsby-core-utils": "^1.3.15", + "gatsby-legacy-polyfills": "^0.0.2" }, "dependencies": { - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "@babel/highlight": "^7.10.4" } }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" } }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "requires": { - "fill-range": "^7.0.1" + "@babel/types": "^7.10.4" } }, - "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==", + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "requires": { - "to-regex-range": "^5.0.1" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "requires": { - "is-glob": "^4.0.1" + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" } }, - "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==", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "requires": { - "binary-extensions": "^2.0.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "picomatch": "^2.0.4" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "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==", + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "is-number": "^7.0.0" + "@babel/types": "^7.10.4" } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.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==", - "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=", + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "requires": { - "is-descriptor": "^0.1.0" + "@babel/types": "^7.10.4" } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "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==", - "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==" - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinners": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", - "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", - "optional": true - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "optional": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "optional": true }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "optional": true, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "@babel/types": "^7.11.0" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "optional": true + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } }, - "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==", - "optional": true, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "requires": { - "color-name": "~1.1.4" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" } }, - "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==", - "optional": true + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } }, - "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==", - "optional": true + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "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==", - "optional": true + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "requires": { + "lodash": "^4.17.19" + } }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "optional": true, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "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==", - "optional": true, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "optional": true, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "requires": { - "ansi-regex": "^5.0.0" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", - "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "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" + "@babel/types": "^7.11.0" } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "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==" }, - "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==", + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "ansi-regex": "^4.1.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } - } - } - }, - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=" - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", "requires": { - "is-buffer": "^1.1.5" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" } - } - } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", + "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", + "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", + "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.10.4", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/plugin-transform-react-jsx-development": "^7.10.4", + "@babel/plugin-transform-react-jsx-self": "^7.10.4", + "@babel/plugin-transform-react-jsx-source": "^7.10.4", + "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "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=" + } + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + } + } + }, + "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=", + "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==" + } + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "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==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "better-opn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-1.0.0.tgz", + "integrity": "sha512-q3eO2se4sFbTERB1dFBDdjTiIIpRohMErpwBX21lhPvmgmQNNrcQj0zbWRhMREDesJvyod9kxBS3kOtdAvkB/A==", + "requires": { + "open": "^6.4.0" + } + }, + "better-queue": { + "version": "3.8.10", + "resolved": "https://registry.npmjs.org/better-queue/-/better-queue-3.8.10.tgz", + "integrity": "sha512-e3gwNZgDCnNWl0An0Tz6sUjKDV9m6aB+K9Xg//vYeo8+KiH8pWhLFxkawcXhm6FpM//GfD9IQv/kmvWCAVVpKA==", + "requires": { + "better-queue-memory": "^1.0.1", + "node-eta": "^0.9.0", + "uuid": "^3.0.0" + } + }, + "better-queue-memory": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/better-queue-memory/-/better-queue-memory-1.0.4.tgz", + "integrity": "sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", + "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + "requires": { + "readable-stream": "~1.0.26" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "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==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "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" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "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==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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==", + "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=", + "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=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.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==", + "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==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", + "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", + "requires": { + "level-filesystem": "^1.0.1", + "level-js": "^2.1.3", + "levelup": "^0.18.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=", + "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=", + "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==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "requires": { + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001112", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz", + "integrity": "sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==" + }, + "electron-to-chromium": { + "version": "1.3.526", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.526.tgz", + "integrity": "sha512-HiroW5ZbGwgT8kCnoEO8qnGjoTPzJxduvV/Vv/wH63eo2N6Zj3xT5fmmaSPAPUM05iN9/5fIEkIg3owTtV6QZg==" + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + } + } + }, + "buble-jsx-only": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/buble-jsx-only/-/buble-jsx-only-0.19.8.tgz", + "integrity": "sha512-7AW19pf7PrKFnGTEDzs6u9+JZqQwM1VnLS19OlqYDhXomtFFknnoQJAPHeg84RMFWAvOhYrG7harizJNwUKJsA==", + "requires": { + "acorn": "^6.1.1", + "acorn-dynamic-import": "^4.0.0", + "acorn-jsx": "^5.0.1", + "chalk": "^2.4.2", + "magic-string": "^0.25.3", + "minimist": "^1.2.0", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + } + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-es6": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", + "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "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==" + }, + "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==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" + }, + "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=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "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" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-manager": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", + "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", + "requires": { + "async": "1.5.2", + "lodash.clonedeep": "4.5.0", + "lru-cache": "4.0.0" + } + }, + "cache-manager-fs-hash": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/cache-manager-fs-hash/-/cache-manager-fs-hash-0.0.9.tgz", + "integrity": "sha512-G0RUUSMZADiMx/0tHjPa+uzJyjtVB/Xt9yuFm6g/rBpm0p/IMr4atUWX2G2f1yGCPmDnyUcFz4RlSpgNRgvldg==", + "requires": { + "lockfile": "^1.0.4" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "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=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "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==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001025", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz", + "integrity": "sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ==" + }, + "case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "ccount": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", + "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "change-case": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", + "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-html4": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "dependencies": { + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.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==", + "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=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "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==", + "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==" + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==" + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "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==" + }, + "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==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + }, + "clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", + "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=" + }, + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "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==", + "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=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "optional": 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" + } + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "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==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "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==" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "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==", + "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==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concurrently": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz", + "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", + "requires": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.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==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "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==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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==" + }, + "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==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "requires": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "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==" + }, + "contentful-management": { + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/contentful-management/-/contentful-management-5.28.0.tgz", + "integrity": "sha512-o+qihN3zrD6+/BT/e8n26jl/zQvmV6+9S6NY5QDmzM+IaiSeCk6yvPMq74s+IZT9mOS54igl6qFTbeIpdJ9FDA==", + "requires": { + "axios": "^0.19.0", + "contentful-sdk-core": "^6.4.0", + "lodash": "^4.17.11", + "type-fest": "0.15.1" + }, + "dependencies": { + "type-fest": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.15.1.tgz", + "integrity": "sha512-n+UXrN8i5ioo7kqT/nF8xsEzLaqFra7k32SEsSPwvXVGyAcRgV/FUQN/sgfptJTR1oRmmq7z4IXMFSM7im7C9A==" + } + } + }, + "contentful-sdk-core": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-6.4.5.tgz", + "integrity": "sha512-rygNuiwbG6UKrJg6EDlaKewayTeLWrjA2wJwVmq7rV/DYo0cic6t28y0EMhRQ4pgJDV5HyUQFoFeBm2lwLfG2Q==", + "requires": { + "lodash": "^4.17.10", + "qs": "^6.5.2" + } + }, + "convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==" + }, + "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==", + "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==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "clone-response": { + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "copyfiles": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.3.0.tgz", + "integrity": "sha512-73v7KFuDFJ/ofkQjZBMjMBFWGgkS76DzXvBMUh7djsMOE5EELWtAO/hRB6Wr5Vj5Zg+YozvoHemv0vnXpqxmOQ==", + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "yargs": "^15.3.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "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==" + }, + "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==", + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", + "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", + "requires": { + "caniuse-lite": "^1.0.30001023", + "electron-to-chromium": "^1.3.341", + "node-releases": "^1.1.47" + } + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" + }, + "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "requires": { - "mimic-response": "^1.0.0" + "object-assign": "^4", + "vary": "^1" } }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, - "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=" + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + "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==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "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==", "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "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" + } + }, + "create-react-context": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", + "requires": { + "gud": "^1.0.0", + "warning": "^4.0.3" + } + }, + "cross-fetch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz", + "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=", + "requires": { + "node-fetch": "2.1.2", + "whatwg-fetch": "2.0.4" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "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==", + "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" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-b64-images": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz", + "integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=" + }, + "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=" + }, + "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==", + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "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==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" } }, - "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==", - "requires": { - "color-name": "1.1.3" - } + "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==" }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "css-selector-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.3.0.tgz", + "integrity": "sha1-XxrUPi2O77/cME/NOaUhZklD4+s=" }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" } }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "optional": 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==", + "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==", "requires": { - "delayed-stream": "~1.0.0" + "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==" + } } }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" - }, - "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==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "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==" + "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==" }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "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" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "requires": { - "ms": "2.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, - "ms": { + "import-fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "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=" } } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "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==", + "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=" + }, + "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=" + }, + "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==", + "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==" + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "csstype": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", + "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "array-find-index": "^1.0.1" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d3": { + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.1.tgz", + "integrity": "sha512-Xu9gT6Lm0jH3wWJJSRomFwqnGGi3YAfWIfxNFl4++YVgYOjo3F8V2idAG3nJBgpZOkD0/RHPZX6F4k6tzgOvYw==", "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" } }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" }, - "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==" + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } }, - "constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", "requires": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" + "d3-array": "1", + "d3-path": "1" } }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", "requires": { - "safe-buffer": "5.1.2" + "d3-array": "^1.1.1" } }, - "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==" - }, - "convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==" + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" }, - "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==", + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", "requires": { - "safe-buffer": "~5.1.1" + "d3-dispatch": "1", + "d3-selection": "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==" + "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" + } }, - "cookie-signature": { + "d3-ease": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } + "d3-dsv": "1" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", "requires": { - "toggle-selection": "^1.0.6" + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" } }, - "copyfiles": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.2.0.tgz", - "integrity": "sha512-iJbHJI+8OKqsq+4JF0rqgRkZzo++jqO6Wf4FUU1JM41cJF6JcY5968XyF4tm3Kkm7ZOMrqlljdm8N9oyY5raGw==", + "d3-format": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", + "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" + }, + "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": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^0.5.1", - "noms": "0.0.0", - "through2": "^2.0.1", - "yargs": "^13.2.4" + "d3-array": "1" } }, - "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==" + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" }, - "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==", + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", "requires": { - "browserslist": "^4.8.3", - "semver": "7.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", - "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" - } - }, - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } + "d3-color": "1" } }, - "core-js-pure": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", - "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==" + "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==" }, - "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=" + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "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-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", "requires": { - "object-assign": "^4", - "vary": "^1" + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" } }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" + "d3-color": "1", + "d3-interpolate": "1" } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "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==" + }, + "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": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "d3-path": "1" } }, - "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==", + "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": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "d3-time": "1" } }, - "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==", + "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==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", "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" + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" } }, - "create-react-context": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", - "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, - "cross-fetch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz", - "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=", + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" + "graphlib": "^2.1.8", + "lodash": "^4.17.15" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dagre-d3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", + "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "d3": "^5.14", + "dagre": "^0.8.5", + "graphlib": "^2.1.8", + "lodash": "^4.17.15" } }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" }, - "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==", + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "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" + "assert-plus": "^1.0.0" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + "dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" }, - "css-b64-images": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz", - "integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=" + "date-fns": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.15.0.tgz", + "integrity": "sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ==" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "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=" }, - "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=" + "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=" }, - "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==", + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" + "mimic-response": "^1.0.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==", + "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==", "requires": { - "hyphenate-style-name": "^1.0.2", - "isobject": "^3.0.1" + "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" } }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "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=" + }, + "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==", "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" }, "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } - }, - "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==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "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==" - }, - "css-selector-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.3.0.tgz", - "integrity": "sha1-XxrUPi2O77/cME/NOaUhZklD4+s=" + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, - "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "deferred-leveldown": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", + "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" + "abstract-leveldown": "~0.12.1" } }, - "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==", + "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==", "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==" - } + "object-keys": "^1.0.12" } }, - "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==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "kind-of": "^6.0.0" } }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "kind-of": "^6.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=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "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=" - } - } - }, - "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==", - "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" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } } }, - "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=" - }, - "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=" - }, - "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==", + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", "requires": { - "postcss": "^7.0.0" + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.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==" + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", - "requires": { - "css-tree": "1.0.0-alpha.37" - } + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true }, - "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } + "deprecated-decorator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", + "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" }, - "cyclist": { + "des.js": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "d3": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.1.tgz", - "integrity": "sha512-Xu9gT6Lm0jH3wWJJSRomFwqnGGi3YAfWIfxNFl4++YVgYOjo3F8V2idAG3nJBgpZOkD0/RHPZX6F4k6tzgOvYw==", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "d3-brush": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", - "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "detab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz", + "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==", "requires": { - "d3-array": "1", - "d3-path": "1" + "repeat-string": "^1.5.4" } }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "d3-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", - "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "detect-newline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-1.0.3.tgz", + "integrity": "sha1-6XsQA4d9cMCa8a81v63/Fo3kkg0=", "requires": { - "d3-array": "^1.1.1" + "get-stdin": "^4.0.1", + "minimist": "^1.1.0" } }, - "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, - "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "detect-node-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.0.0.tgz", + "integrity": "sha512-S4AHriUkTX9FoFvL4G8hXDcx6t3gp2HpfCza3Q0v6S78gul2hKWifLQbeW+ZF89+hSm2ZIc/uF3J97ZgytgTRg==" + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, - "d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "devcert": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.1.2.tgz", + "integrity": "sha512-B72N5Z2Lzu11dsPvg/KD9IwQCyNg6JgsNcHw7zJ+QQN9/rusMpc0tSSOYLczmty5D7vOs94IHITPQ0uei5D3cw==", "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" + "@types/configstore": "^2.1.1", + "@types/debug": "^0.0.30", + "@types/get-port": "^3.2.0", + "@types/glob": "^5.0.34", + "@types/lodash": "^4.14.92", + "@types/mkdirp": "^0.5.2", + "@types/node": "^8.5.7", + "@types/rimraf": "^2.0.2", + "@types/tmp": "^0.0.33", + "application-config-path": "^0.1.0", + "command-exists": "^1.2.4", + "configstore": "^3.0.0", + "debug": "^3.1.0", + "eol": "^0.9.1", + "get-port": "^3.2.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "password-prompt": "^1.0.4", + "rimraf": "^2.6.2", + "sudo-prompt": "^8.2.0", + "tmp": "^0.0.33", + "tslib": "^1.10.0" + }, + "dependencies": { + "@types/glob": { + "version": "5.0.36", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.36.tgz", + "integrity": "sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/node": { + "version": "8.10.62", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz", + "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw==" + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + } } }, - "d3-ease": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", - "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==" }, - "d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "d3-dsv": "1" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "path-type": "^4.0.0" } }, - "d3-format": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", - "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, - "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==", + "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==", "requires": { - "d3-array": "1" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, - "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==", + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "d3-color": "1" + "buffer-indexof": "^1.0.0" } }, - "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-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "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-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "esutils": "^2.0.2" } }, - "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { - "d3-color": "1", - "d3-interpolate": "1" + "utila": "~0.4" } }, - "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==" - }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { - "d3-path": "1" + "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==" + } } }, - "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, - "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" - } + "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==" }, - "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==" + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, - "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "domelementtype": "1" } - }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "dom-serializer": "0", + "domelementtype": "1" } }, - "dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", "requires": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" + "no-case": "^2.2.0" } }, - "dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", + "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==", "requires": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" + "is-obj": "^2.0.0" } }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { - "assert-plus": "^1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } }, - "date-fns": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.11.1.tgz", - "integrity": "sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w==" + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "electron-to-chromium": { + "version": "1.3.345", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz", + "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==" + }, + "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==", "requires": { - "ms": "^2.1.1" + "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" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "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==" }, - "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=" + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "mimic-response": "^1.0.0" + "iconv-lite": "~0.4.13" } }, - "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==", + "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==", "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" + "once": "^1.4.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "engine.io": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } }, - "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=" + "engine.io-client": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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==", "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" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } } } }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" }, - "deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", + "envinfo": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.2.tgz", + "integrity": "sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg==" + }, + "eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "abstract-leveldown": "~0.12.1" + "prr": "~1.0.1" } }, - "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==", + "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==", "requires": { - "object-keys": "^1.0.12" + "is-arrayish": "^0.2.1" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "stackframe": "^1.1.1" } }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "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==", "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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=" + }, + "escaper": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/escaper/-/escaper-2.5.3.tgz", + "integrity": "sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ==" + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "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": { - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "path-type": "^4.0.0" - } - }, - "fast-glob": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", - "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "ms": "^2.1.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==", + "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==", "requires": { - "to-regex-range": "^5.0.1" + "eslint-visitor-keys": "^1.1.0" } }, "glob-parent": { @@ -5923,115 +9141,59 @@ "is-glob": "^4.0.1" } }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "type-fest": "^0.8.1" } }, "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "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==", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "is-number": "^7.0.0" + "ansi-regex": "^4.1.0" } + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "optional": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "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=" - }, - "detab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz", - "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==", + "eslint-config-react-app": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", + "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", "requires": { - "repeat-string": "^1.5.4" + "confusing-browser-globals": "^1.0.9" } }, - "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" - }, - "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" + "debug": "^2.6.9", + "resolve": "^1.13.1" }, "dependencies": { "debug": { @@ -6049,897 +9211,995 @@ } } }, - "devcert": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.1.0.tgz", - "integrity": "sha512-ppyIBJueMMisYvJABaXESY10CwEm1pUXoLOm6TeBO2bbDUQE8ZjJPNADlu31I2InL7hduSgratzRG/dHUDF41w==", + "eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", + "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", "requires": { - "@types/configstore": "^2.1.1", - "@types/debug": "^0.0.30", - "@types/get-port": "^3.2.0", - "@types/glob": "^5.0.34", - "@types/lodash": "^4.14.92", - "@types/mkdirp": "^0.5.2", - "@types/node": "^8.5.7", - "@types/rimraf": "^2.0.2", - "@types/tmp": "^0.0.33", - "application-config-path": "^0.1.0", - "command-exists": "^1.2.4", - "configstore": "^3.0.0", - "debug": "^3.1.0", - "eol": "^0.9.1", - "get-port": "^3.2.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "password-prompt": "^1.0.4", - "rimraf": "^2.6.2", - "sudo-prompt": "^8.2.0", - "tmp": "^0.0.33", - "tslib": "^1.10.0" + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" }, "dependencies": { - "@types/glob": { - "version": "5.0.36", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.36.tgz", - "integrity": "sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" + "glob": "^7.1.3" } - }, - "@types/node": { - "version": "8.10.59", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", - "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==" - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "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==", "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "ms": "2.0.0" } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "is-obj": "^1.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "make-dir": { + "p-limit": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "pify": "^3.0.0" + "p-try": "^1.0.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "glob": "^7.1.3" + "p-limit": "^1.1.0" } }, - "unique-string": { + "p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", + "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "requires": { + "lodash": "^4.17.15" + } + }, + "eslint-plugin-graphql": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.1.1.tgz", + "integrity": "sha512-VNu2AipS8P1BAnE/tcJ2EmBWjFlCnG+1jKdUlFNDQjocWZlFiPpMu9xYNXePoEXK+q+jG51M/6PdhOjEgJZEaQ==", + "requires": { + "graphql-config": "^2.0.1", + "lodash": "^4.11.1" + } + }, + "eslint-plugin-import": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { - "crypto-random-string": "^1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "path-parse": "^1.0.6" } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "eslint-plugin-jsx-a11y": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", + "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "@babel/runtime": "^7.10.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^3.5.4", + "axobject-query": "^2.1.2", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1", + "language-tags": "^1.0.5" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "emoji-regex": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", + "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==" + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "eslint-plugin-react": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.5.tgz", + "integrity": "sha512-ajbJfHuFnpVNJjhyrfq+pH1C0gLc2y94OiCbAXT5O0J0YCKaFEHDV8+3+mDOr+w8WguRX+vSs1bM2BDG0VLvCw==", "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1", + "object.entries": "^1.1.2", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.17.0", + "string.prototype.matchall": "^4.0.2" }, "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "pify": "^3.0.0" + "esutils": "^2.0.2" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } } } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "eslint-plugin-react-hooks": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" }, - "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==", + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { - "buffer-indexof": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "requires": { - "utila": "~0.4" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "estraverse": "^5.1.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==" + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" } } }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "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==" - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "estraverse": "^4.1.0" } }, - "dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", - "requires": { - "no-case": "^2.2.0" - } + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, - "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==", - "requires": { - "is-obj": "^2.0.0" - } + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "duplexer3": { + "eval": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "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=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.345", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz", - "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==" - }, - "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==", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.4.tgz", + "integrity": "sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw==", "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" + "require-like": ">= 0.1.1" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "event-source-polyfill": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.16.tgz", + "integrity": "sha512-8Uw+cbuKGC8NwA2EW5zV95qmyvrxQcFlVjaZcK1NpJD/M+4aSIGhLobsY8L5QXRQ7+oVX4jA0FcyTgdlv8C0TA==" }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { - "iconv-lite": "~0.4.13" + "original": ">=0.0.5" } }, - "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==", + "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==", "requires": { - "once": "^1.4.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "engine.io": { + "execa": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", - "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "0.3.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { - "ms": "^2.1.1" + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" } } } }, - "engine.io-client": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", - "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "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==", + "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": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "express-graphql": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.9.0.tgz", + "integrity": "sha512-wccd9Lb6oeJ8yHpUs/8LcnGjFUUQYmOG9A5BNLybRdCzGw0PeUrtBxsIR8bfiur6uSW4OvPkVDoYH06z6/N9+w==", + "requires": { + "accepts": "^1.3.7", + "content-type": "^1.0.4", + "http-errors": "^1.7.3", + "raw-body": "^2.4.1" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", "requires": { - "async-limiter": "~1.0.0" + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + } } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" } } }, - "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "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==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "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==", + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "is-plain-object": "^2.0.4" } } } }, - "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" - }, - "envinfo": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.0.tgz", - "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==" - }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "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==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "requires": { - "stackframe": "^1.1.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==", - "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==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.0.tgz", - "integrity": "sha512-jCsk2fpfEFusVv1MDkF4Uf0hAzIKNDMgR6LyOIw6a3jwkN1sCgWzuwgnsHY9YSQ8n8P31HoncvE0LC44cpWTrw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=" - }, - "escaper": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/escaper/-/escaper-2.5.3.tgz", - "integrity": "sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ==" - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "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" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.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==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "color-name": "~1.1.4" + "os-tmpdir": "~1.0.2" } - }, - "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==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.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=", "requires": { - "ms": "^2.1.1" + "is-descriptor": "^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==" - }, - "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==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "eslint-visitor-keys": "^1.1.0" + "is-extendable": "^0.1.0" } }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "escape-string-regexp": "^1.0.5" + "kind-of": "^6.0.0" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "is-glob": "^4.0.1" + "kind-of": "^6.0.0" } }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "type-fest": "^0.8.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + } + } + }, + "extract-files": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-7.0.0.tgz", + "integrity": "sha512-3AUlT7TD+DbQXNe3t70QrgJU6Wgcp7rk1Zm0vqWz8OYnw4vxihgG0TgZ2SIGrVqScc4WfOu7B4a0BezGJ0YqvQ==" + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "ms": "2.0.0" } }, - "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==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "mimic-fn": "^2.1.0" + "minimist": "^1.2.5" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "fill-range": "^7.0.1" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "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==", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { - "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" - } - } + "to-regex-range": "^5.0.1" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "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==" - } + "is-glob": "^4.0.1" } }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "requires": { - "has-flag": "^4.0.0" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "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==" + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastest-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz", + "integrity": "sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg=" + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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=" } } }, - "eslint-config-react-app": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", - "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", + "fd": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/fd/-/fd-0.0.3.tgz", + "integrity": "sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "requires": { - "confusing-browser-globals": "^1.0.9" + "pend": "~1.2.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==", + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "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==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "requires": { - "ms": "2.0.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "eslint-loader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", - "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", + "file-type": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "filesize": { + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", + "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "glob": "^7.1.3" + "is-extendable": "^0.1.0" } } } }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "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": { @@ -6950,2118 +10210,2239 @@ "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=", - "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=", - "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=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "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=", - "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=" - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } } } }, - "eslint-plugin-flowtype": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", - "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { - "lodash": "^4.17.15" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, - "eslint-plugin-graphql": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.1.1.tgz", - "integrity": "sha512-VNu2AipS8P1BAnE/tcJ2EmBWjFlCnG+1jKdUlFNDQjocWZlFiPpMu9xYNXePoEXK+q+jG51M/6PdhOjEgJZEaQ==", + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "graphql-config": "^2.0.1", - "lodash": "^4.11.1" + "locate-path": "^3.0.0" } }, - "eslint-plugin-import": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", - "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "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" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "glob": "^7.1.3" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "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==", "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, - "eslint-plugin-react": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", - "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "fn-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", + "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=" + }, + "focus-lock": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.7.0.tgz", + "integrity": "sha512-LI7v2mH02R55SekHYdv9pRHR9RajVNyIJ2N5IEkWbg7FT5ZmJ9Hw4mWxHeEUcd+dJo0QmzztHvDvWcc7prVFsw==" + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.15.1", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.2", - "xregexp": "^4.3.0" + "debug": "=3.1.0" }, "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "esutils": "^2.0.2" + "ms": "2.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "for-in": "^1.0.1" } }, - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, - "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==" + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "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==", "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", - "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "formik": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.1.5.tgz", + "integrity": "sha512-bWpo3PiqVDYslvrRjTq0Isrm0mFXHiO33D8MS6t6dWcqSFGeYF52nlpCM2xwOJ6tRVRznDkL+zz/iHPL4LDuvQ==", "requires": { - "estraverse": "^5.0.0" + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.14", + "lodash-es": "^4.17.14", + "react-fast-compare": "^2.0.1", + "scheduler": "^0.18.0", + "tiny-warning": "^1.0.2", + "tslib": "^1.10.0" }, "dependencies": { - "estraverse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", - "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==" + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" } } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "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==" - }, - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, - "eval": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.4.tgz", - "integrity": "sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw==", + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "require-like": ">= 0.1.1" + "map-cache": "^0.2.2" } }, - "event-source-polyfill": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.12.tgz", - "integrity": "sha512-WjOTn0LIbaN08z/8gNt3GYAomAdm6cZ2lr/QdvhTTEipr5KR6lds2ziUH+p/Iob4Lk6NClKhwPOmn1NjQEcJCg==" - }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "requires": { - "original": "^1.0.0" - } + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "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==", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } + }, + "fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=" + }, + "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==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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=", "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==", - "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=", - "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=", - "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=" - } + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, "requires": { - "homedir-polyfill": "^1.0.1" + "bindings": "^1.5.0", + "nan": "^2.12.1" } }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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=" + }, + "fwd-stream": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", + "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", "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" + "readable-stream": "~1.0.26-4" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "ms": "2.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, - "express-graphql": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.9.0.tgz", - "integrity": "sha512-wccd9Lb6oeJ8yHpUs/8LcnGjFUUQYmOG9A5BNLybRdCzGw0PeUrtBxsIR8bfiur6uSW4OvPkVDoYH06z6/N9+w==", - "requires": { - "accepts": "^1.3.7", - "content-type": "^1.0.4", - "http-errors": "^1.7.3", - "raw-body": "^2.4.1" + "gatsby": { + "version": "2.23.20", + "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.23.20.tgz", + "integrity": "sha512-ur5VkBVz3kXkS2lkfufTOuSvOaXdb6qs1WmyafMahwLVm3VlHvZQwhk5AV4yXZ8+zqGphHJcKtRBeCwIe6efsw==", + "requires": { + "@babel/code-frame": "^7.10.3", + "@babel/core": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/polyfill": "^7.8.7", + "@babel/runtime": "^7.10.3", + "@babel/traverse": "^7.10.3", + "@hapi/joi": "^15.1.1", + "@mikaelkristiansson/domready": "^1.0.10", + "@pieh/friendly-errors-webpack-plugin": "1.7.0-chalk-2", + "@pmmmwh/react-refresh-webpack-plugin": "^0.3.3", + "@reach/router": "^1.3.4", + "@types/http-proxy": "^1.17.4", + "@typescript-eslint/eslint-plugin": "^2.24.0", + "@typescript-eslint/parser": "^2.24.0", + "address": "1.1.2", + "autoprefixer": "^9.8.4", + "axios": "^0.19.2", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "^10.1.0", + "babel-loader": "^8.1.0", + "babel-plugin-add-module-exports": "^0.3.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "babel-plugin-remove-graphql-queries": "^2.9.12", + "babel-preset-gatsby": "^0.5.1", + "better-opn": "1.0.0", + "better-queue": "^3.8.10", + "bluebird": "^3.7.2", + "browserslist": "^4.12.2", + "cache-manager": "^2.11.1", + "cache-manager-fs-hash": "^0.0.9", + "chalk": "^2.4.2", + "chokidar": "3.4.0", + "common-tags": "^1.8.0", + "compression": "^1.7.4", + "convert-hrtime": "^3.0.0", + "copyfiles": "^2.3.0", + "core-js": "^2.6.11", + "cors": "^2.8.5", + "css-loader": "^1.0.1", + "date-fns": "^2.14.0", + "debug": "^3.2.6", + "del": "^5.1.0", + "detect-port": "^1.3.0", + "devcert": "^1.1.0", + "dotenv": "^8.2.0", + "eslint": "^6.8.0", + "eslint-config-react-app": "^5.2.1", + "eslint-loader": "^2.2.1", + "eslint-plugin-flowtype": "^3.13.0", + "eslint-plugin-graphql": "^3.1.1", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.2", + "eslint-plugin-react-hooks": "^1.7.0", + "event-source-polyfill": "^1.0.15", + "express": "^4.17.1", + "express-graphql": "^0.9.0", + "fast-levenshtein": "^2.0.6", + "file-loader": "^1.1.11", + "fs-exists-cached": "1.0.0", + "fs-extra": "^8.1.0", + "gatsby-cli": "^2.12.58", + "gatsby-core-utils": "^1.3.11", + "gatsby-graphiql-explorer": "^0.4.10", + "gatsby-link": "^2.4.11", + "gatsby-plugin-page-creator": "^2.3.15", + "gatsby-plugin-typescript": "^2.4.13", + "gatsby-react-router-scroll": "^3.0.10", + "gatsby-telemetry": "^1.3.18", + "glob": "^7.1.6", + "got": "8.3.2", + "graphql": "^14.6.0", + "graphql-compose": "^6.3.8", + "graphql-playground-middleware-express": "^1.7.18", + "hasha": "^5.2.0", + "http-proxy": "^1.18.1", + "invariant": "^2.2.4", + "is-relative": "^1.0.0", + "is-relative-url": "^3.0.0", + "is-wsl": "^2.2.0", + "jest-worker": "^24.9.0", + "json-loader": "^0.5.7", + "json-stringify-safe": "^5.0.1", + "latest-version": "5.1.0", + "lodash": "^4.17.15", + "md5-file": "^3.2.3", + "meant": "^1.0.1", + "micromatch": "^3.1.10", + "mime": "^2.4.6", + "mini-css-extract-plugin": "^0.8.2", + "mitt": "^1.2.0", + "mkdirp": "^0.5.1", + "moment": "^2.27.0", + "name-all-modules-plugin": "^1.0.1", + "normalize-path": "^2.1.1", + "null-loader": "^3.0.0", + "opentracing": "^0.14.4", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "p-defer": "^3.0.0", + "parseurl": "^1.3.3", + "physical-cpu-count": "^2.0.0", + "pnp-webpack-plugin": "^1.6.4", + "postcss-flexbugs-fixes": "^4.2.1", + "postcss-loader": "^3.0.0", + "prompts": "^2.3.2", + "prop-types": "^15.7.2", + "query-string": "^6.13.1", + "raw-loader": "^0.5.1", + "react-dev-utils": "^4.2.3", + "react-error-overlay": "^3.0.0", + "react-hot-loader": "^4.12.21", + "react-refresh": "^0.7.0", + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", + "semver": "^5.7.1", + "shallow-compare": "^1.2.2", + "signal-exit": "^3.0.3", + "slugify": "^1.4.4", + "socket.io": "^2.3.0", + "socket.io-client": "2.3.0", + "st": "^2.0.0", + "stack-trace": "^0.0.10", + "string-similarity": "^1.2.2", + "style-loader": "^0.23.1", + "terser-webpack-plugin": "^1.4.4", + "tmp": "^0.2.1", + "true-case-path": "^2.2.1", + "type-of": "^2.0.1", + "url-loader": "^1.1.2", + "util.promisify": "^1.0.1", + "uuid": "^3.4.0", + "v8-compile-cache": "^1.1.2", + "webpack": "~4.43.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-dev-server": "^3.11.0", + "webpack-hot-middleware": "^2.25.0", + "webpack-merge": "^4.2.2", + "webpack-stats-plugin": "^0.3.1", + "xstate": "^4.11.0", + "yaml-loader": "^0.6.0" }, "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "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==", + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "is-plain-object": "^2.0.4" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.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==", - "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==", - "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=", + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "is-descriptor": "^1.0.0" + "@babel/types": "^7.10.4" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "requires": { - "is-extendable": "^0.1.0" + "@babel/types": "^7.11.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==", + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "requires": { - "kind-of": "^6.0.0" + "@babel/types": "^7.10.4" } }, - "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==", + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "requires": { - "kind-of": "^6.0.0" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "@babel/types": "^7.10.4" } - } - } - }, - "extract-files": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-7.0.0.tgz", - "integrity": "sha512-3AUlT7TD+DbQXNe3t70QrgJU6Wgcp7rk1Zm0vqWz8OYnw4vxihgG0TgZ2SIGrVqScc4WfOu7B4a0BezGJ0YqvQ==" - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "requires": { - "ms": "2.0.0" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "requires": { - "minimist": "^1.2.5" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "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==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastest-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz", - "integrity": "sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "fastq": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", - "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "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=" - } - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "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==", - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } - } - } - }, - "file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "is-extendable": "^0.1.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "ms": "2.0.0" + "regenerator-runtime": "^0.13.4" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - } - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "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==", + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "glob": "^7.1.3" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "ms": "2.0.0" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "gatsby-cli": { + "version": "2.12.80", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.80.tgz", + "integrity": "sha512-B8KUYMnepRSGexV4XjWhVAUUXy6TsmvUElQ0E3OgyI9RxpoKsCprJzhG96A+Df7Rgx+cPkV1fGArbOjfxnF4lQ==", + "requires": { + "@babel/code-frame": "^7.10.3", + "@hapi/joi": "^15.1.1", + "@types/common-tags": "^1.8.0", + "better-opn": "^1.0.0", + "chalk": "^2.4.2", + "clipboardy": "^2.3.0", + "common-tags": "^1.8.0", + "configstore": "^5.0.1", + "convert-hrtime": "^3.0.0", + "envinfo": "^7.5.1", + "execa": "^3.4.0", + "fs-exists-cached": "^1.0.0", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.3.15", + "gatsby-recipes": "^0.2.10", + "gatsby-telemetry": "^1.3.26", + "hosted-git-info": "^3.0.4", + "ink": "^2.7.1", + "ink-spinner": "^3.1.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.15", + "meant": "^1.0.1", + "node-fetch": "^2.6.0", + "opentracing": "^0.14.4", + "pretty-error": "^2.1.1", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "react": "^16.8.0", + "redux": "^4.0.5", + "resolve-cwd": "^3.0.0", + "semver": "^6.3.0", + "signal-exit": "^3.0.3", + "source-map": "0.7.3", + "stack-trace": "^0.0.10", + "strip-ansi": "^5.2.0", + "update-notifier": "^4.1.0", + "uuid": "3.4.0", + "yargs": "^15.3.1", + "yurnalist": "^1.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "slugify": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.5.tgz", + "integrity": "sha512-WpECLAgYaxHoEAJ8Q1Lo8HOs1ngn7LN7QjXgOLbmmfkcWvosyk4ZTXkTzKyhngK640USTZUlgoQJfED1kz5fnQ==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "gatsby-core-utils": { + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.15.tgz", + "integrity": "sha512-np1tJCGejhCHtgHdFl6+y5EwVAzdrieJZ3hdvpeOrJ22bL9ktl5XVLy4K937ThgxHLp8+ElMDVdziNun5tC8eg==", "requires": { - "for-in": "^1.0.1" + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "xdg-basedir": "^4.0.0" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "gatsby-design-tokens": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/gatsby-design-tokens/-/gatsby-design-tokens-2.0.10.tgz", + "integrity": "sha512-W+BNx3IJqN8VgI/dRwlzKNqBNWw5rlESq6Jd2JNyarsw9wjsN+P5/+zJvPzFG4ALs5H9agA/6iLBX7JOSqZsuA==", + "requires": { + "hex2rgba": "^0.0.1" + } }, - "fork-ts-checker-webpack-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", - "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", + "gatsby-graphiql-explorer": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.4.12.tgz", + "integrity": "sha512-kHVHzGvebZlUGeGOoAAJVdLWAXftZiYeOk6EitWFkXEZtYxpgXM5Pum9qDMCzUCJ6pzS8r9U5IBJncjMal3ScQ==", "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^2.0.4", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" + "@babel/runtime": "^7.10.3" }, "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "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" + "regenerator-runtime": "^0.13.4" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "gatsby-interface": { + "version": "0.0.166", + "resolved": "https://registry.npmjs.org/gatsby-interface/-/gatsby-interface-0.0.166.tgz", + "integrity": "sha512-PN0lTVOKu50zfY7kfjgHvT5jsYZIOdSxuWrV/WVxDXo4O3oifLiWUyfFy8zg9T8S1G+TwRyfzhWT9Pfj1CZ2Dg==", + "requires": { + "@mdx-js/react": "^1.5.2", + "@reach/alert": "0.10.3", + "@reach/combobox": "0.10.3", + "@reach/dialog": "0.10.3", + "@reach/menu-button": "0.10.3", + "@reach/popover": "0.10.3", + "@reach/tabs": "0.10.3", + "@reach/tooltip": "0.10.3", + "@types/lodash.sample": "^4.2.6", + "case": "^1.6.2", + "date-fns": "^2.8.1", + "gatsby-design-tokens": "^2.0.2", + "lodash.sample": "^4.2.1", + "theme-ui": "^0.2.49" + } + }, + "gatsby-legacy-polyfills": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-0.0.2.tgz", + "integrity": "sha512-i8LLwvtupC92AjQMivLDKDCgN51sV6FLbtoNn0CRQJdLJY31P06k+5qKcjdprGLdPjCjkCsYLTYi08pdvqAuPw==", + "requires": { + "core-js-compat": "^3.6.5" + }, + "dependencies": { + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + } + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, - "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==", + "gatsby-link": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.4.13.tgz", + "integrity": "sha512-0qTM9JJvYZCsqAF/FLkChHwECbjl2DxUl8M0cYNgCDcaw5BI6PhF4FhuGUcr17dZ6KlpEMrpApaF5MMQqV0WSQ==", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@babel/runtime": "^7.10.3", + "@types/reach__router": "^1.3.3", + "prop-types": "^15.7.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "gatsby-page-utils": { + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.2.20.tgz", + "integrity": "sha512-waq2TpDjNxH5+Q+xFnuf9of3Xt0wxBkJwb6VbCGz4LS0XQ6c9KYMgC2OCBwPJOnv2Vo/6BglpRyn4lYcJEQJdw==", "requires": { - "map-cache": "^0.2.2" + "@babel/runtime": "^7.10.3", + "bluebird": "^3.7.2", + "chokidar": "3.4.0", + "fs-exists-cached": "^1.0.0", + "gatsby-core-utils": "^1.3.15", + "glob": "^7.1.6", + "lodash": "^4.17.15", + "micromatch": "^3.1.10" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "gatsby-plugin-emotion": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gatsby-plugin-emotion/-/gatsby-plugin-emotion-4.2.1.tgz", + "integrity": "sha512-ygXxkpnWJdDOAgb1XA9TbVCRLkaAYTFLTsqVQXMBhnrknb5iPNO+MP0fZ5LRqWgBALyJ629nxs0efUpnT/RSWw==", "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "@babel/runtime": "^7.8.7", + "@emotion/babel-preset-css-prop": "^10.0.27" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=" - }, - "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==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } + "gatsby-plugin-gtag": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/gatsby-plugin-gtag/-/gatsby-plugin-gtag-1.0.13.tgz", + "integrity": "sha512-Oul6O67klajrEjkkF1diD228SmyUWsAwTq/1tYq41vBwmyNiPk4dhk8K93rrNQ5d5zesSv+awBeGBa503tQqGw==" }, - "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=", + "gatsby-plugin-less": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gatsby-plugin-less/-/gatsby-plugin-less-3.1.1.tgz", + "integrity": "sha512-H0LQXy2DpwD1UW3bEuE8RHk2yNfOcZGFjzYH9URPUAzxuOo6bhPyNxKJ8tLcvarqwYiJIWFFivDMv0IqgBJ16Q==", "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "@babel/runtime": "^7.8.7", + "less-loader": "^5.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", - "optional": true, + "gatsby-plugin-mdx": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.1.4.tgz", + "integrity": "sha512-id2/LALN7eseTGN05v1n16XCYggrl2UTzWOJOQME9rh25jNK+KT5ywaPY6vNYimeAW7wWdad3rl6hORpv4L6yw==", "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" + "@babel/core": "^7.8.7", + "@babel/generator": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/preset-env": "^7.8.7", + "@babel/preset-react": "^7.8.3", + "@babel/types": "^7.8.7", + "camelcase-css": "^2.0.1", + "change-case": "^3.1.0", + "core-js": "2", + "dataloader": "^1.4.0", + "debug": "^4.1.1", + "escape-string-regexp": "^1.0.5", + "eval": "^0.1.4", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.1.1", + "gray-matter": "^4.0.2", + "json5": "^2.1.2", + "loader-utils": "^1.4.0", + "lodash": "^4.17.15", + "mdast-util-to-string": "^1.1.0", + "mdast-util-toc": "^3.1.0", + "mime": "^2.4.4", + "p-queue": "^5.0.0", + "pretty-bytes": "^5.3.0", + "remark": "^10.0.1", + "remark-retext": "^3.1.3", + "retext-english": "^3.0.4", + "static-site-generator-webpack-plugin": "^3.4.2", + "style-to-object": "^0.3.0", + "underscore.string": "^3.3.5", + "unified": "^8.4.2", + "unist-util-map": "^1.0.5", + "unist-util-remove": "^1.0.3", + "unist-util-visit": "^1.4.1" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" } }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "optional": true, + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "optional": true + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "optional": true + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "optional": true + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "optional": true + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } }, "debug": { - "version": "3.2.6", - "bundled": true, - "optional": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "optional": true, + "gatsby-core-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz", + "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==", "requires": { - "minipass": "^2.6.0" + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "node-object-hash": "^2.0.0" } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "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" + "minimist": "^1.2.5" } }, - "glob": { - "version": "7.1.6", - "bundled": true, - "optional": 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==", "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" + "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==", + "requires": { + "minimist": "^1.2.0" + } + } } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "unist-util-visit-parents": "^2.0.0" } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "optional": true, + } + } + }, + "gatsby-plugin-page-creator": { + "version": "2.3.20", + "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.20.tgz", + "integrity": "sha512-EtoKgXNXvkY5IA4XvBPhlM5TelR6R04e3fpcGWuYO4oqts/9Ih0GGI9CzUBRXNwM5MplNBUcUutyAwMtT9NzVA==", + "requires": { + "@babel/runtime": "^7.10.3", + "bluebird": "^3.7.2", + "fs-exists-cached": "^1.0.0", + "gatsby-page-utils": "^0.2.20", + "glob": "^7.1.6", + "lodash": "^4.17.15", + "micromatch": "^3.1.10" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "minimatch": "^3.0.4" + "regenerator-runtime": "^0.13.4" } }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "gatsby-plugin-printer": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz", + "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==", + "requires": { + "@sindresorhus/slugify": "^0.9.1", + "babel-plugin-preval": "^3.0.1", + "fs-extra": "^8.1.0", + "puppeteer": "^1.19.0", + "rollup": "1.23.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-commonjs": "^10.0.1", + "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-globals": "^1.4.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-replace": "^2.2.0" + } + }, + "gatsby-plugin-react-helmet": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.2.1.tgz", + "integrity": "sha512-5oarZdVvp3k3keG26eVFagVHLYw7wCGs/MXRYQg8MEyJewU3X4Uc0eo7qu4TM5EIuZ2ekaL14r86RB6RM5TORA==", + "requires": { + "@babel/runtime": "^7.8.7" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "regenerator-runtime": "^0.13.4" } }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "optional": true, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "gatsby-plugin-segment-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-segment-js/-/gatsby-plugin-segment-js-3.1.0.tgz", + "integrity": "sha512-oBcIY+riNehfyQXp8PEGVQTz/VPt/+k2aXCh/bNZSR4HhjEAXafcSCReS2xzs/3IJRa3gH0+NOZvRU8peXDb/w==" + }, + "gatsby-plugin-svgr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", + "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg==" + }, + "gatsby-plugin-typescript": { + "version": "2.4.17", + "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.17.tgz", + "integrity": "sha512-Bp0e2Nc3CYYfhYvvIO7DIZOzy6hlYDJFBE/rHPK9mu5RLX8THqNmT53579SJWx4ozSPCNK41EfPbAJdtEgEPaA==", + "requires": { + "@babel/core": "^7.10.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-numeric-separator": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.3", + "@babel/preset-typescript": "^7.10.1", + "@babel/runtime": "^7.10.3", + "babel-plugin-remove-graphql-queries": "^2.9.16" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "number-is-nan": "^1.0.0" + "@babel/highlight": "^7.10.4" } }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "optional": true, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "requires": { - "brace-expansion": "^1.1.7" + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "optional": true, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" } }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "optional": true, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "minipass": "^2.9.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "optional": true, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "minimist": "^1.2.5" + "@babel/types": "^7.10.4" } }, - "ms": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "optional": true, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "@babel/types": "^7.11.0" } }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "optional": true, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "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" + "@babel/types": "^7.10.4" } }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "optional": true, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" } }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "optional": true, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "npm-normalize-package-bin": "^1.0.1" + "@babel/types": "^7.10.4" } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "optional": true + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "optional": true, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "optional": true, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "wrappy": "1" + "@babel/types": "^7.11.0" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "optional": true + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "optional": true, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", "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" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "optional": true, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { - "glob": "^7.1.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true + "@babel/plugin-syntax-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", + "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true + "@babel/plugin-transform-typescript": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", + "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.10.4" + } }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "optional": true, + "@babel/preset-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz", + "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.10.4" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "safe-buffer": "~5.1.0" + "regenerator-runtime": "^0.13.4" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "optional": true, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "ansi-regex": "^2.0.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } }, - "tar": { - "version": "4.4.13", - "bundled": true, - "optional": true, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "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" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { - "string-width": "^1.0.2 || 2" + "minimist": "^1.2.5" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "optional": true + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "optional": true + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "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=" - }, - "fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", + "gatsby-react-router-scroll": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-3.0.12.tgz", + "integrity": "sha512-rA7qe/LjKAPnwI4KdKjvx94XIV9a4hCPT+BzKBiifTkm5sFpQyXsfEWmaFfzIaxpKxOwrWsJGpW0OA39yunL8g==", "requires": { - "readable-stream": "~1.0.26-4" + "@babel/runtime": "^7.10.3" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "regenerator-runtime": "^0.13.4" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, - "gatsby": { - "version": "2.19.41", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.19.41.tgz", - "integrity": "sha512-vFEY8wXDafHM21xoDiI6ppktpnCKJSAOsZYj1vjko/mJgTm3Y6E50xlt7GU3UtLN5b8OE3KDHzBnnj2OQ18C4g==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/polyfill": "^7.7.0", - "@babel/runtime": "^7.7.6", - "@babel/traverse": "^7.7.4", + "gatsby-recipes": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.10.tgz", + "integrity": "sha512-4iL9ZaZxIk1qTHCq+bFhT7edFJVuyWLInQKwQLsxxHIzM5DcizB21Lw62lzAOcACLiXzmJTofgVQOw+17c6Yhw==", + "requires": { + "@babel/core": "^7.9.6", + "@babel/generator": "^7.9.6", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.4", + "@babel/plugin-transform-react-jsx": "^7.9.4", + "@babel/standalone": "^7.10.2", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.6", + "@emotion/core": "^10.0.14", + "@emotion/styled": "^10.0.14", + "@graphql-tools/schema": "^6.0.14", + "@graphql-tools/utils": "^6.0.14", + "@hapi/hoek": "8.x.x", "@hapi/joi": "^15.1.1", - "@mikaelkristiansson/domready": "^1.0.10", - "@pieh/friendly-errors-webpack-plugin": "1.7.0-chalk-2", - "@pmmmwh/react-refresh-webpack-plugin": "^0.2.0", - "@reach/router": "^1.3.1", - "@typescript-eslint/eslint-plugin": "^2.11.0", - "@typescript-eslint/parser": "^2.11.0", - "address": "1.1.2", - "autoprefixer": "^9.7.3", - "axios": "^0.19.0", - "babel-core": "7.0.0-bridge.0", - "babel-eslint": "^10.0.3", - "babel-loader": "^8.0.6", - "babel-plugin-add-module-exports": "^0.3.3", - "babel-plugin-dynamic-import-node": "^2.3.0", - "babel-plugin-remove-graphql-queries": "^2.7.24", - "babel-preset-gatsby": "^0.2.35", - "better-opn": "1.0.0", + "@mdx-js/mdx": "^2.0.0-next.4", + "@mdx-js/react": "^2.0.0-next.4", + "@mdx-js/runtime": "^2.0.0-next.4", + "acorn": "^7.2.0", + "acorn-jsx": "^5.2.0", + "ansi-html": "^0.0.7", + "babel-plugin-remove-export-keywords": "^1.6.5", "better-queue": "^3.8.10", - "bluebird": "^3.7.2", - "browserslist": "^4.9.1", - "cache-manager": "^2.10.1", - "cache-manager-fs-hash": "^0.0.7", - "chalk": "^2.4.2", - "chokidar": "3.3.0", - "common-tags": "^1.8.0", - "compression": "^1.7.4", - "convert-hrtime": "^3.0.0", - "copyfiles": "^2.1.1", - "core-js": "^2.6.11", + "chokidar": "3.4.0", + "concurrently": "^5.0.0", + "contentful-management": "^5.26.3", "cors": "^2.8.5", - "css-loader": "^1.0.1", - "date-fns": "^2.10.0", - "debug": "^3.2.6", - "del": "^5.1.0", + "debug": "^4.1.1", "detect-port": "^1.3.0", - "devcert": "^1.0.2", "dotenv": "^8.2.0", - "eslint": "^6.7.2", - "eslint-config-react-app": "^5.1.0", - "eslint-loader": "^2.2.1", - "eslint-plugin-flowtype": "^3.13.0", - "eslint-plugin-graphql": "^3.1.0", - "eslint-plugin-import": "^2.19.1", - "eslint-plugin-jsx-a11y": "^6.2.3", - "eslint-plugin-react": "^7.17.0", - "eslint-plugin-react-hooks": "^1.7.0", - "event-source-polyfill": "^1.0.11", + "execa": "^4.0.2", "express": "^4.17.1", "express-graphql": "^0.9.0", - "fast-levenshtein": "^2.0.6", - "file-loader": "^1.1.11", - "flat": "^4.1.0", - "fs-exists-cached": "1.0.0", + "flatted": "^3.0.0", + "formik": "^2.0.8", "fs-extra": "^8.1.0", - "gatsby-cli": "^2.10.9", - "gatsby-core-utils": "^1.0.33", - "gatsby-graphiql-explorer": "^0.2.35", - "gatsby-link": "^2.2.30", - "gatsby-plugin-page-creator": "^2.1.45", - "gatsby-react-router-scroll": "^2.1.23", - "gatsby-telemetry": "^1.1.55", + "gatsby-core-utils": "^1.3.15", + "gatsby-interface": "^0.0.166", + "gatsby-telemetry": "^1.3.26", "glob": "^7.1.6", - "got": "8.3.2", - "graphql": "^14.5.8", - "graphql-compose": "^6.3.7", - "graphql-playground-middleware-express": "^1.7.12", - "hasha": "^5.1.0", - "invariant": "^2.2.4", - "is-relative": "^1.0.0", - "is-relative-url": "^3.0.0", - "is-wsl": "^2.1.1", - "jest-worker": "^24.9.0", - "json-loader": "^0.5.7", - "json-stringify-safe": "^5.0.1", - "latest-version": "5.1.0", + "graphql": "^14.6.0", + "graphql-compose": "^6.3.8", + "graphql-subscriptions": "^1.1.0", + "graphql-type-json": "^0.3.2", + "hicat": "^0.7.0", + "html-tag-names": "^1.1.5", + "is-binary-path": "^2.1.0", + "is-url": "^1.2.4", + "isomorphic-fetch": "^2.1.0", + "jest-diff": "^25.5.0", "lodash": "^4.17.15", - "lokijs": "^1.5.8", - "md5": "^2.2.1", - "md5-file": "^3.2.3", - "micromatch": "^3.1.10", - "mime": "^2.4.4", - "mini-css-extract-plugin": "^0.8.0", "mitt": "^1.2.0", "mkdirp": "^0.5.1", - "moment": "^2.24.0", - "name-all-modules-plugin": "^1.0.1", - "normalize-path": "^2.1.1", - "null-loader": "^0.1.1", - "opentracing": "^0.14.4", - "optimize-css-assets-webpack-plugin": "^5.0.3", - "p-defer": "^3.0.0", - "parseurl": "^1.3.3", - "physical-cpu-count": "^2.0.0", - "pnp-webpack-plugin": "^1.5.0", - "postcss-flexbugs-fixes": "^4.2.0", - "postcss-loader": "^3.0.0", - "prompts": "^2.3.0", - "prop-types": "^15.7.2", - "raw-loader": "^0.5.1", - "react-dev-utils": "^4.2.3", - "react-error-overlay": "^3.0.0", - "react-hot-loader": "^4.12.18", - "react-refresh": "^0.7.0", - "redux": "^4.0.4", - "redux-thunk": "^2.3.0", - "semver": "^5.7.1", - "shallow-compare": "^1.2.2", - "sift": "^5.1.0", - "signal-exit": "^3.0.2", - "slugify": "^1.3.6", - "socket.io": "^2.3.0", - "stack-trace": "^0.0.10", - "string-similarity": "^1.2.2", - "style-loader": "^0.23.1", - "terser-webpack-plugin": "^1.4.2", - "true-case-path": "^2.2.1", - "type-of": "^2.0.1", - "url-loader": "^1.1.2", - "util.promisify": "^1.0.0", - "uuid": "^3.3.3", - "v8-compile-cache": "^1.1.2", - "webpack": "~4.41.2", - "webpack-dev-middleware": "^3.7.2", - "webpack-dev-server": "^3.9.0", - "webpack-hot-middleware": "^2.25.0", - "webpack-merge": "^4.2.2", - "webpack-stats-plugin": "^0.3.0", - "xstate": "^4.7.2", - "yaml-loader": "^0.5.0" + "node-fetch": "^2.5.0", + "normalize.css": "^8.0.1", + "pkg-dir": "^4.2.0", + "prettier": "^2.0.5", + "prop-types": "^15.6.1", + "property-information": "5.5.0", + "react-circular-progressbar": "^2.0.0", + "react-icons": "^3.0.1", + "react-reconciler": "^0.25.1", + "remark-mdx": "^2.0.0-next.4", + "remark-mdxjs": "^2.0.0-next.4", + "remark-parse": "^6.0.3", + "remark-stringify": "^8.1.0", + "resolve-cwd": "^3.0.0", + "semver": "^7.3.2", + "single-trailing-newline": "^1.0.0", + "strip-ansi": "^6.0.0", + "style-to-object": "^0.3.0", + "subscriptions-transport-ws": "^0.9.16", + "svg-tag-names": "^2.0.1", + "unified": "^8.4.2", + "unist-util-remove": "^2.0.0", + "unist-util-visit": "^2.0.2", + "urql": "^1.9.7", + "uuid": "^8.2.0", + "ws": "^7.3.0", + "xstate": "^4.9.1", + "yoga-layout-prebuilt": "^1.9.6", + "yup": "^0.27.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==" + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "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=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "@babel/types": "^7.10.4" } }, - "gatsby-cli": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.11.5.tgz", - "integrity": "sha512-yAvyplWx19dU5gYdWJETEMywbNTtL9HntlR65cHhznKiwrr6Jyao+TsE50CmgZ/8Vv2JMF3UZFd3vFRXb+aK7w==", + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/runtime": "^7.8.7", - "@hapi/joi": "^15.1.1", - "better-opn": "^1.0.0", - "bluebird": "^3.7.2", - "chalk": "^2.4.2", - "clipboardy": "^2.2.0", - "common-tags": "^1.8.0", - "configstore": "^5.0.1", - "convert-hrtime": "^3.0.0", - "core-js": "^2.6.11", - "envinfo": "^7.5.0", - "execa": "^3.4.0", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.1.1", - "gatsby-telemetry": "^1.2.3", - "hosted-git-info": "^3.0.4", - "ink": "^2.7.1", - "ink-spinner": "^3.0.1", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.15", - "meant": "^1.0.1", - "node-fetch": "^2.6.0", - "object.entries": "^1.1.1", - "opentracing": "^0.14.4", - "pretty-error": "^2.1.1", - "progress": "^2.0.3", - "prompts": "^2.3.1", - "react": "^16.8.0", - "redux": "^4.0.5", - "resolve-cwd": "^2.0.0", - "semver": "^6.3.0", - "signal-exit": "^3.0.2", - "source-map": "0.7.3", - "stack-trace": "^0.0.10", - "strip-ansi": "^5.2.0", - "update-notifier": "^3.0.1", - "uuid": "3.4.0", - "yargs": "^12.0.5", - "yurnalist": "^1.1.2" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" }, "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, - "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==" + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } }, - "hosted-git-info": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", - "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "requires": { - "lru-cache": "^5.1.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "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=", + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "requires": { - "number-is-nan": "^1.0.0" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "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==", + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "yallist": "^3.0.2" + "@babel/types": "^7.11.0" } }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "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=" + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", "requires": { - "ansi-regex": "^4.1.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } + } + }, + "@mdx-js/mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", + "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", + "requires": { + "@babel/core": "7.10.5", + "@babel/plugin-syntax-jsx": "7.10.4", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "^2.0.0-next.7", + "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", + "babel-plugin-extract-export-names": "^2.0.0-next.7", + "babel-plugin-extract-import-names": "^2.0.0-next.7", + "camelcase-css": "2.0.1", + "detab": "2.0.3", + "hast-to-hyperscript": "9.0.0", + "hast-util-raw": "6.0.0", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "9.1.0", + "remark-footnotes": "1.0.0", + "remark-mdx": "^2.0.0-next.7", + "remark-mdxjs": "^2.0.0-next.7", + "remark-parse": "8.0.2", + "remark-squeeze-paragraphs": "4.0.0", + "unified": "9.0.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "@babel/core": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "remark-parse": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", + "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "unified": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", + "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { - "ansi-regex": "^2.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" } } } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "@mdx-js/react": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", + "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "@mdx-js/util": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", + "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", + "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", "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" + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "^2.0.0-next.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "babel-plugin-extract-import-names": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", + "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } - } - } - }, - "gatsby-core-utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz", - "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "node-object-hash": "^2.0.0" - } - }, - "gatsby-graphiql-explorer": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.37.tgz", - "integrity": "sha512-dWfNA/CDjKO86DZLgxhYFSmK7DTCxwGvKm0HeMBYxcSyLP/WFAOoJjV2DCE2gMge28Sqmsz8ueOMZXM2YH8rIA==", - "requires": { - "@babel/runtime": "^7.8.7" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { - "regenerator-runtime": "^0.13.4" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "gatsby-link": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.3.2.tgz", - "integrity": "sha512-A4aC6EEux/zumpgWnMlqcLhDq80uwzuCVrYfPVBxs/fFifVzzrMIvsPFhqw5w3l5DHC3XkxP4Y3TZq+EhypJhA==", - "requires": { - "@babel/runtime": "^7.8.7", - "@types/reach__router": "^1.3.3", - "prop-types": "^15.7.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "regenerator-runtime": "^0.13.4" + "ms": "^2.1.1" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "gatsby-page-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.1.1.tgz", - "integrity": "sha512-g4ETSZM7wlMycHPKwQ7QqxkqnwbXCgwg2Sqh2DyCsd5qwtPm6RrQht3cnbsKAeuo7gWsbqzv088YGa3krrIREw==", - "requires": { - "@babel/runtime": "^7.8.7", - "bluebird": "^3.7.2", - "chokidar": "3.3.1", - "fs-exists-cached": "^1.0.0", - "gatsby-core-utils": "^1.1.1", - "glob": "^7.1.6", - "lodash": "^4.17.15", - "micromatch": "^3.1.10" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "requires": { - "regenerator-runtime": "^0.13.4" + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "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": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + "flatted": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.0.4.tgz", + "integrity": "sha512-4gZhsMc26tSiMgQ+0gRN818ST2KCkX/4EvqocCkE1+SRb7mapNk4KLSP+XAj02jc8rxuyD3DrmI3a0BQ/TNOpg==" }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { - "fill-range": "^7.0.1" + "pump": "^3.0.0" } }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "hast-to-hyperscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz", + "integrity": "sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg==", "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "hast-util-from-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz", + "integrity": "sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q==", "requires": { - "to-regex-range": "^5.0.1" + "@types/parse5": "^5.0.0", + "ccount": "^1.0.0", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0" } }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true + "hast-util-raw": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.0.tgz", + "integrity": "sha512-IQo6tv3bMMKxk53DljswliucCJOQxaZFCuKEJ7X80249dmJ1nA9LtOnnylsLlqTG98NjQ+iGcoLAYo9q5FRhRg==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", "requires": { - "is-glob": "^4.0.1" + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" } }, "is-binary-path": { @@ -9072,394 +12453,358 @@ "binary-extensions": "^2.0.0" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { - "picomatch": "^2.0.7" + "minimist": "^1.2.5" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, - "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==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "is-number": "^7.0.0" + "p-locate": "^4.1.0" } - } - } - }, - "gatsby-plugin-emotion": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-emotion/-/gatsby-plugin-emotion-4.2.1.tgz", - "integrity": "sha512-ygXxkpnWJdDOAgb1XA9TbVCRLkaAYTFLTsqVQXMBhnrknb5iPNO+MP0fZ5LRqWgBALyJ629nxs0efUpnT/RSWw==", - "requires": { - "@babel/runtime": "^7.8.7", - "@emotion/babel-preset-css-prop": "^10.0.27" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + }, + "markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", "requires": { - "regenerator-runtime": "^0.13.4" + "repeat-string": "^1.0.0" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "gatsby-plugin-gtag": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/gatsby-plugin-gtag/-/gatsby-plugin-gtag-1.0.13.tgz", - "integrity": "sha512-Oul6O67klajrEjkkF1diD228SmyUWsAwTq/1tYq41vBwmyNiPk4dhk8K93rrNQ5d5zesSv+awBeGBa503tQqGw==" - }, - "gatsby-plugin-less": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-less/-/gatsby-plugin-less-3.1.1.tgz", - "integrity": "sha512-H0LQXy2DpwD1UW3bEuE8RHk2yNfOcZGFjzYH9URPUAzxuOo6bhPyNxKJ8tLcvarqwYiJIWFFivDMv0IqgBJ16Q==", - "requires": { - "@babel/runtime": "^7.8.7", - "less-loader": "^5.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", "requires": { - "regenerator-runtime": "^0.13.4" + "unist-util-remove": "^2.0.0" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "gatsby-plugin-mdx": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.1.4.tgz", - "integrity": "sha512-id2/LALN7eseTGN05v1n16XCYggrl2UTzWOJOQME9rh25jNK+KT5ywaPY6vNYimeAW7wWdad3rl6hORpv4L6yw==", - "requires": { - "@babel/core": "^7.8.7", - "@babel/generator": "^7.8.8", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/preset-env": "^7.8.7", - "@babel/preset-react": "^7.8.3", - "@babel/types": "^7.8.7", - "camelcase-css": "^2.0.1", - "change-case": "^3.1.0", - "core-js": "2", - "dataloader": "^1.4.0", - "debug": "^4.1.1", - "escape-string-regexp": "^1.0.5", - "eval": "^0.1.4", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.1.1", - "gray-matter": "^4.0.2", - "json5": "^2.1.2", - "loader-utils": "^1.4.0", - "lodash": "^4.17.15", - "mdast-util-to-string": "^1.1.0", - "mdast-util-toc": "^3.1.0", - "mime": "^2.4.4", - "p-queue": "^5.0.0", - "pretty-bytes": "^5.3.0", - "remark": "^10.0.1", - "remark-retext": "^3.1.3", - "retext-english": "^3.0.4", - "static-site-generator-webpack-plugin": "^3.4.2", - "style-to-object": "^0.3.0", - "underscore.string": "^3.3.5", - "unified": "^8.4.2", - "unist-util-map": "^1.0.5", - "unist-util-remove": "^1.0.3", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "unist-util-visit": "^2.0.0" } }, - "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "mdast-util-definitions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz", + "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==", "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "unist-util-visit": "^2.0.0" } }, - "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "mdast-util-to-hast": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.0.tgz", + "integrity": "sha512-Akl2Vi9y9cSdr19/Dfu58PVwifPXuFt1IrHe7l+Crme1KvgUT+5z+cHLVcQVGCiNTZZcdqjnuv9vPkGsqWytWA==", "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.3", + "collapse-white-space": "^1.0.0", + "detab": "^2.0.0", + "mdast-util-definitions": "^3.0.0", + "mdurl": "^1.0.0", + "trim-lines": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" } }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "path-key": "^3.0.0" } }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "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": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "p-limit": "^2.2.0" } }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "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==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "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==", "requires": { - "ms": "^2.1.1" + "find-up": "^4.0.0" } }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==" }, - "gatsby-core-utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz", - "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==", + "property-information": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", + "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "node-object-hash": "^2.0.0" + "xtend": "^4.0.0" } }, - "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "remark-mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", + "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", "requires": { - "minimist": "^1.2.5" + "parse-entities": "^2.0.0", + "remark-stringify": "^8.1.0", + "stringify-entities": "^3.0.1", + "strip-indent": "^3.0.0", + "unist-util-stringify-position": "^2.0.3" } }, - "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==", + "remark-parse": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", + "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.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==", + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", "requires": { - "minimist": "^1.2.0" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" } + }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" } } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", "requires": { - "unist-util-visit-parents": "^2.0.0" + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" } - } - } - }, - "gatsby-plugin-page-creator": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.2.1.tgz", - "integrity": "sha512-RRlk7FUScyEj1S6PlGpdj/lrJmps+rl7sQNauOBCIGt3Sod5alin0l8aQJa/ldpI6DIPbp4PWIpqkPsWxED/LA==", - "requires": { - "@babel/runtime": "^7.8.7", - "bluebird": "^3.7.2", - "fs-exists-cached": "^1.0.0", - "gatsby-page-utils": "^0.1.1", - "glob": "^7.1.6", - "lodash": "^4.17.15", - "micromatch": "^3.1.10" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { - "regenerator-runtime": "^0.13.4" + "shebang-regex": "^3.0.0" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "gatsby-plugin-printer": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz", - "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==", - "requires": { - "@sindresorhus/slugify": "^0.9.1", - "babel-plugin-preval": "^3.0.1", - "fs-extra": "^8.1.0", - "puppeteer": "^1.19.0", - "rollup": "1.23.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-commonjs": "^10.0.1", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0" - } - }, - "gatsby-plugin-react-helmet": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.2.1.tgz", - "integrity": "sha512-5oarZdVvp3k3keG26eVFagVHLYw7wCGs/MXRYQg8MEyJewU3X4Uc0eo7qu4TM5EIuZ2ekaL14r86RB6RM5TORA==", - "requires": { - "@babel/runtime": "^7.8.7" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "stringify-entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", + "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", "requires": { - "regenerator-runtime": "^0.13.4" + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.2", + "is-hexadecimal": "^1.0.0" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } - } - }, - "gatsby-plugin-segment-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-segment-js/-/gatsby-plugin-segment-js-3.1.0.tgz", - "integrity": "sha512-oBcIY+riNehfyQXp8PEGVQTz/VPt/+k2aXCh/bNZSR4HhjEAXafcSCReS2xzs/3IJRa3gH0+NOZvRU8peXDb/w==" - }, - "gatsby-plugin-svgr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", - "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg==" - }, - "gatsby-react-router-scroll": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.2.1.tgz", - "integrity": "sha512-mkaG6NNIbWPNiU8Wj3aawUQa7AqI42Skrnh0VCLUCSDvUgCjOJOZfxM0FVPA/masNiVsCprq3a6xz7fmW93jgQ==", - "requires": { - "@babel/runtime": "^7.8.7", - "scroll-behavior": "^0.9.12", - "warning": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "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" + } + }, + "unist-util-is": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", + "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" + }, + "unist-util-remove": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.0.tgz", + "integrity": "sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", "requires": { - "regenerator-runtime": "^0.13.4" + "unist-util-visit": "^2.0.0" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "unist-util-visit-parents": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", + "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "vfile-location": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz", + "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { - "loose-envify": "^1.0.0" + "isexe": "^2.0.0" } } } @@ -9929,51 +13274,72 @@ } }, "gatsby-telemetry": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.2.3.tgz", - "integrity": "sha512-butEEIfuGAWZ9cVISrS6XVXMFPweFTDNO2Z5jj+mA1GkHlriahF4BtbVX3b4miQbQW16g2TfzNw/ztwIUfy0RQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/runtime": "^7.8.7", - "bluebird": "^3.7.2", + "version": "1.3.26", + "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.26.tgz", + "integrity": "sha512-10DqlSw0mvuRcQfoYmYdt+XAZqECqCUY8wYWo1Vpg3BwSpRtaW2rFjDqPa+MZSB5qfBfL92urDw8g1uZZolBNQ==", + "requires": { + "@babel/code-frame": "^7.10.3", + "@babel/runtime": "^7.10.3", + "@turist/fetch": "^7.1.6", + "@turist/time": "^0.0.1", + "async-retry-ng": "^2.0.1", "boxen": "^4.2.0", "configstore": "^5.0.1", - "envinfo": "^7.5.0", + "envinfo": "^7.5.1", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.1.1", + "gatsby-core-utils": "^1.3.15", "git-up": "4.0.1", "is-docker": "2.0.0", "lodash": "^4.17.15", "node-fetch": "2.6.0", - "resolve-cwd": "^2.0.0", - "source-map": "^0.7.3", - "stack-trace": "^0.0.10", - "stack-utils": "1.0.2", "uuid": "3.4.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -10311,11 +13677,21 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -10416,29 +13792,33 @@ } }, "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", "requires": { - "ini": "^1.3.4" + "ini": "^1.3.5" } }, "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "requires": { - "global-prefix": "^3.0.0" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -10447,24 +13827,18 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" } }, "good-listener": { @@ -10563,6 +13937,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } } } }, @@ -10580,9 +13964,9 @@ } }, "graphql": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.6.0.tgz", - "integrity": "sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==", + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", + "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", "requires": { "iterall": "^1.2.2" } @@ -10594,6 +13978,13 @@ "requires": { "graphql-type-json": "^0.2.4", "object-path": "^0.11.4" + }, + "dependencies": { + "graphql-type-json": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.2.4.tgz", + "integrity": "sha512-/tq02ayMQjrG4oDFDRLLrPk0KvJXue0nVXoItBe7uAdbNXjQUu+HYCBdAmPLQoseVzUKKMzrhq2P/sfI76ON6w==" + } } }, "graphql-config": { @@ -10618,16 +14009,19 @@ } }, "graphql-playground-html": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.12.tgz", - "integrity": "sha512-yOYFwwSMBL0MwufeL8bkrNDgRE7eF/kTHiwrqn9FiR9KLcNIl1xw9l9a+6yIRZM56JReQOHpbQFXTZn1IuSKRg==" + "version": "1.6.25", + "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.25.tgz", + "integrity": "sha512-wMNvGsQ0OwBVhn72VVi7OdpI85IxiIZT43glRx7gQIwQ6NvhFnzMYBIVmcJAJ4UlXRYiWtrQhuOItDXObiR3kg==", + "requires": { + "xss": "^1.0.6" + } }, "graphql-playground-middleware-express": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.12.tgz", - "integrity": "sha512-17szgonnVSxWVrgblLRHHLjWnMUONfkULIwSunaMvYx8k5oG3yL86cyGCbHuDFUFkyr2swLhdfYl4mDfDXuvOA==", + "version": "1.7.18", + "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.18.tgz", + "integrity": "sha512-EywRL+iBa4u//5YbY1iJxrl0n4IKyomBKgLXrMbG8gHJUwxmFs5FCWJJ4Q6moSn5Q3RgMZvrWzXB27lKwN8Kgw==", "requires": { - "graphql-playground-html": "1.6.12" + "graphql-playground-html": "1.6.25" } }, "graphql-request": { @@ -10638,6 +14032,14 @@ "cross-fetch": "2.2.2" } }, + "graphql-subscriptions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", + "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", + "requires": { + "iterall": "^1.2.1" + } + }, "graphql-tools-fork": { "version": "8.6.4", "resolved": "https://registry.npmjs.org/graphql-tools-fork/-/graphql-tools-fork-8.6.4.tgz", @@ -10676,9 +14078,9 @@ } }, "graphql-type-json": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.2.4.tgz", - "integrity": "sha512-/tq02ayMQjrG4oDFDRLLrPk0KvJXue0nVXoItBe7uAdbNXjQUu+HYCBdAmPLQoseVzUKKMzrhq2P/sfI76ON6w==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", + "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==" }, "gray-matter": { "version": "4.0.2", @@ -10697,12 +14099,11 @@ "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" }, "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "duplexer": "^0.1.1" } }, "handle-thing": { @@ -11005,6 +14406,37 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "hex2rgba": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/hex2rgba/-/hex2rgba-0.0.1.tgz", + "integrity": "sha1-hwG6HG7ALCBFBBWEB8HEtHqTNu0=" + }, + "hicat": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/hicat/-/hicat-0.7.0.tgz", + "integrity": "sha1-pwTLP1fkn719OMLt16ujj/CzUmM=", + "requires": { + "highlight.js": "^8.1.0", + "minimist": "^0.2.0" + }, + "dependencies": { + "minimist": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz", + "integrity": "sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==" + } + } + }, + "highlight-words-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.2.tgz", + "integrity": "sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg==" + }, + "highlight.js": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-8.9.1.tgz", + "integrity": "sha1-uKnFSTISqTkvAiK2SclhFJfr+4g=" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -11063,9 +14495,9 @@ "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" }, "html-minifier": { "version": "4.0.0", @@ -11081,6 +14513,11 @@ "uglify-js": "^3.5.1" } }, + "html-tag-names": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/html-tag-names/-/html-tag-names-1.1.5.tgz", + "integrity": "sha512-aI5tKwNTBzOZApHIynaAwecLBv8TlZTEy/P4Sj2SzzAhBrGuI8yGZ0UIXVPQzOHGS+to2mjb04iy6VWt/8+d8A==" + }, "html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", @@ -11146,18 +14583,25 @@ } }, "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=" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" }, "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==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + } } }, "http-proxy-middleware": { @@ -11259,9 +14703,9 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, "image-size": { "version": "0.5.5", @@ -11269,11 +14713,6 @@ "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "optional": true }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" - }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -11318,6 +14757,21 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "imurmurhash": { @@ -11368,7 +14822,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/ink/-/ink-2.7.1.tgz", "integrity": "sha512-s7lJuQDJEdjqtaIWhp3KYHl6WV3J04U9zoQ6wVc+Xoa06XM27SXUY57qC5DO46xkF0CfgXMKkKNcgvSu/SAEpA==", - "optional": true, "requires": { "ansi-escapes": "^4.2.1", "arrify": "^2.0.1", @@ -11394,63 +14847,170 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "optional": true, "requires": { "type-fest": "^0.11.0" } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "optional": true - }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "optional": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "optional": true + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "react-reconciler": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.24.0.tgz", + "integrity": "sha512-gAGnwWkf+NOTig9oOowqid9O0HjTDC+XVGBCAmJYYJ2A2cN/O4gDdIuuUQjv8A4v6GDwVfJkagpBBLW5OW9HSw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + } + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + } + } + }, + "ink-spinner": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-3.1.0.tgz", + "integrity": "sha512-sPqmE4qeJ43vJFk9DGLd0wIqhMBAr3129ZqHPt7b847fVl+YTZ3g96khI82Db+FYE7v/Fc5B3lp4ZNtJfqpRUg==", + "requires": { + "cli-spinners": "^1.0.0", + "prop-types": "^15.5.10" + } + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "inline-style-prefixer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz", + "integrity": "sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==", + "requires": { + "bowser": "^1.7.3", + "css-in-js-utils": "^2.0.0" + } + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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" + } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "optional": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "optional": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -11458,68 +15018,27 @@ "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==", - "optional": true - }, - "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==", - "optional": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "optional": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "optional": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "optional": true - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "optional": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "optional": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "optional": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "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==", - "optional": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11530,7 +15049,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "optional": true, "requires": { "ansi-regex": "^5.0.0" } @@ -11539,7 +15057,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -11547,78 +15064,7 @@ "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "optional": true - }, - "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==", - "optional": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "ink-spinner": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-3.0.1.tgz", - "integrity": "sha512-AVR4Z/NXDQ7dT5ltWcCzFS9Dd4T8eaO//E2UO8VYNiJcZpPCSJ11o5A0UVPcMlZxGbGD6ikUFDR3ZgPUQk5haQ==", - "optional": true, - "requires": { - "cli-spinners": "^1.0.0", - "prop-types": "^15.5.10" - } - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "inline-style-prefixer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz", - "integrity": "sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==", - "requires": { - "bowser": "^1.7.3", - "css-in-js-utils": "^2.0.0" - } - }, - "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" } } }, @@ -11653,13 +15099,6 @@ "requires": { "from2": "^2.1.1", "p-is-promise": "^1.1.0" - }, - "dependencies": { - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" - } } }, "invariant": { @@ -11670,11 +15109,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -11845,9 +15279,9 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" }, "is-extendable": { "version": "0.1.1", @@ -11878,22 +15312,12 @@ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" }, "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - }, - "dependencies": { - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - } + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" } }, "is-invalid-path": { @@ -11933,9 +15357,9 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, "is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" }, "is-number": { "version": "3.0.0", @@ -12006,11 +15430,6 @@ "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=" - }, "is-reference": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", @@ -12066,9 +15485,9 @@ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", + "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" }, "is-ssh": { "version": "1.3.1", @@ -12125,6 +15544,11 @@ "upper-case": "^1.1.0" } }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, "is-valid-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", @@ -12149,9 +15573,12 @@ "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } }, "is-yarn-global": { "version": "0.3.0", @@ -12217,6 +15644,68 @@ "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "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==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" + }, "jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", @@ -12333,11 +15822,11 @@ } }, "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", "requires": { - "array-includes": "^3.0.3", + "array-includes": "^3.1.1", "object.assign": "^4.1.0" } }, @@ -12364,6 +15853,19 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "language-subtag-registry": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", + "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, "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", @@ -12386,14 +15888,6 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, "less": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", @@ -12800,6 +16294,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", @@ -12910,6 +16409,11 @@ "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" }, + "lodash.sample": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.sample/-/lodash.sample-4.2.1.tgz", + "integrity": "sha1-XkKRsMdT+hq+sKq4+ynfG2bwf20=" + }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", @@ -12918,8 +16422,7 @@ "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "optional": true + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, "lodash.toarray": { "version": "4.4.0", @@ -12935,22 +16438,86 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz", "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==", - "optional": true, "requires": { "ansi-escapes": "^3.2.0", "cli-cursor": "^2.1.0", "wrap-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } } }, "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" - }, - "lokijs": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.8.tgz", - "integrity": "sha512-D8E3TBrY35o1ELnonp2MF8b3wKu2tVNl2TqRjvS+95oPMMe7OoIAxNY1qr+5BEZwnWn2V4ErAjVt000DonM+FA==" + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" }, "longest-streak": { "version": "2.0.4", @@ -13023,26 +16590,6 @@ "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==" - }, - "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==", - "requires": { - "p-defer": "^1.0.0" - }, - "dependencies": { - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - } - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -13066,16 +16613,6 @@ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, "md5-file": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", @@ -13207,32 +16744,15 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "meant": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.1.tgz", - "integrity": "sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.2.tgz", + "integrity": "sha512-KN+1uowN/NK+sT/Lzx7WSGIj2u+3xe5n2LbwObfjOhPZiA+cCfCm6idVl0RkEfjThkw5XJ96CyRcanq6GmKtUg==" }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -13310,11 +16830,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -13363,9 +16878,9 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", @@ -13380,6 +16895,11 @@ "dom-walk": "^0.1.0" } }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, "mini-css-extract-plugin": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", @@ -13556,9 +17076,9 @@ } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" }, "moment-mini": { "version": "2.24.0", @@ -13608,9 +17128,9 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "name-all-modules-plugin": { "version": "1.0.1", @@ -13618,9 +17138,9 @@ "integrity": "sha1-Cr+2rYNXGLn7Te8GdOBmV6lUN1w=" }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "optional": true }, "nano-css": { @@ -13656,6 +17176,14 @@ "to-regex": "^3.0.1" } }, + "native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "requires": { + "querystring": "^0.2.0" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -13667,9 +17195,9 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "next-tick": { "version": "1.1.0", @@ -13747,6 +17275,16 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -13835,6 +17373,11 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -13852,20 +17395,31 @@ } }, "null-loader": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-0.1.1.tgz", - "integrity": "sha1-F76av80/8OFRL2/Er8sfUDk3j64=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-3.0.0.tgz", + "integrity": "sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, - "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=" - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -13920,9 +17474,46 @@ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" }, "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==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + } + } }, "object-keys": { "version": "1.1.1", @@ -13954,14 +17545,46 @@ } }, "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.17.5", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + } } }, "object.fromentries": { @@ -14035,11 +17658,11 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "open": { @@ -14112,32 +17735,6 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, - "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==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -14159,14 +17756,14 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "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==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } @@ -14538,14 +18135,6 @@ "find-up": "^3.0.0" } }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - } - }, "pnp-webpack-plugin": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", @@ -14563,13 +18152,13 @@ } }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { "async": "^2.6.2", "debug": "^3.1.1", - "mkdirp": "^0.5.1" + "mkdirp": "^0.5.5" }, "dependencies": { "async": { @@ -14579,6 +18168,19 @@ "requires": { "lodash": "^4.17.14" } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -14613,9 +18215,9 @@ } }, "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", + "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -14690,9 +18292,9 @@ } }, "postcss-flexbugs-fixes": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz", - "integrity": "sha512-QRE0n3hpkxxS/OGvzOa+PDuy4mh/Jg4o9ui22/ko5iGYOG3M5dfJabjnAZjTdh2G9F85c7Hv8hWcEDEKW/xceQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", "requires": { "postcss": "^7.0.26" } @@ -15224,9 +18826,9 @@ } }, "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==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, "prelude-ls": { "version": "1.1.2", @@ -15257,6 +18859,46 @@ "utila": "~0.4" } }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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" + } + }, + "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==" + } + } + }, "prismjs": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz", @@ -15335,6 +18977,21 @@ "react-is": "^16.8.1" } }, + "proper-lockfile": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.1.tgz", + "integrity": "sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg==", + "requires": { + "graceful-fs": "^4.1.11", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "property-expr": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", + "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==" + }, "property-information": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.4.0.tgz", @@ -15425,6 +19082,14 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "requires": { + "escape-goat": "^2.0.0" + } + }, "puppeteer": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", @@ -15477,13 +19142,20 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.1.tgz", + "integrity": "sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==", "requires": { "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "dependencies": { + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + } } }, "querystring": { @@ -15574,6 +19246,19 @@ "prop-types": "^15.6.2" } }, + "react-circular-progressbar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-circular-progressbar/-/react-circular-progressbar-2.0.3.tgz", + "integrity": "sha512-YKN+xAShXA3gYihevbQZbavfiJxo83Dt1cUxqg/cltj4VVsRQpDr7Fg1mvjDG3x1KHGtd9NmYKvJ2mMrPwbKyw==" + }, + "react-clientside-effect": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz", + "integrity": "sha512-nRmoyxeok5PBO6ytPvSjKp9xwXg9xagoTK1mMjwnQxqM9Hd7MNPl+LS1bOSOe+CV2+4fnEquc7H/S8QD3q697A==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, "react-dev-utils": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-4.2.3.tgz", @@ -15626,6 +19311,19 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -15653,14 +19351,6 @@ "debug": "^2.6.0" } }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "requires": { - "original": ">=0.0.5" - } - }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -15671,39 +19361,12 @@ "tmp": "^0.0.33" } }, - "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "duplexer": "^0.1.1" + "escape-string-regexp": "^1.0.5" } }, "inquirer": { @@ -15763,11 +19426,6 @@ } } }, - "is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" - }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -15777,55 +19435,50 @@ "yallist": "^2.1.2" } }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "requires": { - "brace-expansion": "^1.0.0" - } + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", - "requires": { - "minimatch": "3.0.3" - } + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" + "mimic-fn": "^1.0.0" } - }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } } } }, @@ -15850,6 +19503,19 @@ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, + "react-focus-lock": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.4.1.tgz", + "integrity": "sha512-c5ZP56KSpj9EAxzScTqQO7bQQNPltf/W1ZEBDqNDOV1XOIwvAyHX0O7db9ekiAtxyKgnqZjQlLppVg94fUeL9w==", + "requires": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.7.0", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.2", + "use-callback-ref": "^1.2.1", + "use-sidecar": "^1.0.1" + } + }, "react-helmet": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.1.tgz", @@ -15862,9 +19528,9 @@ } }, "react-hot-loader": { - "version": "4.12.20", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.20.tgz", - "integrity": "sha512-lPlv1HVizi0lsi+UFACBJaydtRYILWkfHAC/lyCs6ZlAxlOZRQIfYHDqiGaRvL/GF7zyti+Qn9XpnDAUvdFA4A==", + "version": "4.12.21", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.21.tgz", + "integrity": "sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA==", "requires": { "fast-levenshtein": "^2.0.6", "global": "^4.3.0", @@ -15883,6 +19549,14 @@ } } }, + "react-icons": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.10.0.tgz", + "integrity": "sha512-WsQ5n1JToG9VixWilSo1bHv842Cj5aZqTGiS3Ud47myF6aK7S/IUY2+dHcBdmkQcCFRuHsJ9OMUI0kTDfjyZXQ==", + "requires": { + "camelcase": "^5.0.0" + } + }, "react-instantsearch-core": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.3.0.tgz", @@ -15924,15 +19598,25 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-reconciler": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.24.0.tgz", - "integrity": "sha512-gAGnwWkf+NOTig9oOowqid9O0HjTDC+XVGBCAmJYYJ2A2cN/O4gDdIuuUQjv8A4v6GDwVfJkagpBBLW5OW9HSw==", - "optional": true, + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.25.1.tgz", + "integrity": "sha512-R5UwsIvRcSs3w8n9k3tBoTtUHdVhu9u84EG7E5M0Jk9F5i6DA1pQzPfUZd6opYWGy56MJOtV3VADzy6DRwYDjw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.1" + }, + "dependencies": { + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-refresh": { @@ -15940,6 +19624,27 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.7.2.tgz", "integrity": "sha512-u5l7fhAJXecWUJzVxzMRU2Zvw8m4QmDNHlTrT5uo3KBlYBhmChd7syAakBoay1yIiVhx/8Fi7a6v6kQZfsw81Q==" }, + "react-remove-scroll": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.3.0.tgz", + "integrity": "sha512-UqVimLeAe+5EHXKfsca081hAkzg3WuDmoT9cayjBegd6UZVhlTEchleNp9J4TMGkb/ftLve7ARB5Wph+HJ7A5g==", + "requires": { + "react-remove-scroll-bar": "^2.1.0", + "react-style-singleton": "^2.1.0", + "tslib": "^1.0.0", + "use-callback-ref": "^1.2.3", + "use-sidecar": "^1.0.1" + } + }, + "react-remove-scroll-bar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.1.0.tgz", + "integrity": "sha512-5X5Y5YIPjIPrAoMJxf6Pfa7RLNGCgwZ95TdnVPgPuMftRfO8DaC7F4KP1b5eiO8hHbe7u+wZNDbYN5WUTpv7+g==", + "requires": { + "react-style-singleton": "^2.1.0", + "tslib": "^1.0.0" + } + }, "react-side-effect": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.2.0.tgz", @@ -15948,6 +19653,16 @@ "shallowequal": "^1.0.1" } }, + "react-style-singleton": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.0.tgz", + "integrity": "sha512-DH4ED+YABC1dhvSDYGGreAHmfuTXj6+ezT3CmHoqIEfxNgEYfIMoOtmbRp42JsUst3IPqBTDL+8r4TF7EWhIHw==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^1.0.0" + } + }, "react-textfit": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/react-textfit/-/react-textfit-1.1.0.tgz", @@ -16112,11 +19827,21 @@ } }, "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", + "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", "requires": { - "minimatch": "3.0.4" + "minimatch": "3.0.3" + }, + "dependencies": { + "minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "requires": { + "brace-expansion": "^1.0.0" + } + } } }, "redux": { @@ -16179,9 +19904,9 @@ } }, "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" }, "regexpu-core": { "version": "4.6.0", @@ -16197,9 +19922,9 @@ } }, "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", "requires": { "rc": "^1.2.8" } @@ -16361,6 +20086,11 @@ } } }, + "remark-footnotes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-1.0.0.tgz", + "integrity": "sha512-X9Ncj4cj3/CIvLI2Z9IobHtVi8FVdUrdJkCNaL9kdX8ohfsi18DXHsCVd/A7ssARBdccdDb5ODnt62WuEWaM/g==" + }, "remark-mdx": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.5.8.tgz", @@ -16376,6 +20106,274 @@ "unified": "8.4.2" } }, + "remark-mdxjs": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/remark-mdxjs/-/remark-mdxjs-2.0.0-next.7.tgz", + "integrity": "sha512-ixa9jEQ1mB65NYJaBq+Hv91DIqQ7B3wk+L9Agwa31NkIzvt6zcgx6TKwavr0zZG69I2n1gZzekhp51AeVCzU1Q==", + "requires": { + "@babel/core": "7.10.5", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.10.4", + "@babel/plugin-syntax-jsx": "7.10.4", + "@mdx-js/util": "^2.0.0-next.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@mdx-js/util": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", + "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, "remark-parse": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz", @@ -16629,17 +20627,17 @@ } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.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=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" } } }, @@ -16650,30 +20648,6 @@ "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==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } } }, "resolve-from": { @@ -16695,11 +20669,11 @@ } }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -16867,12 +20841,9 @@ } }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { "version": "1.1.9", @@ -16906,9 +20877,9 @@ } }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "requires": { "tslib": "^1.9.0" } @@ -16999,18 +20970,19 @@ } }, "schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "requires": { - "ajv": "^6.12.0", + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" }, "dependencies": { "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17035,15 +21007,6 @@ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-4.2.1.tgz", "integrity": "sha512-PLSp6f5XdhvjCCCO8OjavRfzkSGL3Qmdm7P82bxyU8HDDDBhDV3UckRaYcRa/NDNTYt8YBpzjoLWHUAejmOjLg==" }, - "scroll-behavior": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/scroll-behavior/-/scroll-behavior-0.9.12.tgz", - "integrity": "sha512-18sirtyq1P/VsBX6O/vgw20Np+ngduFXEMO4/NDFXabdOKBL2kjPVUpz1y0+jm99EWwFJafxf5/tCyMeXt9Xyg==", - "requires": { - "dom-helpers": "^3.4.0", - "invariant": "^2.2.4" - } - }, "section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -17088,11 +21051,18 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "requires": { - "semver": "^5.0.3" + "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==" + } } }, "send": { @@ -17152,9 +21122,12 @@ } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "requires": { + "randombytes": "^2.1.0" + } }, "serve-index": { "version": "1.9.1", @@ -17312,9 +21285,15 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } }, "side-channel": { "version": "1.0.2", @@ -17325,11 +21304,6 @@ "object-inspect": "^1.7.0" } }, - "sift": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/sift/-/sift-5.1.0.tgz", - "integrity": "sha1-G78t+w63HlbEzH+1Z/vRNRtlAV4=" - }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -17368,15 +21342,23 @@ } } }, + "single-trailing-newline": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/single-trailing-newline/-/single-trailing-newline-1.0.0.tgz", + "integrity": "sha1-gfCtKtZFGBlFyAlSpcFBSZLulmQ=", + "requires": { + "detect-newline": "^1.0.3" + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "2.1.0", @@ -17606,9 +21588,9 @@ } }, "socket.io-parser": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz", - "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "requires": { "component-emitter": "1.2.1", "debug": "~4.1.0", @@ -17636,12 +21618,13 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" }, "dependencies": { "faye-websocket": { @@ -17651,20 +21634,43 @@ "requires": { "websocket-driver": ">=0.5.1" } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "requires": { + "websocket-extensions": ">=0.1.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==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", "json3": "^3.3.2", - "url-parse": "^1.4.3" + "url-parse": "^1.1.8" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "sort-keys": { @@ -17733,24 +21739,29 @@ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" + }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -17762,9 +21773,9 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -17816,6 +21827,11 @@ } } }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -17855,7 +21871,42 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "requires": { - "figgy-pudding": "^3.5.1" + "figgy-pudding": "^3.5.1" + } + }, + "st": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/st/-/st-2.0.0.tgz", + "integrity": "sha512-drN+aGYnrZPNYIymmNwIY7LXYJ8MqsqXj4fMRue3FOgGMdGjSX10fhJ3qx0sVQPhcWxhEaN4U/eWM4O4dbYNAw==", + "requires": { + "async-cache": "^1.1.0", + "bl": "^4.0.0", + "fd": "~0.0.2", + "graceful-fs": "^4.2.3", + "mime": "^2.4.4", + "negotiator": "~0.6.2" + }, + "dependencies": { + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stable": { @@ -17876,11 +21927,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" - }, "stackframe": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.1.tgz", @@ -18036,7 +22082,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "optional": true, "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^5.2.0" @@ -18045,14 +22090,12 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "optional": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "optional": true, "requires": { "ansi-regex": "^4.1.0" } @@ -18108,6 +22151,48 @@ "side-channel": "^1.0.2" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + } + } + }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -18126,6 +22211,48 @@ "function-bind": "^1.1.1" } }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -18188,10 +22315,18 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "striptags": { "version": "3.1.1", @@ -18254,6 +22389,28 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz", "integrity": "sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw==" }, + "subscriptions-transport-ws": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.17.tgz", + "integrity": "sha512-hNHi2N80PBz4T0V0QhnnsMGvG3XDFDS9mS6BhZ3R12T6EBywC8d/uJscsga0cVO4DKtXCkCRrWm2sOYrbOdhEA==", + "requires": { + "backo2": "^1.0.2", + "eventemitter3": "^3.1.0", + "iterall": "^1.2.1", + "symbol-observable": "^1.0.4", + "ws": "^5.2.0" + }, + "dependencies": { + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "sudo-prompt": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", @@ -18272,6 +22429,11 @@ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, + "svg-tag-names": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/svg-tag-names/-/svg-tag-names-2.0.1.tgz", + "integrity": "sha512-BEZ508oR+X/b5sh7bT0RqDJ7GhTpezjj3P1D4kugrOaPs6HijviWksoQ63PS81vZn0QCjZmVKjHDBniTo+Domg==" + }, "svgo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", @@ -18333,6 +22495,16 @@ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, + "synchronous-promise": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.13.tgz", + "integrity": "sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==" + }, + "tabbable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-4.0.0.tgz", + "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -18349,6 +22521,11 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -18397,15 +22574,15 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", "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", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -18439,6 +22616,16 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, + "theme-ui": { + "version": "0.2.52", + "resolved": "https://registry.npmjs.org/theme-ui/-/theme-ui-0.2.52.tgz", + "integrity": "sha512-JFujorP5aFxIm1UyVCtefN5baXjwh5TXHKFYNWgAP+3rqVvggIr46uSMrRNvDjyhFOQiMK8YI8ctPQrrhcETpw==", + "requires": { + "@emotion/is-prop-valid": "^0.8.1", + "@styled-system/css": "^5.0.16", + "deepmerge": "^4.0.0" + } + }, "throttle-debounce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz", @@ -18487,6 +22674,11 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", "optional": true }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "tinycolor2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", @@ -18502,11 +22694,11 @@ } }, "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "requires": { - "os-tmpdir": "~1.0.2" + "rimraf": "^3.0.0" } }, "to-array": { @@ -18577,6 +22769,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -18586,6 +22783,11 @@ "punycode": "^2.1.1" } }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -18639,6 +22841,27 @@ "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -19033,211 +23256,68 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-notifier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", - "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", "requires": { - "boxen": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.1.0", - "is-npm": "^3.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - } - }, - "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "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==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "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": { - "pify": "^3.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "pify": { + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { - "crypto-random-string": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "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=", - "requires": { - "ansi-regex": "^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==", + "requires": { + "color-name": "~1.1.4" } }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "has-flag": "^4.0.0" } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, @@ -19327,11 +23407,34 @@ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, + "urql": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/urql/-/urql-1.10.0.tgz", + "integrity": "sha512-Cxx1INTWNUMg9A2gyltqNqukOLFVtztkHxFGfv01OvsFAtR+wCmLyJqIzGUZRKVbKepTLocGbelS7QDxtjcqtg==", + "requires": { + "@urql/core": "^1.12.3", + "wonka": "^4.0.14" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "use-callback-ref": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.4.tgz", + "integrity": "sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ==" + }, + "use-sidecar": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.3.tgz", + "integrity": "sha512-ygJwGUBeQfWgDls7uTrlEDzJUUR67L8Rm14v/KfFtYCdHhtjHZx1Krb3DIQl3/Q5dJGfXLEQ02RY8BdNBv87SQ==", + "requires": { + "detect-node-es": "^1.0.0", + "tslib": "^1.9.3" + } + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -19469,19 +23572,136 @@ } }, "watchpack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", - "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", "requires": { - "chokidar": "^2.1.8", + "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" }, "dependencies": { "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -19500,7 +23720,8 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true } } }, @@ -19518,15 +23739,15 @@ "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" }, "webpack": { - "version": "4.41.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", - "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", - "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", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", @@ -19537,13 +23758,13 @@ "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", + "watchpack": "^1.6.1", "webpack-sources": "^1.4.1" }, "dependencies": { @@ -19561,6 +23782,19 @@ "estraverse": "^4.1.1" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -19586,9 +23820,9 @@ } }, "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==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -19598,33 +23832,46 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -19645,21 +23892,21 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -19686,10 +23933,18 @@ "rimraf": "^2.6.3" } }, - "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==" + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" + } }, "globby": { "version": "6.1.0", @@ -19710,14 +23965,6 @@ } } }, - "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=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -19741,11 +23988,6 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" }, - "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=" - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -19769,6 +24011,49 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, + "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==", + "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==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -19778,22 +24063,21 @@ } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "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==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -19807,28 +24091,26 @@ } }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -19881,24 +24163,24 @@ } }, "webpack-stats-plugin": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-0.3.1.tgz", - "integrity": "sha512-pxqzFE055NlNTlNyfDG3xlB2QwT1EWdm/CF5dCJI/e+rRHVxrWhWg1rf1lfsWhI1/EePv8gi/A36YxO/+u0FgQ==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-0.3.2.tgz", + "integrity": "sha512-kxEtPQ6lBBik2qtJlsZkiaDMI6rGXe9w1kLH9ZCdt0wgCGVnbwwPlP60cMqG6tILNFYqXDxNt4+c4OIIuE+Fnw==" }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", + "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-fetch": { "version": "2.0.4", @@ -19931,11 +24213,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -19971,6 +24248,11 @@ "pify": "^4.0.1" } }, + "wonka": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.14.tgz", + "integrity": "sha512-v9vmsTxpZjrA8CYfztbuoTQSHEsG3ZH+NCYfasHm0V3GqBupXrjuuz0RJyUaw2cRO7ouW2js0P6i853/qxlDcA==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -19984,45 +24266,64 @@ "errno": "~0.1.7" } }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "requires": { - "microevent.ts": "~0.1.1" - } - }, "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==", + "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": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "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": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } } } @@ -20052,9 +24353,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" }, "x-is-string": { "version": "0.1.0", @@ -20071,18 +24372,19 @@ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, - "xregexp": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", - "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "xss": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz", + "integrity": "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==", "requires": { - "@babel/runtime-corejs3": "^7.8.3" + "commander": "^2.20.3", + "cssfilter": "0.0.10" } }, "xstate": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.8.0.tgz", - "integrity": "sha512-xHSYQtCHLkcrFRxa5lK4Lp1rnKt00a80jcKFMQiMBuE+6MvTYv7twwqYpzjsJoKFjGZB3GGEpZAuY1dmlPTh/g==" + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.11.0.tgz", + "integrity": "sha512-v+S3jF2YrM2tFOit8o7+4N3FuFd9IIGcIKHyfHeeNjMlmNmwuiv/IbY9uw7ECifx7H/A9aGLcxPSr0jdjTGDww==" }, "xtend": { "version": "4.0.2", @@ -20108,59 +24410,126 @@ } }, "yaml-loader": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.5.0.tgz", - "integrity": "sha512-p9QIzcFSNm4mCw/m5NdyMfN4RE4aFZJWRRb01ERVNGCym8VNbKtw3OYZXnvUIkim6U/EjqE/2yIh9F/msShH9A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.6.0.tgz", + "integrity": "sha512-1bNiLelumURyj+zvVHOv8Y3dpCri0F2S+DCcmps0pA1zWRLjS+FhZQg4o3aUUDYESh73+pKZNI18bj7stpReow==", "requires": { - "js-yaml": "^3.5.2" + "loader-utils": "^1.4.0", + "yaml": "^1.8.3" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "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==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" + } } }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "yargs-parser": "^18.1.2" }, "dependencies": { "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "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" + } + }, + "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==" + }, + "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==" }, "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==", + "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": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } } } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -20181,12 +24550,24 @@ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" }, "yoga-layout-prebuilt": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.9.5.tgz", - "integrity": "sha512-+G5Ojl4/sG78mk5masCL3SRaZtkKXRBhMGf5c+4C1j32jN9KpS4lxVFdYyBi15EHN4gMeK5sIRf83T33TOaDkA==", - "optional": true, + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.9.6.tgz", + "integrity": "sha512-Wursw6uqLXLMjBAO4SEShuzj8+EJXhCF71/rJ7YndHTkRAYSU0GY3OghRqfAk9HPUAAFMuqp3U1Wl+01vmGRQQ==", + "requires": { + "@types/yoga-layout": "1.9.2" + } + }, + "yup": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", + "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", "requires": { - "@types/yoga-layout": "1.9.1" + "@babel/runtime": "^7.0.0", + "fn-name": "~2.0.1", + "lodash": "^4.17.11", + "property-expr": "^1.5.0", + "synchronous-promise": "^2.0.6", + "toposort": "^2.0.2" } }, "yurnalist": { @@ -20215,48 +24596,10 @@ "strip-bom": "^4.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "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==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "debug": { "version": "4.1.1", @@ -20266,152 +24609,23 @@ "ms": "^2.1.1" } }, - "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==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "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==" - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "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" - } - } - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } } }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" } } }, diff --git a/docs/package.json b/docs/package.json index 5b2d148e..2de3a59e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -7,7 +7,7 @@ }, "dependencies": { "algoliasearch": "^4.0.3", - "gatsby": "2.19.41", + "gatsby": "2.23.20", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.1.33", "gatsby-theme-apollo-docs": "4.0.14", From 1563136afdb654a3e0d5967399b5bbbe6139e8ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2020 23:50:47 +0000 Subject: [PATCH 043/251] Bump prismjs from 1.19.0 to 1.21.0 in /docs Bumps [prismjs](https://github.com/PrismJS/prism) from 1.19.0 to 1.21.0. - [Release notes](https://github.com/PrismJS/prism/releases) - [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md) - [Commits](https://github.com/PrismJS/prism/compare/v1.19.0...v1.21.0) Signed-off-by: dependabot[bot] --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 90a9cfd7..11bc2dd6 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -18900,9 +18900,9 @@ } }, "prismjs": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz", - "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", + "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", "requires": { "clipboard": "^2.0.0" } From 475b70fbae30df9a30285ef676a7773bd4cec4a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2020 23:22:56 +0000 Subject: [PATCH 044/251] Bump lodash from 4.17.15 to 4.17.19 in /docs Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 11bc2dd6..facb0b25 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -16290,9 +16290,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash-es": { "version": "4.17.15", From a841e0160f4d8a465336230802b2cd4394901bc8 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 10 Apr 2020 23:14:19 +0000 Subject: [PATCH 045/251] fix: upgrade multiple dependencies with Snyk Snyk has created this PR to upgrade: - react from 16.12.0 to 16.13.1. See this package in NPM: https://www.npmjs.com/package/react - react-dom from 16.12.0 to 16.13.1. See this package in NPM: https://www.npmjs.com/package/react-dom See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 26 +++++++++++++++++++------- docs/package.json | 4 ++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index facb0b25..0b0d3730 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -19237,9 +19237,9 @@ } }, "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -19483,14 +19483,25 @@ } }, "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.1" + }, + "dependencies": { + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-error-overlay": { @@ -20964,6 +20975,7 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "optional": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" diff --git a/docs/package.json b/docs/package.json index 2de3a59e..5ce6385b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -12,8 +12,8 @@ "gatsby-source-graphql": "^2.1.33", "gatsby-theme-apollo-docs": "4.0.14", "instantsearch.css": "^7.4.2", - "react": "16.12.0", - "react-dom": "16.12.0", + "react": "16.13.1", + "react-dom": "16.13.1", "react-instantsearch-dom": "^6.3.0" } } From 8e54de584b6c4390a455121edc4e737764ac9668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 10:56:54 +0200 Subject: [PATCH 046/251] Fixed docs build issues --- .github/workflows/docs-publish.yaml | 2 +- docs/.nvmrc | 2 +- docs/package-lock.json | 12418 +++++++++++++------------- docs/package.json | 9 +- 4 files changed, 5978 insertions(+), 6453 deletions(-) diff --git a/.github/workflows/docs-publish.yaml b/.github/workflows/docs-publish.yaml index 484c34b5..49011f6a 100644 --- a/.github/workflows/docs-publish.yaml +++ b/.github/workflows/docs-publish.yaml @@ -16,7 +16,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v1 with: - node-version: '10.x' + node-version: '10.19.x' - name: Cache dependencies uses: actions/cache@v1 diff --git a/docs/.nvmrc b/docs/.nvmrc index 64f5a0a6..ed5ddf35 100644 --- a/docs/.nvmrc +++ b/docs/.nvmrc @@ -1 +1 @@ -node +10.19.0 \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json index 0b0d3730..625ccfeb 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -117,17 +117,48 @@ "@algolia/requester-common": "4.0.3" } }, + "@apollo/client": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.1.3.tgz", + "integrity": "sha512-zXMiaj+dX0sgXIwEV5d/PI6B8SZT2bqlKNjZWcEXRY7NjESF5J3nd4v8KOsrhHe+A3YhNv63tIl35Sq7uf41Pg==", + "requires": { + "@types/zen-observable": "^0.8.0", + "@wry/context": "^0.5.2", + "@wry/equality": "^0.2.0", + "fast-json-stable-stringify": "^2.0.0", + "graphql-tag": "^2.11.0", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.12.1", + "prop-types": "^15.7.2", + "symbol-observable": "^1.2.0", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0", + "zen-observable": "^0.8.14" + }, + "dependencies": { + "@wry/equality": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.2.0.tgz", + "integrity": "sha512-Y4d+WH6hs+KZJUC8YKLYGarjGekBrhslDbf/R20oV+AakHPINSitHfDRQz3EGcEWc1luXYNUvMhawWtZVWNGvQ==", + "requires": { + "tslib": "^1.9.3" + } + } + } + }, "@apollo/space-kit": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@apollo/space-kit/-/space-kit-2.15.0.tgz", - "integrity": "sha512-tAxOosmN8tWmObHuOyO2HI69+m63ZO5w2YQ+BoF/mNB3TmjpkJ3Yn3+r55rqfkQHQVkaTBBIXRIs1tRiGG4XTA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@apollo/space-kit/-/space-kit-5.6.0.tgz", + "integrity": "sha512-8/dVkTFVdHz9c1iBhhPtF6OAzoc314+j7QgQLCUHX5/RrwPnIUFyZizJpjUD3m+q4TSnvSuAXiidnwOAW1o5ug==", "requires": { "@emotion/cache": "^10.0.15", "@emotion/core": "^10.0.15", + "@tippyjs/react": "^4.0.0", "@types/classnames": "^2.2.9", "@types/tinycolor2": "^1.4.2", "classnames": "^2.2.6", - "tinycolor2": "^1.4.1" + "tinycolor2": "^1.4.1", + "tslib": "^1.10.0" } }, "@ardatan/aggregate-error": { @@ -144,111 +175,133 @@ } }, "@babel/compat-data": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", - "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", "requires": { - "browserslist": "^4.9.1", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" }, "dependencies": { - "browserslist": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", - "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "caniuse-lite": "^1.0.30001038", - "electron-to-chromium": "^1.3.390", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "@babel/highlight": "^7.10.4" } }, - "caniuse-lite": { - "version": "1.0.30001038", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", - "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==" - }, - "electron-to-chromium": { - "version": "1.3.395", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz", - "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw==" + "@babel/generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "locate-path": "^2.0.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@babel/types": "^7.10.4" } }, - "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "p-try": "^1.0.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "p-limit": "^1.1.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "find-up": "^2.1.0" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } - } - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "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" - }, - "dependencies": { + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -271,29 +324,65 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-react-jsx-experimental": { @@ -345,104 +434,106 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", - "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "requires": { - "@babel/compat-data": "^7.8.6", - "browserslist": "^4.9.1", + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" }, "dependencies": { - "browserslist": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", - "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "caniuse-lite": "^1.0.30001038", - "electron-to-chromium": "^1.3.390", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "@babel/highlight": "^7.10.4" } }, - "caniuse-lite": { - "version": "1.0.30001038", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", - "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==" - }, - "electron-to-chromium": { - "version": "1.3.395", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz", - "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw==" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "locate-path": "^2.0.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@babel/types": "^7.10.4" } }, - "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "p-try": "^1.0.0" + "@babel/types": "^7.11.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "p-limit": "^1.1.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "find-up": "^2.1.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.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==", - "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", @@ -453,22 +544,96 @@ } }, "@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==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", - "lodash": "^4.17.13" + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { @@ -490,19 +655,43 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.11.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { @@ -514,98 +703,98 @@ } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" }, "dependencies": { - "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "@babel/highlight": "^7.10.4" } }, - "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/types": "^7.10.4" } }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/types": "^7.11.0" } }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "ms": "^2.1.1" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { @@ -622,51 +811,50 @@ } }, "@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==", - "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==", - "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==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", "requires": { - "@babel/types": "^7.11.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { - "@babel/helper-validator-identifier": { + "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/types": { + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", @@ -675,80 +863,18 @@ "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, - "@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==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==" - }, - "@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==", - "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==", - "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==", - "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==" - }, - "@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==", - "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": { + "@babel/helper-replace-supers": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/code-frame": { @@ -760,28 +886,15 @@ } }, "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "requires": { "@babel/types": "^7.11.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, "@babel/helper-function-name": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", @@ -800,38 +913,6 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, "@babel/helper-split-export-declaration": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", @@ -840,11 +921,6 @@ "@babel/types": "^7.11.0" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -856,9 +932,9 @@ } }, "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" }, "@babel/template": { "version": "7.10.4", @@ -903,108 +979,360 @@ "requires": { "ms": "^2.1.1" } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, - "@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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-export-namespace-from": { + "@babel/helper-simple-access": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { - "@babel/helper-plugin-utils": { + "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { + "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/types": "^7.11.0" }, "dependencies": { - "@babel/helper-plugin-utils": { + "@babel/helper-validator-identifier": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { + "@babel/helper-split-export-declaration": { "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==", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/types": "^7.8.3" } }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3" - } + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, - "@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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } } }, - "@babel/plugin-proposal-optional-catch-binding": { + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/highlight": { "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==", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" }, "dependencies": { "@babel/helper-plugin-utils": { @@ -1014,10 +1342,10 @@ } } }, - "@babel/plugin-proposal-private-methods": { + "@babel/plugin-proposal-class-properties": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", "requires": { "@babel/helper-create-class-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -1183,29 +1511,29 @@ } } }, - "@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==", + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { + "@babel/plugin-proposal-export-namespace-from": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { @@ -1215,44 +1543,13 @@ } } }, - "@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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { + "@babel/plugin-proposal-json-strings": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" }, "dependencies": { "@babel/helper-plugin-utils": { @@ -1262,415 +1559,465 @@ } } }, - "@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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "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==", - "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==", - "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==", + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "lodash": "^4.17.13" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-classes": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", - "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", "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.6", - "@babel/helper-split-export-declaration": "^7.8.3", - "globals": "^11.1.0" + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" } }, - "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" } }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" } }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "@babel/types": "^7.11.0" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "ms": "^2.1.1" + "@babel/types": "^7.10.4" } - } - } - }, - "@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==", - "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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, - "@babel/plugin-transform-dotall-regex": { + "@babel/plugin-proposal-unicode-property-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==", + "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==", "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==", - "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==", + "@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==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-function-name": { + "@babel/plugin-syntax-dynamic-import": { "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==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-literals": { + "@babel/plugin-syntax-export-namespace-from": { "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==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, - "@babel/plugin-transform-member-expression-literals": { + "@babel/plugin-syntax-json-strings": { "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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", - "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", - "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", - "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", - "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", - "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-object-super": { + "@babel/plugin-syntax-nullish-coalescing-operator": { "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==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-parameters": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", - "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-property-literals": { + "@babel/plugin-syntax-object-rest-spread": { "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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz", - "integrity": "sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-react-display-name": { + "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-react-jsx": { + "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-react-jsx-development": { + "@babel/plugin-syntax-top-level-await": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", - "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { "@babel/helper-plugin-utils": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } } } }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", + "@babel/plugin-syntax-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", + "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-react-pure-annotations": { + "@babel/plugin-transform-async-to-generator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" }, "dependencies": { - "@babel/helper-annotate-as-pure": { + "@babel/helper-module-imports": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "requires": { "@babel/types": "^7.10.4" } @@ -1680,11 +2027,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, "@babel/types": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", @@ -1694,45 +2036,76 @@ "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, - "@babel/plugin-transform-regenerator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", - "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", "requires": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-runtime": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", - "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" }, "dependencies": { - "@babel/helper-module-imports": { + "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { "@babel/types": "^7.10.4" } @@ -1742,10 +2115,38 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/helper-validator-identifier": { + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } }, "@babel/types": { "version": "7.11.0", @@ -1756,70 +2157,52 @@ "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, - "@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==", - "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==", + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@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==", + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/plugin-transform-template-literals": { + "@babel/plugin-transform-dotall-regex": { "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==", - "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==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" } }, - "@babel/plugin-transform-typescript": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", - "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", - "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-escapes": { + "@babel/plugin-transform-duplicate-keys": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1831,844 +2214,891 @@ } } }, - "@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==", + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/polyfill": { + "@babel/plugin-transform-for-of": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.10.4.tgz", - "integrity": "sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, - "@babel/preset-env": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", - "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", "requires": { - "@babel/compat-data": "^7.9.0", - "@babel/helper-compilation-targets": "^7.8.7", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.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-numeric-separator": "^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.9.0", - "@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.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.0", - "@babel/plugin-transform-modules-commonjs": "^7.9.0", - "@babel/plugin-transform-modules-systemjs": "^7.9.0", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.7", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.0", - "browserslist": "^4.9.1", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", - "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/highlight": "^7.10.4" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "browserslist": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", - "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", - "requires": { - "caniuse-lite": "^1.0.30001038", - "electron-to-chromium": "^1.3.390", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" + "@babel/types": "^7.10.4" } }, - "caniuse-lite": { - "version": "1.0.30001038", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", - "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==" - }, - "electron-to-chromium": { - "version": "1.3.395", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz", - "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw==" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "p-limit": "^1.1.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "find-up": "^2.1.0" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } } } }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/preset-typescript": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", - "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.9.0" + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", "requires": { - "regenerator-runtime": "^0.13.2" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, - "@babel/standalone": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.3.tgz", - "integrity": "sha512-rcoT32Hw0faYhmCDR0P84ODKL5kpEdhYPgdzlTKs7+v9oJaVLsGvq0xlkmLRj01F6LrItH3tY9eEoRsPLie4RQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", "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/helper-create-regexp-features-plugin": "^7.10.4" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "requires": { - "ms": "^2.1.1" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" } + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "requires": { + "lodash": "^4.17.19" + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" } } }, - "@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==", + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@braintree/sanitize-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", - "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==" - }, - "@emotion/babel-plugin-jsx-pragmatic": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-0.1.5.tgz", - "integrity": "sha512-y+3AJ0SItMDaAgGPVkQBC/S/BaqaPACkQ6MyCI2CUlrjTxKttTVfD3TMtcs7vLEcLxqzZ1xiG0vzwCXjhopawQ==", - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@emotion/babel-preset-css-prop": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/babel-preset-css-prop/-/babel-preset-css-prop-10.0.27.tgz", - "integrity": "sha512-rducrjTpLGDholp0l2l4pXqpzAqYYGMg/x4IteO0db2smf6zegn6RRZdDnbaoMSs63tfPWgo2WukT1/F1gX/AA==", + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.3.0", - "@babel/runtime": "^7.5.5", - "@emotion/babel-plugin-jsx-pragmatic": "^0.1.5", - "babel-plugin-emotion": "^10.0.27" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", "requires": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, - "@emotion/core": { - "version": "10.0.28", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz", - "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==", + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@emotion/css": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", + "@babel/plugin-transform-react-constant-elements": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz", + "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==", "requires": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "@babel/plugin-transform-react-display-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", + "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", "requires": { - "@emotion/memoize": "0.7.4" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", "requires": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" - }, - "@emotion/styled": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz", - "integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==", + "@babel/plugin-transform-react-jsx-development": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", + "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", "requires": { - "@emotion/styled-base": "^10.0.27", - "babel-plugin-emotion": "^10.0.27" + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + } } }, - "@emotion/styled-base": { - "version": "10.0.31", - "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz", - "integrity": "sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==", + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/is-prop-valid": "0.8.8", - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, - "@graphql-tools/schema": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.0.16.tgz", - "integrity": "sha512-e5jqE13L5eywCc0Uqlf2ThgScj1KgrCQmwvm+giVK0Dh9goMbwLZt/ciEJSr/LYn/vsH5sec9Qu5Jml6IX7zLA==", + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", + "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", "requires": { - "@graphql-tools/utils": "6.0.16", - "tslib": "~2.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" }, "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, - "@graphql-tools/utils": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.0.16.tgz", - "integrity": "sha512-WSYVqiIpda0CzXgHuKBJkqE0zZs4aruoVxn5KVMmqDoZbPVJ4f/pATVgKYyelOlBlx5gOfs8PCFpWcQhDB39LA==", + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", + "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", "requires": { - "@ardatan/aggregate-error": "0.0.1", - "camel-case": "4.1.1" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" + "@babel/types": "^7.10.4" } }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "requires": { - "tslib": "^1.10.0" - } + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - } + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" + "regenerator-transform": "^0.14.2" } }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", "requires": { - "@hapi/hoek": "^8.3.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "@babel/plugin-transform-runtime": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", + "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "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==", - "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==", + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "requires": { - "color-name": "~1.1.4" + "@babel/types": "^7.10.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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "has-flag": "^4.0.0" + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } } } }, - "@mapbox/hast-util-table-cell-style": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", - "integrity": "sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA==", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", "requires": { - "unist-util-visit": "^1.3.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, - "@mdx-js/mdx": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.5.8.tgz", - "integrity": "sha512-OzanPTN0p9GZOEVeEuEa8QsjxxGyfFOOnI/+V1oC1su9UIN4KUg1k4n/hWTZC+VZhdW1Lfj6+Ho8nIs6L+pbDA==", + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", "requires": { - "@babel/core": "7.8.4", - "@babel/plugin-syntax-jsx": "7.8.3", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "^1.5.8", - "babel-plugin-apply-mdx-type-prop": "^1.5.8", - "babel-plugin-extract-import-names": "^1.5.8", - "camelcase-css": "2.0.1", - "detab": "2.0.3", - "hast-util-raw": "5.0.2", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "7.0.0", - "remark-mdx": "^1.5.8", - "remark-parse": "7.0.2", - "remark-squeeze-paragraphs": "3.0.4", - "style-to-object": "0.3.0", - "unified": "8.4.2", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.2" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "@mdx-js/react": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.8.tgz", - "integrity": "sha512-L3rehITVxqDHOPJFGBSHKt3Mv/p3MENYlGIwLNYU89/iVqTLMD/vz8hL9RQtKqRoMbKuWpzzLlKIObqJzthNYg==" - }, - "@mdx-js/runtime": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/runtime/-/runtime-2.0.0-next.7.tgz", - "integrity": "sha512-+Nnjjs1LsdxkkdLODnFE0gz0B69uYJ+eUxScUBDoOY61jnm1NTvq/Axu3/Ax4YMtNwVCQMqBXXeOgLBDku1ISg==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", "requires": { - "@mdx-js/mdx": "^2.0.0-next.7", - "@mdx-js/react": "^2.0.0-next.7", - "buble-jsx-only": "^0.19.8" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" }, "dependencies": { - "@babel/code-frame": { + "@babel/helper-plugin-utils": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/core": { + "@babel/helper-regex": { "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "lodash": "^4.17.19" } - }, - "@babel/helper-get-function-arity": { + } + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", + "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "requires": { - "@babel/types": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", "requires": { - "@babel/types": "^7.11.0" + "lodash": "^4.17.19" } }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "requires": { - "@babel/types": "^7.10.4" + "regenerate": "^1.4.0" } }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "requires": { - "@babel/types": "^7.10.4" + "jsesc": "~0.5.0" } }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-replace-supers": { + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + } + } + }, + "@babel/preset-env": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" } }, - "@babel/helper-simple-access": { + "@babel/helper-module-imports": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "requires": { - "@babel/template": "^7.10.4", "@babel/types": "^7.10.4" } }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { + "@babel/helper-plugin-utils": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "lodash": "^4.17.19" } }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" } }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" - }, - "@babel/plugin-syntax-jsx": { + "@babel/plugin-proposal-unicode-property-regex": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/template": { + "@babel/plugin-transform-dotall-regex": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/types": { @@ -2681,61 +3111,151 @@ "to-fast-properties": "^2.0.0" } }, - "@mdx-js/mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", - "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "requires": { - "@babel/core": "7.10.5", - "@babel/plugin-syntax-jsx": "7.10.4", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "^2.0.0-next.7", - "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", - "babel-plugin-extract-export-names": "^2.0.0-next.7", - "babel-plugin-extract-import-names": "^2.0.0-next.7", - "camelcase-css": "2.0.1", - "detab": "2.0.3", - "hast-to-hyperscript": "9.0.0", - "hast-util-raw": "6.0.0", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "9.1.0", - "remark-footnotes": "1.0.0", - "remark-mdx": "^2.0.0-next.7", - "remark-mdxjs": "^2.0.0-next.7", - "remark-parse": "8.0.2", - "remark-squeeze-paragraphs": "4.0.0", - "unified": "9.0.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" + "regenerate": "^1.4.0" } }, - "@mdx-js/react": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", - "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" - }, - "@mdx-js/util": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", - "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", - "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "^2.0.0-next.7" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, - "babel-plugin-extract-import-names": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", - "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "requires": { - "@babel/helper-plugin-utils": "7.10.4" + "jsesc": "~0.5.0" } }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", + "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.10.4", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/plugin-transform-react-jsx-development": "^7.10.4", + "@babel/plugin-transform-react-jsx-self": "^7.10.4", + "@babel/plugin-transform-react-jsx-source": "^7.10.4", + "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/preset-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz", + "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/runtime": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", + "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/runtime-corejs3": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", + "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "@babel/standalone": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.4.tgz", + "integrity": "sha512-OHOugVBx/LrhbCxaRVUviICe0SlC7zLYueYiMLsJk6qoCAC8RXpOxpwOxeps5YXWWmGmbombDkOFq6iDK1xQSA==" + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "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==", + "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" + }, + "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -2743,506 +3263,208 @@ "requires": { "ms": "^2.1.1" } - }, - "hast-to-hyperscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz", - "integrity": "sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg==", - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz", - "integrity": "sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q==", - "requires": { - "@types/parse5": "^5.0.0", - "ccount": "^1.0.0", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-raw": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.0.tgz", - "integrity": "sha512-IQo6tv3bMMKxk53DljswliucCJOQxaZFCuKEJ7X80249dmJ1nA9LtOnnylsLlqTG98NjQ+iGcoLAYo9q5FRhRg==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "requires": { - "repeat-string": "^1.0.0" - } - }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { - "unist-util-remove": "^2.0.0" - } - }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-definitions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz", - "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-hast": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.0.tgz", - "integrity": "sha512-Akl2Vi9y9cSdr19/Dfu58PVwifPXuFt1IrHe7l+Crme1KvgUT+5z+cHLVcQVGCiNTZZcdqjnuv9vPkGsqWytWA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.3", - "collapse-white-space": "^1.0.0", - "detab": "^2.0.0", - "mdast-util-definitions": "^3.0.0", - "mdurl": "^1.0.0", - "trim-lines": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "remark-mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", - "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", - "requires": { - "parse-entities": "^2.0.0", - "remark-stringify": "^8.1.0", - "stringify-entities": "^3.0.1", - "strip-indent": "^3.0.0", - "unist-util-stringify-position": "^2.0.3" - } - }, - "remark-parse": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", - "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" - } - }, - "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "stringify-entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", - "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.2", - "is-hexadecimal": "^1.0.0" - } - }, - "unified": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", - "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" - }, - "unist-util-remove": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.0.tgz", - "integrity": "sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g==", - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", - "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "vfile-location": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz", - "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==" } } }, - "@mdx-js/util": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.8.tgz", - "integrity": "sha512-a7Gjjw8bfBSertA/pTWBA/9WKEhgaSxvQE2NTSUzaknrzGFOhs4alZSHh3RHmSFdSWv5pUuzAgsWseMLhWEVkQ==" + "@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==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } }, - "@mikaelkristiansson/domready": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mikaelkristiansson/domready/-/domready-1.0.10.tgz", - "integrity": "sha512-6cDuZeKSCSJ1KvfEQ25Y8OXUjqDJZ+HgUs6dhASWbAX8fxVraTfPsSeRe2bN+4QJDsgUaXaMWBYfRomCr04GGg==" + "@braintree/sanitize-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", + "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==" }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "@emotion/babel-plugin-jsx-pragmatic": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-0.1.5.tgz", + "integrity": "sha512-y+3AJ0SItMDaAgGPVkQBC/S/BaqaPACkQ6MyCI2CUlrjTxKttTVfD3TMtcs7vLEcLxqzZ1xiG0vzwCXjhopawQ==", "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "@babel/plugin-syntax-jsx": "^7.2.0" } }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "@emotion/babel-preset-css-prop": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/babel-preset-css-prop/-/babel-preset-css-prop-10.0.27.tgz", + "integrity": "sha512-rducrjTpLGDholp0l2l4pXqpzAqYYGMg/x4IteO0db2smf6zegn6RRZdDnbaoMSs63tfPWgo2WukT1/F1gX/AA==", "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" + "@babel/plugin-transform-react-jsx": "^7.3.0", + "@babel/runtime": "^7.5.5", + "@emotion/babel-plugin-jsx-pragmatic": "^0.1.5", + "babel-plugin-emotion": "^10.0.27" } }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "@emotion/cache": { + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" } }, - "@pieh/friendly-errors-webpack-plugin": { - "version": "1.7.0-chalk-2", - "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz", - "integrity": "sha512-65+vYGuDkHBCWWjqzzR/Ck318+d6yTI00EqII9qe3aPD1J3Olhvw0X38uM5moQb1PK/ksDXwSoPGt/5QhCiotw==", + "@emotion/core": { + "version": "10.0.28", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz", + "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==", "requires": { - "chalk": "^2.4.2", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0", - "strip-ansi": "^3" + "@babel/runtime": "^7.5.5", + "@emotion/cache": "^10.0.27", + "@emotion/css": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" } }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.3.3.tgz", - "integrity": "sha512-uc6FmPEegAZawSHjUMFQwU7EjaDn7zy1iD/KD/wBROL9F4378OES8MKMYHoRAKT61Fk7LxVKZSDR5VespMQiqw==", + "@emotion/css": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", + "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", "requires": { - "ansi-html": "^0.0.7", - "error-stack-parser": "^2.0.6", - "html-entities": "^1.2.1", - "lodash.debounce": "^4.0.8", - "native-url": "^0.2.6", - "schema-utils": "^2.6.5" + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" } }, - "@reach/alert": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/alert/-/alert-0.10.3.tgz", - "integrity": "sha512-Nu0XRKsHdM4gblgIgfTyJSl2KV1vrRTVVCVpol/f/ZVckTXAM/qN0C+JCCZSMfdjtt3u29CX6pRNkVu3PLfYsQ==", + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", "requires": { - "@reach/utils": "^0.10.3", - "@reach/visually-hidden": "^0.10.2", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } + "@emotion/memoize": "0.7.4" } }, - "@reach/auto-id": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/auto-id/-/auto-id-0.10.5.tgz", - "integrity": "sha512-we4/bwjFxJ3F+2eaddQ1HltbKvJ7AB8clkN719El7Zugpn/vOjfPMOVUiBqTmPGLUvkYrq4tpuFwLvk2HyOVHg==", - "requires": { - "@reach/utils": "0.10.5", - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, - "@reach/combobox": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/combobox/-/combobox-0.10.3.tgz", - "integrity": "sha512-Z9Xl+j4Tm9JNC6ouHhzL0lv2Y+Of5/tD7CnpxaVudeIeXQKjeg5YSUCnIBU/OTUtRsIllkgACk70SGHqvntQAw==", + "@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/descendants": "^0.10.3", - "@reach/popover": "^0.10.3", - "@reach/portal": "^0.10.3", - "@reach/utils": "^0.10.3", - "highlight-words-core": "1.2.2", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" } }, - "@reach/descendants": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/descendants/-/descendants-0.10.5.tgz", - "integrity": "sha512-8HhN4DwS/HsPQ+Ym/Ft/XJ1spXBYdE8hqpnbYR9UcU7Nx3oDbTIdhjA6JXXt23t5avYIx2jRa8YHCtVKSHuiwA==", - "requires": { - "@reach/utils": "0.10.5", - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } + "@emotion/sheet": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", + "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" }, - "@reach/dialog": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/dialog/-/dialog-0.10.3.tgz", - "integrity": "sha512-RMpUHNjRQhkjGzKt9/oLmDhwUBikW3JbEzgzZngq5MGY5kWRPwYInLDkEA8We4E43AbBsl5J/PRzQha9V+EEXw==", + "@emotion/styled": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz", + "integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==", "requires": { - "@reach/portal": "^0.10.3", - "@reach/utils": "^0.10.3", - "prop-types": "^15.7.2", - "react-focus-lock": "^2.3.1", - "react-remove-scroll": "^2.3.0", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } + "@emotion/styled-base": "^10.0.27", + "babel-plugin-emotion": "^10.0.27" } }, - "@reach/menu-button": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/menu-button/-/menu-button-0.10.3.tgz", - "integrity": "sha512-50C5nl7JJG9YcKqngmwTLVft+ZF2MMieto1GSCC7qEU8ykUNz0p69Ipup+Eqjk7KRHpSIYPlYIfAOS75dDuiZQ==", + "@emotion/styled-base": { + "version": "10.0.31", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz", + "integrity": "sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==", "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/descendants": "^0.10.3", - "@reach/popover": "^0.10.3", - "@reach/utils": "^0.10.3", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" } }, - "@reach/observe-rect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", - "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" }, - "@reach/popover": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/popover/-/popover-0.10.3.tgz", - "integrity": "sha512-41iNfdjd9/5HtYuhezTc9z9WGkloYFVB8wBmPX3QOTuBP4qYd0La5sXClrfyiVqPn/uj1gGzehrZKuh8oSkorw==", + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "@graphql-tools/delegate": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.0.18.tgz", + "integrity": "sha512-CmNTD60qcTEZM3bvOV2t3Zdj7veY0zgXXVXNgMC9Fx+D2dNdJFCwXdcPAF0SKqlJoj/alBDSl1U6nqYKT9fQOA==", "requires": { - "@reach/portal": "^0.10.3", - "@reach/rect": "^0.10.3", - "@reach/utils": "^0.10.3", - "tabbable": "^4.0.0", - "tslib": "^1.11.2" + "@ardatan/aggregate-error": "0.0.1", + "@graphql-tools/schema": "6.0.18", + "@graphql-tools/utils": "6.0.18", + "is-promise": "4.0.0", + "tslib": "~2.0.0" }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" } } }, - "@reach/portal": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/portal/-/portal-0.10.5.tgz", - "integrity": "sha512-K5K8gW99yqDPDCWQjEfSNZAbGOQWSx5AN2lpuR1gDVoz4xyWpTJ0k0LbetYJTDVvLP/InEcR7AU42JaDYDCXQw==", + "@graphql-tools/links": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.0.18.tgz", + "integrity": "sha512-r1unH0UqlUNT985zGfajhq5iysFDCeHB5I2mu+fdaAoIWQB+1dizUpwVkYarWX+u9W4OSNFrF9Hw8IwzKS+51Q==", "requires": { - "@reach/utils": "0.10.5", - "tslib": "^2.0.0" + "@graphql-tools/utils": "6.0.18", + "apollo-link": "1.2.14", + "apollo-upload-client": "14.1.1", + "cross-fetch": "3.0.5", + "form-data": "3.0.0", + "is-promise": "4.0.0", + "tslib": "~2.0.0" }, "dependencies": { + "cross-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.5.tgz", + "integrity": "sha512-FFLcLtraisj5eteosnX1gf01qYDCOc4fDy0+euOt8Kn9YBY2NtXL/pCoYPavw24NIQkQqm5ZOLsGD5Zzj0gyew==", + "requires": { + "node-fetch": "2.6.0" + } + }, + "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" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "tslib": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", @@ -3250,15 +3472,13 @@ } } }, - "@reach/rect": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/rect/-/rect-0.10.5.tgz", - "integrity": "sha512-JBKs2HniYecq5zLO6UFReX28SUBPM3n0aizdNgHuvwZmDcTfNV4jsuJYQLqJ+FbCQsrSHkBxKZqWpfGXY9bUEg==", + "@graphql-tools/schema": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.0.18.tgz", + "integrity": "sha512-xrScjRX9pTSVxqiSkx7Hn/9rzxLweysINa5Pkirdkv5lJY4e0Db53osur0nG/+SJyUmIN70tUtuhEZq4Ezr/PA==", "requires": { - "@reach/observe-rect": "1.2.0", - "@reach/utils": "0.10.5", - "prop-types": "^15.7.2", - "tslib": "^2.0.0" + "@graphql-tools/utils": "6.0.18", + "tslib": "~2.0.0" }, "dependencies": { "tslib": { @@ -3268,2432 +3488,2455 @@ } } }, - "@reach/router": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.4.tgz", - "integrity": "sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==", + "@graphql-tools/utils": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.0.18.tgz", + "integrity": "sha512-8ntYuXJucBtjViOYljeKBzScfpVTnv7BfqIPU/WJ65h6nXD+qf8fMUR1C4MpCUeFvSjMiDSB5Z4enJmau/9D3A==", "requires": { - "create-react-context": "0.3.0", - "invariant": "^2.2.3", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4" + "@ardatan/aggregate-error": "0.0.1", + "camel-case": "4.1.1" + }, + "dependencies": { + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + } } }, - "@reach/tabs": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/tabs/-/tabs-0.10.3.tgz", - "integrity": "sha512-yKHyb4NRah9+V8kjkgzIXnj+FPG9aNfHX9uBs32A4MAG4RQLsZr9jBVSoWV1jxMUcYDe4CLtQj8qVphaW/GB2A==", + "@graphql-tools/wrap": { + "version": "6.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.0.18.tgz", + "integrity": "sha512-AHegxtawd+ivpUhI1gP4xQWWYPl5GvCmvzaas03DfrGlGcV/LyKJIzdZDEs2E4oCgwCU7F9UQMxgTsq+Dttn5Q==", "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/descendants": "^0.10.3", - "@reach/utils": "^0.10.3", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" + "@graphql-tools/delegate": "6.0.18", + "@graphql-tools/schema": "6.0.18", + "@graphql-tools/utils": "6.0.18", + "aggregate-error": "3.0.1", + "is-promise": "4.0.0", + "tslib": "~2.0.0" }, "dependencies": { + "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==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" } } }, - "@reach/tooltip": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/tooltip/-/tooltip-0.10.3.tgz", - "integrity": "sha512-tbj569uSJ+O86fAvR62lK8Tb00aTQxah6dFKgf06lskCGUoYzeFxkZTds9b+TRjzz9G1v68McQHwuAZUH0XrGA==", - "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/portal": "^0.10.3", - "@reach/rect": "^0.10.3", - "@reach/utils": "^0.10.3", - "@reach/visually-hidden": "^0.10.2", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/utils": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/utils/-/utils-0.10.5.tgz", - "integrity": "sha512-5E/xxQnUbmpI/LrufBAOXjunl96DnqX6B4zC2MO2KH/dRzLug5gM5VuOwV26egsp0jvsSPxojwciOhS43px3qw==", - "requires": { - "@types/warning": "^3.0.0", - "tslib": "^2.0.0", - "warning": "^4.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" }, - "@reach/visually-hidden": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.10.4.tgz", - "integrity": "sha512-GnuPuTRCf+Ih47BoKvGyB+jP8EVWLb04GfbGa5neOrjdp90qrb4zr7pMSL4ZvTsrxt9MRooJA2BhSxs5DbyqCQ==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" }, - "@sindresorhus/slugify": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-0.9.1.tgz", - "integrity": "sha512-b6heYM9dzZD13t2GOiEQTDE0qX+I1GyOotMwKh9VQqzuNiVdPVT8dM43fe9HNb/3ul+Qwd5oKSEDrDIfhq3bnQ==", + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "requires": { - "escape-string-regexp": "^1.0.5", - "lodash.deburr": "^4.1.0" + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" } }, - "@styled-system/css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", - "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==" - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + "@hapi/hoek": "^8.3.0" } }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" }, "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "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": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "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": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "color-name": "~1.1.4" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } } } }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "requires": { - "@babel/types": "^7.4.4" + "debug": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } } }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - } + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "@mapbox/hast-util-table-cell-style": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", + "integrity": "sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA==", "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" + "unist-util-visit": "^1.3.0" }, "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "unist-util-visit-parents": "^2.0.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "unist-util-is": "^3.0.0" } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" } } }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@turist/fetch": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.1.6.tgz", - "integrity": "sha512-+wd8+GhYWRxjsqhzJLozcvj0Vo9bi9EMiAzsgDM187HrnEUOrk0jY+t61UEtmN8gZYqvs87aP1vjXL1uq11nQw==", - "requires": { - "@types/node-fetch": "2" - } - }, - "@turist/time": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.1.tgz", - "integrity": "sha512-M2BiThcbxMxSKX8W4z5u9jKZn6datnM3+FpEU+eYw0//l31E2xhqi7vTAuJ/Sf0P3yhp66SDJgPu3bRRpvrdQQ==" - }, - "@types/classnames": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", - "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" - }, - "@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/common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-htRqZr5qn8EzMelhX/Xmx142z218lLyGaeZ3YR8jlze4TATRU9huKKvuBmAJEW4LCC4pnY1N6JAm6p85fMHjhg==" - }, - "@types/configstore": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", - "integrity": "sha1-zR6FU2M60xhcPy8jns/10mQ+krY=" - }, - "@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" - }, - "@types/estree": { - "version": "0.0.44", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz", - "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==" - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, - "@types/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz", - "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==", - "requires": { - "@types/unist": "*" - } - }, - "@types/history": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.7.tgz", - "integrity": "sha512-2xtoL22/3Mv6a70i4+4RB7VgbDDORoWwjcqeNysojZA0R7NK17RbY5Gof/2QiFfJgX+KkWghbwJ+d/2SB8Ndzg==" - }, - "@types/http-proxy": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", - "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "@types/lodash": { - "version": "4.14.159", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.159.tgz", - "integrity": "sha512-gF7A72f7WQN33DpqOWw9geApQPh4M3PxluMtaHxWHXEGSN12/WbcEk/eNSqWNQcQhF66VSZ06vCF94CrHwXJDg==" - }, - "@types/lodash.sample": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@types/lodash.sample/-/lodash.sample-4.2.6.tgz", - "integrity": "sha512-hxBvsUjPcW1O8mC9TiBE4m8TwvLuUU+zW8J6GI1M6WmPg8J87mXGt7zavpJ/9Znb+0rVsSB3VNAjCFaJ9YUJKg==", - "requires": { - "@types/lodash": "*" - } - }, - "@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", - "requires": { - "@types/unist": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" - }, - "@types/node-fetch": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", - "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", + "@mdx-js/mdx": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.16.tgz", + "integrity": "sha512-jnYyJ0aCafCIehn3GjYcibIapaLBgs3YkoenNQBPcPFyyuUty7B3B07OE+pMllhJ6YkWeP/R5Ax19x0nqTzgJw==", "requires": { - "@types/node": "*", - "form-data": "^3.0.0" + "@babel/core": "7.10.5", + "@babel/plugin-syntax-jsx": "7.10.4", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.16", + "babel-plugin-apply-mdx-type-prop": "1.6.16", + "babel-plugin-extract-import-names": "1.6.16", + "camelcase-css": "2.0.1", + "detab": "2.0.3", + "hast-util-raw": "6.0.0", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "9.1.0", + "remark-footnotes": "1.0.0", + "remark-mdx": "1.6.16", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.1.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" }, "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==", + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "unified": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.1.0.tgz", + "integrity": "sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag==", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" } } } }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" - }, - "@types/reach__router": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.5.tgz", - "integrity": "sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ==", - "requires": { - "@types/history": "*", - "@types/react": "*" - } + "@mdx-js/react": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.8.tgz", + "integrity": "sha512-L3rehITVxqDHOPJFGBSHKt3Mv/p3MENYlGIwLNYU89/iVqTLMD/vz8hL9RQtKqRoMbKuWpzzLlKIObqJzthNYg==" }, - "@types/react": { - "version": "16.9.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.45.tgz", - "integrity": "sha512-vv950slTF5UZ5eDOf13b8qC1SD4rTvkqg3HfaUKzr17U97oeJZAa+dUaIHn0QoOJflNTIt6Pem9MmapULs9dkA==", + "@mdx-js/runtime": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/runtime/-/runtime-2.0.0-next.7.tgz", + "integrity": "sha512-+Nnjjs1LsdxkkdLODnFE0gz0B69uYJ+eUxScUBDoOY61jnm1NTvq/Axu3/Ax4YMtNwVCQMqBXXeOgLBDku1ISg==", "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "@mdx-js/mdx": "^2.0.0-next.7", + "@mdx-js/react": "^2.0.0-next.7", + "buble-jsx-only": "^0.19.8" }, "dependencies": { - "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@mdx-js/mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", + "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", + "requires": { + "@babel/core": "7.10.5", + "@babel/plugin-syntax-jsx": "7.10.4", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "^2.0.0-next.7", + "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", + "babel-plugin-extract-export-names": "^2.0.0-next.7", + "babel-plugin-extract-import-names": "^2.0.0-next.7", + "camelcase-css": "2.0.1", + "detab": "2.0.3", + "hast-to-hyperscript": "9.0.0", + "hast-util-raw": "6.0.0", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "9.1.0", + "remark-footnotes": "1.0.0", + "remark-mdx": "^2.0.0-next.7", + "remark-mdxjs": "^2.0.0-next.7", + "remark-parse": "8.0.2", + "remark-squeeze-paragraphs": "4.0.0", + "unified": "9.0.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + } + }, + "@mdx-js/react": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", + "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" + }, + "@mdx-js/util": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", + "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", + "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "^2.0.0-next.7" + } + }, + "babel-plugin-extract-import-names": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", + "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "requires": { + "repeat-string": "^1.0.0" + } + }, + "mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "remark-mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", + "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", + "requires": { + "parse-entities": "^2.0.0", + "remark-stringify": "^8.1.0", + "stringify-entities": "^3.0.1", + "strip-indent": "^3.0.0", + "unist-util-stringify-position": "^2.0.3" + } + }, + "remark-parse": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", + "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" + } + }, + "stringify-entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", + "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.2", + "is-hexadecimal": "^1.0.0" + } + }, + "unified": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", + "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } } } }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "@mdx-js/util": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.16.tgz", + "integrity": "sha512-SFtLGIGZummuyMDPRL5KdmpgI8U19Ble28UjEWihPjGxF1Lgj8aDjLWY8KiaUy9eqb9CKiVCqEIrK9jbnANfkw==" + }, + "@mikaelkristiansson/domready": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mikaelkristiansson/domready/-/domready-1.0.10.tgz", + "integrity": "sha512-6cDuZeKSCSJ1KvfEQ25Y8OXUjqDJZ+HgUs6dhASWbAX8fxVraTfPsSeRe2bN+4QJDsgUaXaMWBYfRomCr04GGg==" + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "requires": { - "@types/node": "*" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, - "@types/rimraf": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz", - "integrity": "sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "requires": { - "@types/glob": "*", - "@types/node": "*" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, - "@types/tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==" + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" }, - "@types/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=" - }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "@types/vfile-message": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", - "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", + "@pieh/friendly-errors-webpack-plugin": { + "version": "1.7.0-chalk-2", + "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz", + "integrity": "sha512-65+vYGuDkHBCWWjqzzR/Ck318+d6yTI00EqII9qe3aPD1J3Olhvw0X38uM5moQb1PK/ksDXwSoPGt/5QhCiotw==", "requires": { - "vfile-message": "*" + "chalk": "^2.4.2", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0", + "strip-ansi": "^3" } }, - "@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.3.3.tgz", + "integrity": "sha512-uc6FmPEegAZawSHjUMFQwU7EjaDn7zy1iD/KD/wBROL9F4378OES8MKMYHoRAKT61Fk7LxVKZSDR5VespMQiqw==", "requires": { - "@types/yargs-parser": "*" + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "lodash.debounce": "^4.0.8", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5" } }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@types/yoga-layout": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", - "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" + "@popperjs/core": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", + "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==" }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "@reach/alert": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/alert/-/alert-0.10.3.tgz", + "integrity": "sha512-Nu0XRKsHdM4gblgIgfTyJSl2KV1vrRTVVCVpol/f/ZVckTXAM/qN0C+JCCZSMfdjtt3u29CX6pRNkVu3PLfYsQ==", "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" + "@reach/utils": "^0.10.3", + "@reach/visually-hidden": "^0.10.2", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "@reach/auto-id": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/auto-id/-/auto-id-0.10.5.tgz", + "integrity": "sha512-we4/bwjFxJ3F+2eaddQ1HltbKvJ7AB8clkN719El7Zugpn/vOjfPMOVUiBqTmPGLUvkYrq4tpuFwLvk2HyOVHg==", "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@reach/utils": "0.10.5", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "@reach/combobox": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/combobox/-/combobox-0.10.3.tgz", + "integrity": "sha512-Z9Xl+j4Tm9JNC6ouHhzL0lv2Y+Of5/tD7CnpxaVudeIeXQKjeg5YSUCnIBU/OTUtRsIllkgACk70SGHqvntQAw==", "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" + "@reach/auto-id": "^0.10.3", + "@reach/descendants": "^0.10.3", + "@reach/popover": "^0.10.3", + "@reach/portal": "^0.10.3", + "@reach/utils": "^0.10.3", + "highlight-words-core": "1.2.2", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "@reach/descendants": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/descendants/-/descendants-0.10.5.tgz", + "integrity": "sha512-8HhN4DwS/HsPQ+Ym/Ft/XJ1spXBYdE8hqpnbYR9UcU7Nx3oDbTIdhjA6JXXt23t5avYIx2jRa8YHCtVKSHuiwA==", "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@reach/utils": "0.10.5", + "tslib": "^2.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" } } }, - "@urql/core": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-1.12.3.tgz", - "integrity": "sha512-e4IXXQ4nes3KyusgYV925DuzfDAfo4ex7Ls3tZfOExkxEcXh0i0XnizXp0rvZmWRch69YCkc+Lh1Gy2aY49HTQ==", + "@reach/dialog": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/dialog/-/dialog-0.10.3.tgz", + "integrity": "sha512-RMpUHNjRQhkjGzKt9/oLmDhwUBikW3JbEzgzZngq5MGY5kWRPwYInLDkEA8We4E43AbBsl5J/PRzQha9V+EEXw==", "requires": { - "wonka": "^4.0.14" + "@reach/portal": "^0.10.3", + "@reach/utils": "^0.10.3", + "prop-types": "^15.7.2", + "react-focus-lock": "^2.3.1", + "react-remove-scroll": "^2.3.0", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "@reach/menu-button": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/menu-button/-/menu-button-0.10.3.tgz", + "integrity": "sha512-50C5nl7JJG9YcKqngmwTLVft+ZF2MMieto1GSCC7qEU8ykUNz0p69Ipup+Eqjk7KRHpSIYPlYIfAOS75dDuiZQ==", "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@reach/auto-id": "^0.10.3", + "@reach/descendants": "^0.10.3", + "@reach/popover": "^0.10.3", + "@reach/utils": "^0.10.3", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "@reach/observe-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", + "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@reach/popover": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/popover/-/popover-0.10.3.tgz", + "integrity": "sha512-41iNfdjd9/5HtYuhezTc9z9WGkloYFVB8wBmPX3QOTuBP4qYd0La5sXClrfyiVqPn/uj1gGzehrZKuh8oSkorw==", "requires": { - "@webassemblyjs/wast-printer": "1.9.0" + "@reach/portal": "^0.10.3", + "@reach/rect": "^0.10.3", + "@reach/utils": "^0.10.3", + "tabbable": "^4.0.0", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "@reach/portal": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/portal/-/portal-0.10.5.tgz", + "integrity": "sha512-K5K8gW99yqDPDCWQjEfSNZAbGOQWSx5AN2lpuR1gDVoz4xyWpTJ0k0LbetYJTDVvLP/InEcR7AU42JaDYDCXQw==", "requires": { - "@webassemblyjs/ast": "1.9.0" + "@reach/utils": "0.10.5", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "@reach/rect": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/rect/-/rect-0.10.5.tgz", + "integrity": "sha512-JBKs2HniYecq5zLO6UFReX28SUBPM3n0aizdNgHuvwZmDcTfNV4jsuJYQLqJ+FbCQsrSHkBxKZqWpfGXY9bUEg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@reach/observe-rect": "1.2.0", + "@reach/utils": "0.10.5", + "prop-types": "^15.7.2", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "@reach/router": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.4.tgz", + "integrity": "sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==", "requires": { - "@xtuc/ieee754": "^1.2.0" + "create-react-context": "0.3.0", + "invariant": "^2.2.3", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4" } }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "@reach/tabs": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/tabs/-/tabs-0.10.3.tgz", + "integrity": "sha512-yKHyb4NRah9+V8kjkgzIXnj+FPG9aNfHX9uBs32A4MAG4RQLsZr9jBVSoWV1jxMUcYDe4CLtQj8qVphaW/GB2A==", "requires": { - "@xtuc/long": "4.2.2" + "@reach/auto-id": "^0.10.3", + "@reach/descendants": "^0.10.3", + "@reach/utils": "^0.10.3", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "@reach/tooltip": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@reach/tooltip/-/tooltip-0.10.3.tgz", + "integrity": "sha512-tbj569uSJ+O86fAvR62lK8Tb00aTQxah6dFKgf06lskCGUoYzeFxkZTds9b+TRjzz9G1v68McQHwuAZUH0XrGA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@reach/auto-id": "^0.10.3", + "@reach/portal": "^0.10.3", + "@reach/rect": "^0.10.3", + "@reach/utils": "^0.10.3", + "@reach/visually-hidden": "^0.10.2", + "prop-types": "^15.7.2", + "tslib": "^1.11.2" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "@reach/utils": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@reach/utils/-/utils-0.10.5.tgz", + "integrity": "sha512-5E/xxQnUbmpI/LrufBAOXjunl96DnqX6B4zC2MO2KH/dRzLug5gM5VuOwV26egsp0jvsSPxojwciOhS43px3qw==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@types/warning": "^3.0.0", + "tslib": "^2.0.0", + "warning": "^4.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "@reach/visually-hidden": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.10.4.tgz", + "integrity": "sha512-GnuPuTRCf+Ih47BoKvGyB+jP8EVWLb04GfbGa5neOrjdp90qrb4zr7pMSL4ZvTsrxt9MRooJA2BhSxs5DbyqCQ==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } } }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "@sindresorhus/slugify": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-0.9.1.tgz", + "integrity": "sha512-b6heYM9dzZD13t2GOiEQTDE0qX+I1GyOotMwKh9VQqzuNiVdPVT8dM43fe9HNb/3ul+Qwd5oKSEDrDIfhq3bnQ==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "escape-string-regexp": "^1.0.5", + "lodash.deburr": "^4.1.0" } }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } + "@styled-system/css": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", + "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==" }, - "@wry/equality": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.9.tgz", - "integrity": "sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ==", - "requires": { - "tslib": "^1.9.3" - } + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" }, - "@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==" + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" }, - "abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "requires": { - "xtend": "~3.0.0" - }, - "dependencies": { - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + "@svgr/babel-plugin-transform-svg-component": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + "@svgr/babel-preset": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + } }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "@svgr/core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", "requires": { - "es6-promisify": "^5.0.0" + "@svgr/plugin-jsx": "^4.3.3", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" }, "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "es6-promise": "^4.0.3" + "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=" } } }, - "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==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "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==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "algoliasearch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.0.3.tgz", - "integrity": "sha512-/4aFAPDoFGEDsx3c0ggKfRC1FeEdtM1HyWMwVe/wkHf/GH6CF67NFNIaBgkqt4i/SYAs92WL8B2Y8cDEMQGfGg==", + "@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", "requires": { - "@algolia/cache-browser-local-storage": "4.0.3", - "@algolia/cache-common": "4.0.3", - "@algolia/cache-in-memory": "4.0.3", - "@algolia/client-account": "4.0.3", - "@algolia/client-analytics": "4.0.3", - "@algolia/client-common": "4.0.3", - "@algolia/client-recommendation": "4.0.3", - "@algolia/client-search": "4.0.3", - "@algolia/logger-common": "4.0.3", - "@algolia/logger-console": "4.0.3", - "@algolia/requester-browser-xhr": "4.0.3", - "@algolia/requester-common": "4.0.3", - "@algolia/requester-node-http": "4.0.3", - "@algolia/transporter": "4.0.3" + "@babel/types": "^7.4.4" } }, - "algoliasearch-helper": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.1.1.tgz", - "integrity": "sha512-Jkqlp8jezQRixf7sbQ2zFXHpdaT41g9sHBqT6pztv5nfDmg94K+pwesAy6UbxRY78IL54LIaV1FLttMtT+IzzA==", + "@svgr/plugin-jsx": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", "requires": { - "events": "^1.1.1" - }, - "dependencies": { - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - } + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.3", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" } }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", "requires": { - "string-width": "^3.0.0" + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "ansi-regex": "^4.1.0" + "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=" } } }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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==", + "@svgr/webpack": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", + "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", "requires": { - "color-convert": "^1.9.0" + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.3.3", + "@svgr/plugin-jsx": "^4.3.3", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "defer-to-connect": "^1.0.1" } }, - "apollo-link": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.13.tgz", - "integrity": "sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw==", + "@tippyjs/react": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.1.0.tgz", + "integrity": "sha512-g6Dpm46edr9T9z+BYxd/eJZa6QMFc4T4z5xrztxVlkti7AhNYf7OaE6b3Nh+boUZZ9wn8xkNq9VrQM5K4huwnQ==", "requires": { - "apollo-utilities": "^1.3.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3", - "zen-observable-ts": "^0.8.20" + "tippy.js": "^6.2.0" } }, - "apollo-link-http": { - "version": "1.5.16", - "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.16.tgz", - "integrity": "sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw==", + "@turist/fetch": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.1.7.tgz", + "integrity": "sha512-XP20kvfyMNlWdPVQXyuzA40LoCHbbJptikt7W+TlZ5sS+NNjk70xjXCtHBLEudp7li3JldXEFSIUzpW1a0WEhA==", "requires": { - "apollo-link": "^1.2.13", - "apollo-link-http-common": "^0.2.15", - "tslib": "^1.9.3" + "@types/node-fetch": "2" } }, - "apollo-link-http-common": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz", - "integrity": "sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg==", - "requires": { - "apollo-link": "^1.2.13", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3" - } + "@turist/time": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.1.tgz", + "integrity": "sha512-M2BiThcbxMxSKX8W4z5u9jKZn6datnM3+FpEU+eYw0//l31E2xhqi7vTAuJ/Sf0P3yhp66SDJgPu3bRRpvrdQQ==" }, - "apollo-utilities": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.3.tgz", - "integrity": "sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw==", - "requires": { - "@wry/equality": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" - } + "@types/classnames": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", + "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" }, - "application-config-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", - "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=" + "@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==" }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "@types/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-htRqZr5qn8EzMelhX/Xmx142z218lLyGaeZ3YR8jlze4TATRU9huKKvuBmAJEW4LCC4pnY1N6JAm6p85fMHjhg==" }, - "arch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", - "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==" + "@types/configstore": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", + "integrity": "sha1-zR6FU2M60xhcPy8jns/10mQ+krY=" }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } + "@types/debug": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==" }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "@types/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } }, - "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=" + "@types/hast": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz", + "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==", + "requires": { + "@types/unist": "*" + } }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "@types/history": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.7.tgz", + "integrity": "sha512-2xtoL22/3Mv6a70i4+4RB7VgbDDORoWwjcqeNysojZA0R7NK17RbY5Gof/2QiFfJgX+KkWghbwJ+d/2SB8Ndzg==" }, - "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==", + "@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" + "@types/node": "*" } }, - "array-iterate": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", - "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } }, - "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==" + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "@types/lodash": { + "version": "4.14.160", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.160.tgz", + "integrity": "sha512-aP03BShJoO+WVndoVj/WNcB/YBPt+CIU1mvaao2GRAHy2yg4pT/XS4XnVHEQBjPJGycWf/9seKEO9vopTJGkvA==" }, - "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==", + "@types/lodash.sample": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@types/lodash.sample/-/lodash.sample-4.2.6.tgz", + "integrity": "sha512-hxBvsUjPcW1O8mC9TiBE4m8TwvLuUU+zW8J6GI1M6WmPg8J87mXGt7zavpJ/9Znb+0rVsSB3VNAjCFaJ9YUJKg==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "@types/lodash": "*" } }, - "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" + "@types/unist": "*" } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", "requires": { - "safer-buffer": "~2.1.0" + "@types/node": "*" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } + "@types/node": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", + "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "@types/node-fetch": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", + "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "@types/node": "*", + "form-data": "^3.0.0" }, "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "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": { - "inherits": "2.0.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" } } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, - "async": { + "@types/q": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, - "async-cache": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", - "integrity": "sha1-SppaidBl7F2OUlS9nulrp2xTK1o=", + "@types/reach__router": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.5.tgz", + "integrity": "sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ==", "requires": { - "lru-cache": "^4.0.0" + "@types/history": "*", + "@types/react": "*" } }, - "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==" - }, - "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==" - }, - "async-retry-ng": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-retry-ng/-/async-retry-ng-2.0.1.tgz", - "integrity": "sha512-iitlc2murdQ3/A5Re3CcplQBEf7vOmFrFQ6RFn3+/+zZUyIHYkZnnEziMSa6YIb2Bs2EJEPZWReTxjHqvQbDbw==" - }, - "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==" - }, - "auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" - }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "@types/react": { + "version": "16.9.47", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.47.tgz", + "integrity": "sha512-dAJO4VbrjYqTUwFiQqAKjLyHHl4RSTNnRyPdX3p16MPbDKvow51wxATUPxoe2QsiXNMEYrOjc2S6s92VjG+1VQ==", "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "@types/prop-types": "*", + "csstype": "^3.0.2" }, "dependencies": { - "caniuse-lite": { - "version": "1.0.30001112", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz", - "integrity": "sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==" - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } + "csstype": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", + "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" } } }, - "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=" + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "@types/rimraf": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz", + "integrity": "sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==", + "requires": { + "@types/glob": "*", + "@types/node": "*" + } }, - "axe-core": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", - "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==" + "@types/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==" }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "@types/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=" + }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + }, + "@types/vfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", + "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", "requires": { - "follow-redirects": "1.5.10" + "@types/node": "*", + "@types/unist": "*", + "@types/vfile-message": "*" } }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } + "vfile-message": "*" } }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" + "@types/yargs-parser": "*" } }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "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==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - } - } - } - } + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, - "babel-plugin-add-module-exports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.3.3.tgz", - "integrity": "sha512-hC37mm7aAdEb1n8SgggG8a1QuhZapsY/XLCi4ETSH6AVjXBCWEa50CXlOsAMPPWLnSx5Ns6mzz39uvuseh0Xjg==", - "requires": { - "chokidar": "^2.0.4" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "optional": 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" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - } - } + "@types/yoga-layout": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", + "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.8.tgz", - "integrity": "sha512-xYp5F9mAnZdDRFSd1vF3XQ0GQUbIulCpnuht2jCmK30GAHL8szVL7TgzwhEGamQ6yJmP/gEyYNM9OR5D2n26eA==", + "@types/zen-observable": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz", + "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@mdx-js/util": "^1.5.8" + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.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==", + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "requires": { - "object.assign": "^4.1.0" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" } }, - "babel-plugin-emotion": { - "version": "10.0.33", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", - "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" } }, - "babel-plugin-extract-export-names": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-export-names/-/babel-plugin-extract-export-names-2.0.0-next.7.tgz", - "integrity": "sha512-CTsKh5l99oBd5jemej5BHdzxwaXDYNi3zryGEHaCcO6h3H6OAx7sQyHV76yO7eWHXFBc+t30YSuubpwJQwLHhg==", + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "requires": { - "@babel/helper-plugin-utils": "7.10.4" + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" } } }, - "babel-plugin-extract-import-names": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.8.tgz", - "integrity": "sha512-LcLfP8ZRBZMdMAXHLugyvvd5PY0gMmLMWFogWAUsG32X6TYW2Eavx+il2bw73KDbW+UdCC1bAJ3NuU25T1MI3g==", - "requires": { - "@babel/helper-plugin-utils": "7.8.3" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "@urql/core": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-1.12.3.tgz", + "integrity": "sha512-e4IXXQ4nes3KyusgYV925DuzfDAfo4ex7Ls3tZfOExkxEcXh0i0XnizXp0rvZmWRch69YCkc+Lh1Gy2aY49HTQ==", "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "wonka": "^4.0.14" } }, - "babel-plugin-preval": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz", - "integrity": "sha512-s8hmTlRSmzcL7cHSIi0s6WxmpOAxfIlWqSVQwBIt7V5bNBaac+8JMZ6kJXLOazMJ8gCIcb5AJgQUgPHvbSYUzw==", + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "requires": { - "babel-plugin-macros": "^2.2.2", - "require-from-string": "^2.0.2" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, - "babel-plugin-remove-export-keywords": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-export-keywords/-/babel-plugin-remove-export-keywords-1.6.16.tgz", - "integrity": "sha512-JrB9ZASlMAfkRF+5NdgoQxgenhJxzXFEO1vrqsSDJdzLrC38L2wrvXF9mm1YLbrehkZxcrNz9UYDyARP4jaY9g==" - }, - "babel-plugin-remove-graphql-queries": { - "version": "2.9.16", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.16.tgz", - "integrity": "sha512-7Z+awkeghPRk4axY8N6ywQu9GpxpqHTkXRiZ+VxDaIppbybeZsAQ7uA6B4B63M4nm0BSOrHZzZWuT/kOg2RA8g==" + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, - "babel-preset-gatsby": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.5.5.tgz", - "integrity": "sha512-gkBRAEv5OvSerqh15gMHCCtExiUpTuKiKwb6QBImb3nSBAuCcjr0ESHzpgk4m0eZLbxUaeooVd0uPyC6FQsCBQ==", + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "requires": { - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.10.3", - "@babel/plugin-transform-spread": "^7.10.1", - "@babel/preset-env": "^7.10.3", - "@babel/preset-react": "^7.10.1", - "@babel/runtime": "^7.10.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "gatsby-core-utils": "^1.3.15", - "gatsby-legacy-polyfills": "^0.0.2" + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@wry/context": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.5.2.tgz", + "integrity": "sha512-B/JLuRZ/vbEKHRUiGj6xiMojST1kHhu4WcreLfNN7q9DqQFrb97cWgf/kiYsPSUCAMVN0HzfFc8XjJdzgZzfjw==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@wry/equality": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", + "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@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==" + }, + "abstract-leveldown": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", + "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", + "requires": { + "xtend": "~3.0.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", - "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", - "requires": { - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", - "requires": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + } + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "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==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "algoliasearch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.0.3.tgz", + "integrity": "sha512-/4aFAPDoFGEDsx3c0ggKfRC1FeEdtM1HyWMwVe/wkHf/GH6CF67NFNIaBgkqt4i/SYAs92WL8B2Y8cDEMQGfGg==", + "requires": { + "@algolia/cache-browser-local-storage": "4.0.3", + "@algolia/cache-common": "4.0.3", + "@algolia/cache-in-memory": "4.0.3", + "@algolia/client-account": "4.0.3", + "@algolia/client-analytics": "4.0.3", + "@algolia/client-common": "4.0.3", + "@algolia/client-recommendation": "4.0.3", + "@algolia/client-search": "4.0.3", + "@algolia/logger-common": "4.0.3", + "@algolia/logger-console": "4.0.3", + "@algolia/requester-browser-xhr": "4.0.3", + "@algolia/requester-common": "4.0.3", + "@algolia/requester-node-http": "4.0.3", + "@algolia/transporter": "4.0.3" + } + }, + "algoliasearch-helper": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.1.1.tgz", + "integrity": "sha512-Jkqlp8jezQRixf7sbQ2zFXHpdaT41g9sHBqT6pztv5nfDmg94K+pwesAy6UbxRY78IL54LIaV1FLttMtT+IzzA==", + "requires": { + "events": "^1.1.1" + }, + "dependencies": { + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "ansi-regex": "^4.1.0" } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + } + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "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=", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "remove-trailing-separator": "^1.0.1" } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + } + } + }, + "apollo-link": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", + "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", + "requires": { + "apollo-utilities": "^1.3.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.21" + } + }, + "apollo-link-http": { + "version": "1.5.17", + "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz", + "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==", + "requires": { + "apollo-link": "^1.2.14", + "apollo-link-http-common": "^0.2.16", + "tslib": "^1.9.3" + } + }, + "apollo-link-http-common": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz", + "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==", + "requires": { + "apollo-link": "^1.2.14", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" + } + }, + "apollo-upload-client": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-14.1.1.tgz", + "integrity": "sha512-6H6AW5habDHH/9XCJ8l2qlkaohwIcO+Lt/8P2908/yx0TC0oaiDNVu+0v2YE/5gA6NP0RvztUodzJUZJz27C0g==", + "requires": { + "@apollo/client": "^3.0.2", + "@babel/runtime": "^7.10.5", + "extract-files": "^9.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "regenerator-runtime": "^0.13.4" } }, - "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "apollo-utilities": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", + "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", + "requires": { + "@wry/equality": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + } + }, + "application-config-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", + "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", + "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "regenerator-runtime": "^0.13.4" } }, - "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "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==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "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=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "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==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-iterate": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", + "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "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==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "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==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + } + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "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==", + "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==", + "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==", + "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=" }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "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=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", + "integrity": "sha1-SppaidBl7F2OUlS9nulrp2xTK1o=", + "requires": { + "lru-cache": "^4.0.0" + } + }, + "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==" + }, + "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==" + }, + "async-retry-ng": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-retry-ng/-/async-retry-ng-2.0.1.tgz", + "integrity": "sha512-iitlc2murdQ3/A5Re3CcplQBEf7vOmFrFQ6RFn3+/+zZUyIHYkZnnEziMSa6YIb2Bs2EJEPZWReTxjHqvQbDbw==" + }, + "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==" + }, + "auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001118", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001118.tgz", + "integrity": "sha512-RNKPLojZo74a0cP7jFMidQI7nvLER40HgNfgKQEJ2PFm225L0ectUungNQoK3Xk3StQcFbpBPNEvoWD59436Hg==" }, - "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", - "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "has-flag": "^3.0.0" } + } + } + }, + "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=" + }, + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + }, + "axe-core": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", + "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==" + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" + "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" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", - "requires": { - "regenerator-transform": "^0.14.2" - } + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, - "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "minimist": "^1.2.0" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "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==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + } + } + }, + "babel-plugin-add-module-exports": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.3.3.tgz", + "integrity": "sha512-hC37mm7aAdEb1n8SgggG8a1QuhZapsY/XLCi4ETSH6AVjXBCWEa50CXlOsAMPPWLnSx5Ns6mzz39uvuseh0Xjg==", + "requires": { + "chokidar": "^2.0.4" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "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" } - }, - "@babel/plugin-transform-typeof-symbol": { + } + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.16.tgz", + "integrity": "sha512-hjUd24Yhnr5NKtHpC2mcRBGjC6RUKGzSzjN9g5SdjT4WpL/JDlpmjyBf7vWsJJSXFvMIbzRyxF4lT9ukwOnj/w==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.16" + }, + "dependencies": { + "@babel/helper-plugin-utils": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-emotion": { + "version": "10.0.33", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", + "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + } + }, + "babel-plugin-extract-export-names": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-export-names/-/babel-plugin-extract-export-names-2.0.0-next.7.tgz", + "integrity": "sha512-CTsKh5l99oBd5jemej5BHdzxwaXDYNi3zryGEHaCcO6h3H6OAx7sQyHV76yO7eWHXFBc+t30YSuubpwJQwLHhg==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", - "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", - "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-react": { + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.16.tgz", + "integrity": "sha512-Da6Ra0sbA/1Iavli8LdMbTjyrsOPaxMm4lrKl8VJN4sJI5F64qy2EpLj3+5INLvNPfW4ddwpStbfP3Rf3jIgcw==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" - } - }, + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "babel-plugin-preval": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz", + "integrity": "sha512-s8hmTlRSmzcL7cHSIi0s6WxmpOAxfIlWqSVQwBIt7V5bNBaac+8JMZ6kJXLOazMJ8gCIcb5AJgQUgPHvbSYUzw==", + "requires": { + "babel-plugin-macros": "^2.2.2", + "require-from-string": "^2.0.2" + } + }, + "babel-plugin-remove-export-keywords": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-export-keywords/-/babel-plugin-remove-export-keywords-1.6.16.tgz", + "integrity": "sha512-JrB9ZASlMAfkRF+5NdgoQxgenhJxzXFEO1vrqsSDJdzLrC38L2wrvXF9mm1YLbrehkZxcrNz9UYDyARP4jaY9g==" + }, + "babel-plugin-remove-graphql-queries": { + "version": "2.9.17", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.17.tgz", + "integrity": "sha512-ThFGZlxD+U4H+aSX4DRpz7pdJq6Y7wob0rDDx7Q2rZPp9lbNfnGACUjPyTiCIy8EsBMpPYvT4WZjb4Gd0Xq6zQ==" + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-gatsby": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.5.6.tgz", + "integrity": "sha512-RdOLErYh3mUxCm+Udsbn5v0a6vha3THGlodDZ2+kQSJqdMa3FQi7yejlJXk2VcnyqOwtKyss32BdYy4LM/JsBw==", + "requires": { + "@babel/plugin-proposal-class-properties": "^7.10.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.10.3", + "@babel/plugin-transform-spread": "^7.10.1", + "@babel/preset-env": "^7.10.3", + "@babel/preset-react": "^7.10.1", + "@babel/runtime": "^7.10.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24", + "gatsby-core-utils": "^1.3.16", + "gatsby-legacy-polyfills": "^0.0.2" + }, + "dependencies": { "@babel/runtime": { "version": "7.11.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", @@ -5702,108 +5945,10 @@ "regenerator-runtime": "^0.13.4" } }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "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=" - } - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" } } }, @@ -5816,6 +5961,11 @@ "regenerator-runtime": "^0.11.0" }, "dependencies": { + "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==" + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -7568,9 +7718,9 @@ } }, "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==" + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, "core-js-compat": { "version": "3.6.4", @@ -7802,9 +7952,9 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, "css-selector-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.3.0.tgz", - "integrity": "sha1-XxrUPi2O77/cME/NOaUhZklD4+s=" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", + "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" }, "css-selector-tokenizer": { "version": "0.7.3", @@ -7980,9 +8130,9 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "d3": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.1.tgz", - "integrity": "sha512-Xu9gT6Lm0jH3wWJJSRomFwqnGGi3YAfWIfxNFl4++YVgYOjo3F8V2idAG3nJBgpZOkD0/RHPZX6F4k6tzgOvYw==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", "requires": { "d3-array": "1", "d3-axis": "1", @@ -8028,9 +8178,9 @@ "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" }, "d3-brush": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", - "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", "requires": { "d3-dispatch": "1", "d3-drag": "1", @@ -8054,9 +8204,9 @@ "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "d3-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", - "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" }, "d3-contour": { "version": "1.3.2", @@ -8091,14 +8241,14 @@ } }, "d3-ease": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", - "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" }, "d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", "requires": { "d3-dsv": "1" } @@ -8115,14 +8265,14 @@ } }, "d3-format": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", - "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" }, "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==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", "requires": { "d3-array": "1" } @@ -8183,9 +8333,9 @@ } }, "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==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" }, "d3-shape": { "version": "1.3.7", @@ -8201,9 +8351,9 @@ "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", "requires": { "d3-time": "1" } @@ -8454,11 +8604,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" - }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -8530,9 +8675,9 @@ } }, "devcert": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.1.2.tgz", - "integrity": "sha512-B72N5Z2Lzu11dsPvg/KD9IwQCyNg6JgsNcHw7zJ+QQN9/rusMpc0tSSOYLczmty5D7vOs94IHITPQ0uei5D3cw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.1.3.tgz", + "integrity": "sha512-7/nIzKdQ8y2K0imjIP7dyg2GJ2h38Ps6VOMXWZHIarNDV3p6mTXyEugKFnkmsZ2DD58JEG34ILyVb3qdOMmP9w==", "requires": { "@types/configstore": "^2.1.1", "@types/debug": "^0.0.30", @@ -8545,7 +8690,6 @@ "@types/tmp": "^0.0.33", "application-config-path": "^0.1.0", "command-exists": "^1.2.4", - "configstore": "^3.0.0", "debug": "^3.1.0", "eol": "^0.9.1", "get-port": "^3.2.0", @@ -8574,50 +8718,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz", "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw==" }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -8633,29 +8733,6 @@ "requires": { "os-tmpdir": "~1.0.2" } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" } } }, @@ -8790,9 +8867,9 @@ "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "duplexer3": { "version": "0.1.4", @@ -8830,9 +8907,9 @@ "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==" }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -8976,10 +9053,18 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" }, + "entity-decode": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/entity-decode/-/entity-decode-2.0.2.tgz", + "integrity": "sha512-5CCY/3ci4MC1m2jlumNjWd7VBFt4VfFnmSqSNmVcXq4gxM3Vmarxtt+SvmBnzwLS669MWdVuXboNVj1qN2esVg==", + "requires": { + "he": "^1.1.1" + } + }, "envinfo": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.2.tgz", - "integrity": "sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg==" + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==" }, "eol": { "version": "0.9.1", @@ -9043,6 +9128,14 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, "escalade": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", @@ -9063,11 +9156,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escaper": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/escaper/-/escaper-2.5.3.tgz", - "integrity": "sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ==" - }, "eslint": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", @@ -9411,9 +9499,9 @@ } }, "eslint-plugin-react": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.5.tgz", - "integrity": "sha512-ajbJfHuFnpVNJjhyrfq+pH1C0gLc2y94OiCbAXT5O0J0YCKaFEHDV8+3+mDOr+w8WguRX+vSs1bM2BDG0VLvCw==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz", + "integrity": "sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==", "requires": { "array-includes": "^3.1.1", "array.prototype.flatmap": "^1.2.3", @@ -9540,9 +9628,9 @@ } }, "event-source-polyfill": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.16.tgz", - "integrity": "sha512-8Uw+cbuKGC8NwA2EW5zV95qmyvrxQcFlVjaZcK1NpJD/M+4aSIGhLobsY8L5QXRQ7+oVX4jA0FcyTgdlv8C0TA==" + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.17.tgz", + "integrity": "sha512-eLZQQpKZahOH5sFaqfrbLNXJKz+JawiDQVrl6lZmQHHSamIn5PlNV3HXAY9+ZRaQC5YTIBRDd8jeTxjuEveJnQ==" }, "eventemitter3": { "version": "3.1.2", @@ -9926,9 +10014,9 @@ } }, "extract-files": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-7.0.0.tgz", - "integrity": "sha512-3AUlT7TD+DbQXNe3t70QrgJU6Wgcp7rk1Zm0vqWz8OYnw4vxihgG0TgZ2SIGrVqScc4WfOu7B4a0BezGJ0YqvQ==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", + "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==" }, "extract-zip": { "version": "1.7.0", @@ -9949,19 +10037,6 @@ "ms": "2.0.0" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -10218,13 +10293,66 @@ } }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "requires": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "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==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.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==", + "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==" + }, + "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==", + "requires": { + "find-up": "^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==" + } } }, "find-root": { @@ -10472,16 +10600,16 @@ } }, "gatsby": { - "version": "2.23.20", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.23.20.tgz", - "integrity": "sha512-ur5VkBVz3kXkS2lkfufTOuSvOaXdb6qs1WmyafMahwLVm3VlHvZQwhk5AV4yXZ8+zqGphHJcKtRBeCwIe6efsw==", + "version": "2.24.50", + "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.24.50.tgz", + "integrity": "sha512-7hCrRgEWdxfxy2/g6e8Yd0+KVkvoJ+XeJNX80gakJ16X3YIhBY3W2c+l+ZgpdQvQvuLkc1c3BugqV13eKw7Mgw==", "requires": { "@babel/code-frame": "^7.10.3", "@babel/core": "^7.10.3", "@babel/parser": "^7.10.3", - "@babel/polyfill": "^7.8.7", "@babel/runtime": "^7.10.3", "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3", "@hapi/joi": "^15.1.1", "@mikaelkristiansson/domready": "^1.0.10", "@pieh/friendly-errors-webpack-plugin": "1.7.0-chalk-2", @@ -10498,8 +10626,8 @@ "babel-loader": "^8.1.0", "babel-plugin-add-module-exports": "^0.3.3", "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-remove-graphql-queries": "^2.9.12", - "babel-preset-gatsby": "^0.5.1", + "babel-plugin-remove-graphql-queries": "^2.9.17", + "babel-preset-gatsby": "^0.5.6", "better-opn": "1.0.0", "better-queue": "^3.8.10", "bluebird": "^3.7.2", @@ -10512,14 +10640,14 @@ "compression": "^1.7.4", "convert-hrtime": "^3.0.0", "copyfiles": "^2.3.0", - "core-js": "^2.6.11", + "core-js": "^3.6.5", "cors": "^2.8.5", "css-loader": "^1.0.1", "date-fns": "^2.14.0", "debug": "^3.2.6", "del": "^5.1.0", "detect-port": "^1.3.0", - "devcert": "^1.1.0", + "devcert": "^1.1.3", "dotenv": "^8.2.0", "eslint": "^6.8.0", "eslint-config-react-app": "^5.2.1", @@ -10535,16 +10663,18 @@ "express-graphql": "^0.9.0", "fast-levenshtein": "^2.0.6", "file-loader": "^1.1.11", + "find-cache-dir": "^3.3.1", "fs-exists-cached": "1.0.0", "fs-extra": "^8.1.0", - "gatsby-cli": "^2.12.58", - "gatsby-core-utils": "^1.3.11", - "gatsby-graphiql-explorer": "^0.4.10", - "gatsby-link": "^2.4.11", - "gatsby-plugin-page-creator": "^2.3.15", - "gatsby-plugin-typescript": "^2.4.13", - "gatsby-react-router-scroll": "^3.0.10", - "gatsby-telemetry": "^1.3.18", + "gatsby-cli": "^2.12.88", + "gatsby-core-utils": "^1.3.16", + "gatsby-graphiql-explorer": "^0.4.12", + "gatsby-legacy-polyfills": "^0.0.2", + "gatsby-link": "^2.4.13", + "gatsby-plugin-page-creator": "^2.3.23", + "gatsby-plugin-typescript": "^2.4.18", + "gatsby-react-router-scroll": "^3.0.12", + "gatsby-telemetry": "^1.3.28", "glob": "^7.1.6", "got": "8.3.2", "graphql": "^14.6.0", @@ -10570,7 +10700,7 @@ "mkdirp": "^0.5.1", "moment": "^2.27.0", "name-all-modules-plugin": "^1.0.1", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "null-loader": "^3.0.0", "opentracing": "^0.14.4", "optimize-css-assets-webpack-plugin": "^5.0.3", @@ -10590,7 +10720,7 @@ "react-refresh": "^0.7.0", "redux": "^4.0.5", "redux-thunk": "^2.3.0", - "semver": "^5.7.1", + "semver": "^7.3.2", "shallow-compare": "^1.2.2", "signal-exit": "^3.0.3", "slugify": "^1.4.4", @@ -10611,63 +10741,26 @@ "webpack": "~4.43.0", "webpack-dev-middleware": "^3.7.2", "webpack-dev-server": "^3.11.0", - "webpack-hot-middleware": "^2.25.0", - "webpack-merge": "^4.2.2", - "webpack-stats-plugin": "^0.3.1", - "xstate": "^4.11.0", - "yaml-loader": "^0.6.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } + "webpack-hot-middleware": "^2.25.0", + "webpack-merge": "^4.2.2", + "webpack-stats-plugin": "^0.3.1", + "webpack-virtual-modules": "^0.2.2", + "xstate": "^4.11.0", + "yaml-loader": "^0.6.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "requires": { "@babel/types": "^7.11.0", "jsesc": "^2.5.1", @@ -10692,71 +10785,6 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, "@babel/helper-split-export-declaration": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", @@ -10765,21 +10793,6 @@ "@babel/types": "^7.11.0" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -10791,9 +10804,9 @@ } }, "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" }, "@babel/runtime": { "version": "7.11.2", @@ -10836,11 +10849,6 @@ "requires": { "ms": "^2.1.1" } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" } } }, @@ -10852,13 +10860,6 @@ "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } } }, "ansi-regex": { @@ -10866,18 +10867,10 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, "gatsby-cli": { - "version": "2.12.80", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.80.tgz", - "integrity": "sha512-B8KUYMnepRSGexV4XjWhVAUUXy6TsmvUElQ0E3OgyI9RxpoKsCprJzhG96A+Df7Rgx+cPkV1fGArbOjfxnF4lQ==", + "version": "2.12.88", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.88.tgz", + "integrity": "sha512-LBV6j9FFwGMCmbjvutTInwJV+fSrIhqHTYw6TZjVcXzUuk5jj/llj4CDUep5iPLjCZJvvzwtG2kDpkFPOPfsoA==", "requires": { "@babel/code-frame": "^7.10.3", "@hapi/joi": "^15.1.1", @@ -10892,9 +10885,9 @@ "execa": "^3.4.0", "fs-exists-cached": "^1.0.0", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.15", - "gatsby-recipes": "^0.2.10", - "gatsby-telemetry": "^1.3.26", + "gatsby-core-utils": "^1.3.16", + "gatsby-recipes": "^0.2.17", + "gatsby-telemetry": "^1.3.28", "hosted-git-info": "^3.0.4", "ink": "^2.7.1", "ink-spinner": "^3.1.0", @@ -10909,7 +10902,7 @@ "react": "^16.8.0", "redux": "^4.0.5", "resolve-cwd": "^3.0.0", - "semver": "^6.3.0", + "semver": "^7.3.2", "signal-exit": "^3.0.3", "source-map": "0.7.3", "stack-trace": "^0.0.10", @@ -10920,11 +10913,6 @@ "yurnalist": "^1.1.2" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -10940,14 +10928,6 @@ "lru-cache": "^6.0.0" } }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10961,11 +10941,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", @@ -10976,10 +10951,10 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, - "slugify": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.5.tgz", - "integrity": "sha512-WpECLAgYaxHoEAJ8Q1Lo8HOs1ngn7LN7QjXgOLbmmfkcWvosyk4ZTXkTzKyhngK640USTZUlgoQJfED1kz5fnQ==" + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "strip-ansi": { "version": "5.2.0", @@ -10996,16 +10971,143 @@ } } }, + "gatsby-cli": { + "version": "2.12.88", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.88.tgz", + "integrity": "sha512-LBV6j9FFwGMCmbjvutTInwJV+fSrIhqHTYw6TZjVcXzUuk5jj/llj4CDUep5iPLjCZJvvzwtG2kDpkFPOPfsoA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.3", + "@hapi/joi": "^15.1.1", + "@types/common-tags": "^1.8.0", + "better-opn": "^1.0.0", + "chalk": "^2.4.2", + "clipboardy": "^2.3.0", + "common-tags": "^1.8.0", + "configstore": "^5.0.1", + "convert-hrtime": "^3.0.0", + "envinfo": "^7.5.1", + "execa": "^3.4.0", + "fs-exists-cached": "^1.0.0", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.3.16", + "gatsby-recipes": "^0.2.17", + "gatsby-telemetry": "^1.3.28", + "hosted-git-info": "^3.0.4", + "ink": "^2.7.1", + "ink-spinner": "^3.1.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.15", + "meant": "^1.0.1", + "node-fetch": "^2.6.0", + "opentracing": "^0.14.4", + "pretty-error": "^2.1.1", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "react": "^16.8.0", + "redux": "^4.0.5", + "resolve-cwd": "^3.0.0", + "semver": "^7.3.2", + "signal-exit": "^3.0.3", + "source-map": "0.7.3", + "stack-trace": "^0.0.10", + "strip-ansi": "^5.2.0", + "update-notifier": "^4.1.0", + "uuid": "3.4.0", + "yargs": "^15.3.1", + "yurnalist": "^1.1.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "gatsby-core-utils": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.15.tgz", - "integrity": "sha512-np1tJCGejhCHtgHdFl6+y5EwVAzdrieJZ3hdvpeOrJ22bL9ktl5XVLy4K937ThgxHLp8+ElMDVdziNun5tC8eg==", + "version": "1.3.16", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", + "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", "fs-extra": "^8.1.0", "node-object-hash": "^2.0.0", "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", "xdg-basedir": "^4.0.0" } }, @@ -11111,15 +11213,15 @@ } }, "gatsby-page-utils": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.2.20.tgz", - "integrity": "sha512-waq2TpDjNxH5+Q+xFnuf9of3Xt0wxBkJwb6VbCGz4LS0XQ6c9KYMgC2OCBwPJOnv2Vo/6BglpRyn4lYcJEQJdw==", + "version": "0.2.21", + "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.2.21.tgz", + "integrity": "sha512-3i1OAuFdZNXbHUpcve1y1Gq2WO5TS7QJvxnT1ZALJ05adCmXwslKX6UxMziZGRue1pw4Bo9gaaQRqkay7mOOow==", "requires": { "@babel/runtime": "^7.10.3", "bluebird": "^3.7.2", "chokidar": "3.4.0", "fs-exists-cached": "^1.0.0", - "gatsby-core-utils": "^1.3.15", + "gatsby-core-utils": "^1.3.16", "glob": "^7.1.6", "lodash": "^4.17.15", "micromatch": "^3.1.10" @@ -11141,26 +11243,50 @@ } }, "gatsby-plugin-emotion": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-emotion/-/gatsby-plugin-emotion-4.2.1.tgz", - "integrity": "sha512-ygXxkpnWJdDOAgb1XA9TbVCRLkaAYTFLTsqVQXMBhnrknb5iPNO+MP0fZ5LRqWgBALyJ629nxs0efUpnT/RSWw==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/gatsby-plugin-emotion/-/gatsby-plugin-emotion-4.3.10.tgz", + "integrity": "sha512-OQrNgq3Te+bjra/sNo2PwOm24dPVr8MsjWf3X/3ciPf4bkf+Ey0jzJ36JnIIUIzZvpbyBHAr6eNzSOWnE2X2zA==", "requires": { - "@babel/runtime": "^7.8.7", + "@babel/runtime": "^7.10.3", "@emotion/babel-preset-css-prop": "^10.0.27" }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "gatsby-plugin-google-analytics": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/gatsby-plugin-google-analytics/-/gatsby-plugin-google-analytics-2.3.13.tgz", + "integrity": "sha512-K/6c9iByR8uDpFZuJrappjyMsVtWFwPyAkRlXFHhq2mmNtgZeRVKFf5XoGiOHCeMPEpBGE58LLana/F01LLteQ==", + "requires": { + "@babel/runtime": "^7.10.3", + "minimatch": "3.0.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -11170,62 +11296,63 @@ "integrity": "sha512-Oul6O67klajrEjkkF1diD228SmyUWsAwTq/1tYq41vBwmyNiPk4dhk8K93rrNQ5d5zesSv+awBeGBa503tQqGw==" }, "gatsby-plugin-less": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-less/-/gatsby-plugin-less-3.1.1.tgz", - "integrity": "sha512-H0LQXy2DpwD1UW3bEuE8RHk2yNfOcZGFjzYH9URPUAzxuOo6bhPyNxKJ8tLcvarqwYiJIWFFivDMv0IqgBJ16Q==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/gatsby-plugin-less/-/gatsby-plugin-less-3.2.9.tgz", + "integrity": "sha512-JcUpHv53WdgSCKxaatqGTc/zRqJ6hc39W62ClLPLHLTtm7fa1x8RCrzuBu1kFLJl6uRkZfbAg4DSKuc50KMNNQ==", "requires": { - "@babel/runtime": "^7.8.7", + "@babel/runtime": "^7.10.3", "less-loader": "^5.0.0" }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "gatsby-plugin-mdx": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.1.4.tgz", - "integrity": "sha512-id2/LALN7eseTGN05v1n16XCYggrl2UTzWOJOQME9rh25jNK+KT5ywaPY6vNYimeAW7wWdad3rl6hORpv4L6yw==", + "version": "1.2.35", + "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.2.35.tgz", + "integrity": "sha512-XSlKr56PQznSYbgmKkGMaA3qwoI2b+2LTXZisC6hKiOGD5QXngdRV1FbDrDNLVlInPW3ZgT9EwqfWkaNzbtMmA==", "requires": { - "@babel/core": "^7.8.7", - "@babel/generator": "^7.8.8", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/preset-env": "^7.8.7", - "@babel/preset-react": "^7.8.3", - "@babel/types": "^7.8.7", + "@babel/core": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", + "@babel/plugin-proposal-object-rest-spread": "^7.10.3", + "@babel/preset-env": "^7.10.3", + "@babel/preset-react": "^7.10.1", + "@babel/types": "^7.10.3", "camelcase-css": "^2.0.1", "change-case": "^3.1.0", - "core-js": "2", + "core-js": "^3.6.5", "dataloader": "^1.4.0", "debug": "^4.1.1", "escape-string-regexp": "^1.0.5", "eval": "^0.1.4", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.1.1", + "gatsby-core-utils": "^1.3.16", "gray-matter": "^4.0.2", - "json5": "^2.1.2", + "json5": "^2.1.3", "loader-utils": "^1.4.0", "lodash": "^4.17.15", "mdast-util-to-string": "^1.1.0", "mdast-util-toc": "^3.1.0", - "mime": "^2.4.4", + "mime": "^2.4.6", "p-queue": "^5.0.0", "pretty-bytes": "^5.3.0", "remark": "^10.0.1", "remark-retext": "^3.1.3", "retext-english": "^3.0.4", + "slugify": "^1.4.4", "static-site-generator-webpack-plugin": "^3.4.2", "style-to-object": "^0.3.0", "underscore.string": "^3.3.5", @@ -11235,91 +11362,36 @@ "unist-util-visit": "^1.4.1" }, "dependencies": { - "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.11.0", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" } }, - "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" - } - }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -11334,21 +11406,17 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "gatsby-core-utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz", - "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==", + "version": "1.3.16", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", + "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", - "node-object-hash": "^2.0.0" - } - }, - "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", - "requires": { - "minimist": "^1.2.5" + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" } }, "loader-utils": { @@ -11371,10 +11439,23 @@ } } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-remove": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", + "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", + "requires": { + "unist-util-is": "^3.0.0" + } }, "unist-util-visit": { "version": "1.4.1", @@ -11383,336 +11464,89 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } - } - } - }, - "gatsby-plugin-page-creator": { - "version": "2.3.20", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.20.tgz", - "integrity": "sha512-EtoKgXNXvkY5IA4XvBPhlM5TelR6R04e3fpcGWuYO4oqts/9Ih0GGI9CzUBRXNwM5MplNBUcUutyAwMtT9NzVA==", - "requires": { - "@babel/runtime": "^7.10.3", - "bluebird": "^3.7.2", - "fs-exists-cached": "^1.0.0", - "gatsby-page-utils": "^0.2.20", - "glob": "^7.1.6", - "lodash": "^4.17.15", - "micromatch": "^3.1.10" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-plugin-printer": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz", - "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==", - "requires": { - "@sindresorhus/slugify": "^0.9.1", - "babel-plugin-preval": "^3.0.1", - "fs-extra": "^8.1.0", - "puppeteer": "^1.19.0", - "rollup": "1.23.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-commonjs": "^10.0.1", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0" - } - }, - "gatsby-plugin-react-helmet": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.2.1.tgz", - "integrity": "sha512-5oarZdVvp3k3keG26eVFagVHLYw7wCGs/MXRYQg8MEyJewU3X4Uc0eo7qu4TM5EIuZ2ekaL14r86RB6RM5TORA==", - "requires": { - "@babel/runtime": "^7.8.7" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "requires": { - "regenerator-runtime": "^0.13.4" + "unist-util-is": "^3.0.0" } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" } } }, - "gatsby-plugin-segment-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-segment-js/-/gatsby-plugin-segment-js-3.1.0.tgz", - "integrity": "sha512-oBcIY+riNehfyQXp8PEGVQTz/VPt/+k2aXCh/bNZSR4HhjEAXafcSCReS2xzs/3IJRa3gH0+NOZvRU8peXDb/w==" - }, - "gatsby-plugin-svgr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", - "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg==" - }, - "gatsby-plugin-typescript": { - "version": "2.4.17", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.17.tgz", - "integrity": "sha512-Bp0e2Nc3CYYfhYvvIO7DIZOzy6hlYDJFBE/rHPK9mu5RLX8THqNmT53579SJWx4ozSPCNK41EfPbAJdtEgEPaA==", + "gatsby-plugin-page-creator": { + "version": "2.3.23", + "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.23.tgz", + "integrity": "sha512-cpluob5yQdrY1W2THnVtiaWUHBDNTqDU0fhfwSf9CIZHIJkHamqk8Q+YzDGFFs+2/3U4+PKhcvWh0hl/g9c3ug==", "requires": { - "@babel/core": "^7.10.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.3", - "@babel/preset-typescript": "^7.10.1", - "@babel/runtime": "^7.10.3", - "babel-plugin-remove-graphql-queries": "^2.9.16" + "@babel/traverse": "^7.10.2", + "fs-exists-cached": "^1.0.0", + "gatsby-page-utils": "^0.2.21", + "globby": "^11.0.1", + "graphql": "^14.6.0", + "lodash": "^4.17.15", + "slugify": "^1.4.4" }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { + "dependencies": { + "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/highlight": "^7.10.4" } }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "@babel/generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "@babel/plugin-syntax-numeric-separator": { + "@babel/helper-function-name": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "@babel/plugin-syntax-typescript": { + "@babel/helper-get-function-arity": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/types": "^7.10.4" } }, - "@babel/plugin-transform-typescript": { + "@babel/helper-split-export-declaration": { "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", - "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.10.4" + "@babel/types": "^7.11.0" } }, - "@babel/preset-typescript": { + "@babel/highlight": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz", - "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.10.4" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" }, "@babel/template": { "version": "7.10.4", @@ -11758,23 +11592,88 @@ "ms": "^2.1.1" } }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "requires": { - "minimist": "^1.2.5" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + } + } + }, + "gatsby-plugin-printer": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz", + "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==", + "requires": { + "@sindresorhus/slugify": "^0.9.1", + "babel-plugin-preval": "^3.0.1", + "fs-extra": "^8.1.0", + "puppeteer": "^1.19.0", + "rollup": "1.23.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-commonjs": "^10.0.1", + "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-globals": "^1.4.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-replace": "^2.2.0" + } + }, + "gatsby-plugin-react-helmet": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.3.10.tgz", + "integrity": "sha512-AcXYwmS3r298JWs6iQ3OLNxIe8L8i5a2iSdLr/SDMpHqumYm7q/vB9kCX0et5wM7DIuZ7aPXDrdi5yDCAvU5lg==", + "requires": { + "@babel/runtime": "^7.10.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" } }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "gatsby-plugin-svgr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", + "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg==" + }, + "gatsby-plugin-typescript": { + "version": "2.4.18", + "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.18.tgz", + "integrity": "sha512-irFd9xu+LjEmL7olcuUziVSb2yRf0nVWFwgaDb+l5rfU6HeKr3zyHuxLqBMwvXWTxu6gVs8sAJVXCcxxM4DbeA==", + "requires": { + "@babel/core": "^7.10.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-numeric-separator": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.3", + "@babel/preset-typescript": "^7.10.1", + "@babel/runtime": "^7.10.3", + "babel-plugin-remove-graphql-queries": "^2.9.17" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } }, "regenerator-runtime": { "version": "0.13.7", @@ -11807,9 +11706,9 @@ } }, "gatsby-recipes": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.10.tgz", - "integrity": "sha512-4iL9ZaZxIk1qTHCq+bFhT7edFJVuyWLInQKwQLsxxHIzM5DcizB21Lw62lzAOcACLiXzmJTofgVQOw+17c6Yhw==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.17.tgz", + "integrity": "sha512-BwscTYe1d1wxVUrBt9DZSrDTAhZjjvCj5ncEdfxHXz5BgiJcz6KUb4AVBboI/frOtSGbcSNWBGRJbEWcBQMCvA==", "requires": { "@babel/core": "^7.9.6", "@babel/generator": "^7.9.6", @@ -11846,9 +11745,9 @@ "flatted": "^3.0.0", "formik": "^2.0.8", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.15", + "gatsby-core-utils": "^1.3.16", "gatsby-interface": "^0.0.166", - "gatsby-telemetry": "^1.3.26", + "gatsby-telemetry": "^1.3.28", "glob": "^7.1.6", "graphql": "^14.6.0", "graphql-compose": "^6.3.8", @@ -11856,218 +11755,62 @@ "graphql-type-json": "^0.3.2", "hicat": "^0.7.0", "html-tag-names": "^1.1.5", + "ink-box": "^1.0.0", "is-binary-path": "^2.1.0", "is-url": "^1.2.4", "isomorphic-fetch": "^2.1.0", "jest-diff": "^25.5.0", + "lock": "^1.0.0", "lodash": "^4.17.15", "mitt": "^1.2.0", "mkdirp": "^0.5.1", "node-fetch": "^2.5.0", "normalize.css": "^8.0.1", - "pkg-dir": "^4.2.0", - "prettier": "^2.0.5", - "prop-types": "^15.6.1", - "property-information": "5.5.0", - "react-circular-progressbar": "^2.0.0", - "react-icons": "^3.0.1", - "react-reconciler": "^0.25.1", - "remark-mdx": "^2.0.0-next.4", - "remark-mdxjs": "^2.0.0-next.4", - "remark-parse": "^6.0.3", - "remark-stringify": "^8.1.0", - "resolve-cwd": "^3.0.0", - "semver": "^7.3.2", - "single-trailing-newline": "^1.0.0", - "strip-ansi": "^6.0.0", - "style-to-object": "^0.3.0", - "subscriptions-transport-ws": "^0.9.16", - "svg-tag-names": "^2.0.1", - "unified": "^8.4.2", - "unist-util-remove": "^2.0.0", - "unist-util-visit": "^2.0.2", - "urql": "^1.9.7", - "uuid": "^8.2.0", - "ws": "^7.3.0", - "xstate": "^4.9.1", - "yoga-layout-prebuilt": "^1.9.6", - "yup": "^0.27.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { + "pkg-dir": "^4.2.0", + "prettier": "^2.0.5", + "prop-types": "^15.6.1", + "property-information": "5.5.0", + "react-circular-progressbar": "^2.0.0", + "react-icons": "^3.0.1", + "react-reconciler": "^0.25.1", + "remark-mdx": "^2.0.0-next.4", + "remark-mdxjs": "^2.0.0-next.4", + "remark-parse": "^6.0.3", + "remark-stringify": "^8.1.0", + "resolve-cwd": "^3.0.0", + "semver": "^7.3.2", + "single-trailing-newline": "^1.0.0", + "strip-ansi": "^6.0.0", + "style-to-object": "^0.3.0", + "subscriptions-transport-ws": "^0.9.16", + "svg-tag-names": "^2.0.1", + "unified": "^8.4.2", + "unist-util-remove": "^2.0.0", + "unist-util-visit": "^2.0.2", + "urql": "^1.9.7", + "uuid": "^8.2.0", + "ws": "^7.3.0", + "xstate": "^4.9.1", + "yoga-layout-prebuilt": "^1.9.6", + "yup": "^0.27.0" + }, + "dependencies": { + "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/types": "^7.11.0" + "@babel/highlight": "^7.10.4" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "@babel/generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, "@babel/highlight": { @@ -12081,42 +11824,9 @@ } }, "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", - "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" }, "@babel/template": { "version": "7.10.4", @@ -12128,29 +11838,6 @@ "@babel/types": "^7.10.4" } }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, "@babel/types": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", @@ -12159,13 +11846,6 @@ "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } } }, "@mdx-js/mdx": { @@ -12196,34 +11876,6 @@ "unist-util-visit": "2.0.3" }, "dependencies": { - "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, "remark-parse": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", @@ -12247,11 +11899,6 @@ "xtend": "^4.0.1" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, "unified": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", @@ -12389,62 +12036,6 @@ "pump": "^3.0.0" } }, - "hast-to-hyperscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz", - "integrity": "sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg==", - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz", - "integrity": "sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q==", - "requires": { - "@types/parse5": "^5.0.0", - "ccount": "^1.0.0", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-raw": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.0.tgz", - "integrity": "sha512-IQo6tv3bMMKxk53DljswliucCJOQxaZFCuKEJ7X80249dmJ1nA9LtOnnylsLlqTG98NjQ+iGcoLAYo9q5FRhRg==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -12468,14 +12059,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12492,14 +12075,6 @@ "repeat-string": "^1.0.0" } }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { - "unist-util-remove": "^2.0.0" - } - }, "mdast-util-compact": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", @@ -12508,37 +12083,6 @@ "unist-util-visit": "^2.0.0" } }, - "mdast-util-definitions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz", - "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-hast": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.0.tgz", - "integrity": "sha512-Akl2Vi9y9cSdr19/Dfu58PVwifPXuFt1IrHe7l+Crme1KvgUT+5z+cHLVcQVGCiNTZZcdqjnuv9vPkGsqWytWA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.3", - "collapse-white-space": "^1.0.0", - "detab": "^2.0.0", - "mdast-util-definitions": "^3.0.0", - "mdurl": "^1.0.0", - "trim-lines": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", @@ -12560,24 +12104,6 @@ "p-limit": "^2.2.0" } }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12597,9 +12123,9 @@ } }, "prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz", + "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==" }, "property-information": { "version": "5.5.0", @@ -12692,14 +12218,6 @@ } } }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" - } - }, "remark-stringify": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", @@ -12759,46 +12277,11 @@ "ansi-regex": "^5.0.0" } }, - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" - }, - "unist-util-remove": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.0.tgz", - "integrity": "sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g==", - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", - "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, "uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" }, - "vfile-location": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz", - "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==" - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12810,11 +12293,11 @@ } }, "gatsby-remark-autolink-headers": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-2.2.1.tgz", - "integrity": "sha512-FqTq9rh9fRxdlX1V3InXSAoZQyBcZ3mI5zNiNagO+DRNZCSve3YVKTDmMZ7a7GXx5Bz7QTPBB993wk2OcRSIFg==", + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-2.3.11.tgz", + "integrity": "sha512-jYGgZ+NTbVxJmyS6z1oojWxOR12R7MGl4jM5aOXSmPuTSo8gbpm3aW7l5XMyud5fDDdP3xfbYuTX4RvBUWrx7g==", "requires": { - "@babel/runtime": "^7.8.7", + "@babel/runtime": "^7.10.3", "github-slugger": "^1.3.0", "lodash": "^4.17.15", "mdast-util-to-string": "^1.1.0", @@ -12822,17 +12305,22 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "unist-util-visit": { "version": "1.4.1", @@ -12841,6 +12329,14 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } } } }, @@ -12852,6 +12348,11 @@ "unist-util-visit": "^1.4.1" }, "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, "unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", @@ -12859,6 +12360,14 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } } } }, @@ -12901,11 +12410,11 @@ } }, "gatsby-remark-copy-linked-files": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-2.2.1.tgz", - "integrity": "sha512-xTy52n0K+fF4aXCNYkpH1HdhYy47GwLG2tE5H+xIisyEQiCr5XA555yQdS0U4MRtDZEyfX4TB+XTwaNhOgTPgw==", + "version": "2.3.12", + "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-2.3.12.tgz", + "integrity": "sha512-heDSTfvzrfWWr3Itxk7TFdaObXv6i0wjmdgPKXchMPV2nUHTGGuoe3aLRLHrFXD/XsWpG/YI4Z57W0meyHMzFQ==", "requires": { - "@babel/runtime": "^7.8.7", + "@babel/runtime": "^7.10.3", "cheerio": "^1.0.0-rc.3", "fs-extra": "^8.1.0", "is-relative-url": "^3.0.0", @@ -12916,9 +12425,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -12959,16 +12468,29 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "requires": { - "unist-util-visit-parents": "^2.0.0" + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" } } } @@ -12983,6 +12505,11 @@ "unist-util-visit": "^1.4.0" }, "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, "unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", @@ -12990,31 +12517,44 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } } } }, "gatsby-remark-prismjs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/gatsby-remark-prismjs/-/gatsby-remark-prismjs-3.4.1.tgz", - "integrity": "sha512-DPg4PjalrElXXZ3KZRiWiJiHIsXaee51nN2hCoGC2hfaXW8VdSjXhpBSSps9OWuB+QNmdTp/EP3FDiiwImjpUw==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/gatsby-remark-prismjs/-/gatsby-remark-prismjs-3.5.11.tgz", + "integrity": "sha512-AMtHZb+i7GAlRM3UINAhx+SN1aVLsIUcbEbD8d3zdBxGQTeM1cJTIJz2UjUzdCqujW9tgewaw9mE+u4SFuQtKA==", "requires": { - "@babel/runtime": "^7.8.7", + "@babel/runtime": "^7.10.3", "parse-numeric-range": "^0.0.2", "unist-util-visit": "^1.4.1" }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "unist-util-visit": { "version": "1.4.1", @@ -13023,6 +12563,14 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } } } }, @@ -13035,102 +12583,47 @@ } }, "gatsby-source-filesystem": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.2.2.tgz", - "integrity": "sha512-uHHCiTp8/q9JF0Yr14Q5aJZ07jUJSV6HJSnrSVnEIF4PfRQkVJG5FHQULmxJUXWQhIoy17EGuzqVjxMsFY69QA==", + "version": "2.3.25", + "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.3.25.tgz", + "integrity": "sha512-ZrLi8on+wMQOvd4YLmpb/bcw6K0BA6IeZ949+I465iTf3FIivdh7+at06q52fv1hfsPDQ8PF1KrWp3qDftbORQ==", "requires": { - "@babel/runtime": "^7.8.7", + "@babel/runtime": "^7.10.3", "better-queue": "^3.8.10", "bluebird": "^3.7.2", - "chokidar": "3.3.1", + "chokidar": "3.4.0", "file-type": "^12.4.2", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.1.1", + "gatsby-core-utils": "^1.3.16", "got": "^9.6.0", "md5-file": "^3.2.3", - "mime": "^2.4.4", + "mime": "^2.4.6", "pretty-bytes": "^5.3.0", "progress": "^2.0.3", "read-chunk": "^3.2.0", "valid-url": "^1.0.9", - "xstate": "^4.8.0" + "xstate": "^4.11.0" }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, "gatsby-core-utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz", - "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==", + "version": "1.3.16", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", + "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", - "node-object-hash": "^2.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" } }, "got": { @@ -13151,56 +12644,22 @@ "url-parse-lax": "^3.0.0" } }, - "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==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "requires": { - "picomatch": "^2.0.7" - } + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "xstate": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.8.0.tgz", - "integrity": "sha512-xHSYQtCHLkcrFRxa5lK4Lp1rnKt00a80jcKFMQiMBuE+6MvTYv7twwqYpzjsJoKFjGZB3GGEpZAuY1dmlPTh/g==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "gatsby-source-git": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/gatsby-source-git/-/gatsby-source-git-1.0.2.tgz", - "integrity": "sha512-TNCC8PnRK3knrO5Q9qpOWVsYuRuLZ07LGB2kQw4/b4bmbciVFZSNUfuJpokpl3/6DPvcePQtNjARVpdKrRYhog==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gatsby-source-git/-/gatsby-source-git-1.1.0.tgz", + "integrity": "sha512-f5HllxwS+ivVn6SitSJPEQe8tf/apjwq5TOZRiEIRJtlrm9eSBqM2hO6ZIOK5na6UuvI+BH8xxbgj0qrwNTznA==", "requires": { "fast-glob": "^2.2.3", "fs-extra": "^5.0.0", @@ -13215,6 +12674,14 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -13245,23 +12712,48 @@ "requires": { "glob": "^7.1.3" } + }, + "simple-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "requires": { + "debug": "^4.0.1" + } } } }, "gatsby-source-graphql": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.1.33.tgz", - "integrity": "sha512-xQ8EeTFWjKDQ+7c4R9cUNFzhp1e0DyiFels4XG6IDdwwlJd38pkk2cWe9SBpPP8AUfNnt6ry29koYVO0ztzslw==", - "requires": { - "@babel/runtime": "^7.7.6", - "apollo-link": "1.2.13", - "apollo-link-http": "^1.5.16", - "graphql-tools-fork": "^8.0.1", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.7.1.tgz", + "integrity": "sha512-fTmAWeBLG/ZshmlPRC5Pc4KyihfamfnugqHT4IRKcjnBT9GYH/+W7XWD520EHu+4vYLCubs0qRdYqgh4K5/pkA==", + "requires": { + "@babel/runtime": "^7.10.3", + "@graphql-tools/links": "^6.0.9", + "@graphql-tools/utils": "^6.0.9", + "@graphql-tools/wrap": "^6.0.9", + "apollo-link": "1.2.14", + "apollo-link-http": "^1.5.17", + "dataloader": "^2.0.0", + "graphql": "^14.6.0", "invariant": "^2.2.4", "node-fetch": "^1.7.3", - "uuid": "^3.3.3" + "uuid": "^3.4.0" }, "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "dataloader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -13270,13 +12762,18 @@ "encoding": "^0.1.11", "is-stream": "^1.0.1" } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "gatsby-telemetry": { - "version": "1.3.26", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.26.tgz", - "integrity": "sha512-10DqlSw0mvuRcQfoYmYdt+XAZqECqCUY8wYWo1Vpg3BwSpRtaW2rFjDqPa+MZSB5qfBfL92urDw8g1uZZolBNQ==", + "version": "1.3.28", + "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.28.tgz", + "integrity": "sha512-nG0lQdY4h+2tbtvHoPEm7UNOu6x/lITFqT1lkXsDl1vkvTMB9sgM2IIoyjBndRH41rjYtaYnPLBGRdYLtTXoZw==", "requires": { "@babel/code-frame": "^7.10.3", "@babel/runtime": "^7.10.3", @@ -13287,7 +12784,7 @@ "configstore": "^5.0.1", "envinfo": "^7.5.1", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.15", + "gatsby-core-utils": "^1.3.16", "git-up": "4.0.1", "is-docker": "2.0.0", "lodash": "^4.17.15", @@ -13303,11 +12800,6 @@ "@babel/highlight": "^7.10.4" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -13344,11 +12836,11 @@ } }, "gatsby-theme-apollo-core": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-core/-/gatsby-theme-apollo-core-3.0.11.tgz", - "integrity": "sha512-dWpSi35pbNASs6/6flvlAP2qmOhaLrhDv9CqDyEYajG1yvH7qMrKHP8XLKVObyZ2BU3Y6Zzw+OKdoZVtlo/5Ig==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-core/-/gatsby-theme-apollo-core-3.0.18.tgz", + "integrity": "sha512-/Av0iOdqPe2zRuTooABB/j1LjnS7WtNddNaXHsWEVcg4a9U0+ZiLwmTfWnW29/1VFJjKtuBw7GvDuXqmyHQCtg==", "requires": { - "@apollo/space-kit": "2.15.0", + "@apollo/space-kit": "^5.6.0", "@emotion/core": "^10.0.7", "@emotion/styled": "^10.0.7", "@svgr/webpack": "^4.2.0", @@ -13365,25 +12857,25 @@ } }, "gatsby-theme-apollo-docs": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.0.14.tgz", - "integrity": "sha512-hptn26w5o8MOA5iH6NZ00KrWdUzPRXUiCgJzh1J4+ggqCtypGixU5uXJIwR/ka9WRUJtQWz9uaJ47XlPnhTMUw==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.3.9.tgz", + "integrity": "sha512-KEfDSU6eth3fS74a4rB7NMI1/lOJL1I33OXrxmvV10ngCRs4BoQUn2xNG/ey80O6InDiT3sgKdgVeX4jmS+pnA==", "requires": { "@mdx-js/mdx": "^1.1.0", "@mdx-js/react": "^1.0.27", + "gatsby-plugin-google-analytics": "^2.2.5", "gatsby-plugin-mdx": "^1.0.23", "gatsby-plugin-printer": "1.0.x", - "gatsby-plugin-segment-js": "^3.0.1", - "gatsby-remark-autolink-headers": "^2.0.16", + "gatsby-remark-autolink-headers": "^2.3.11", "gatsby-remark-check-links": "^2.1.0", "gatsby-remark-code-titles": "^1.1.0", "gatsby-remark-copy-linked-files": "^2.0.12", "gatsby-remark-mermaid": "^1.2.0", "gatsby-remark-prismjs": "^3.2.8", - "gatsby-remark-rewrite-relative-links": "^1.0.7", + "gatsby-remark-rewrite-relative-links": "^1.0.8", "gatsby-source-filesystem": "^2.0.29", "gatsby-source-git": "^1.0.1", - "gatsby-theme-apollo-core": "^3.0.10", + "gatsby-theme-apollo-core": "^3.0.18", "gatsby-transformer-remark": "^2.6.30", "js-yaml": "^3.13.1", "prismjs": "^1.15.0", @@ -13393,18 +12885,19 @@ "remark": "^10.0.1", "remark-react": "^5.0.1", "remark-typescript": "^0.3.0", + "simple-git": "^2.7.0", "source-sans-pro": "^3.6.0", "striptags": "^3.1.1" } }, "gatsby-transformer-remark": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.7.1.tgz", - "integrity": "sha512-9geE8itjePDvaa0uWmyRgi2emPt9ut420YyjaNJ1/4eZw9Yj8zAuCdancw7j1buhL0UAxgQ2YseO6+MWTHEoMw==", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.8.29.tgz", + "integrity": "sha512-X3b+3v7AYN0fWs4540n+tYKHSImaXXuKSI9kNi2lnPu0FKh3Lqy78qckW6hTdDB01a48cYRDCvGXP8by71z95g==", "requires": { - "@babel/runtime": "^7.8.7", + "@babel/runtime": "^7.10.3", "bluebird": "^3.7.2", - "gatsby-core-utils": "^1.1.1", + "gatsby-core-utils": "^1.3.16", "gray-matter": "^4.0.2", "hast-util-raw": "^4.0.0", "hast-util-to-html": "^4.0.1", @@ -13417,7 +12910,7 @@ "remark-retext": "^3.1.3", "remark-stringify": "6.0.4", "retext-english": "^3.0.4", - "sanitize-html": "^1.22.1", + "sanitize-html": "^1.27.0", "underscore.string": "^3.3.5", "unified": "^6.2.0", "unist-util-remove-position": "^1.1.4", @@ -13426,21 +12919,25 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "requires": { "regenerator-runtime": "^0.13.4" } }, "gatsby-core-utils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz", - "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==", + "version": "1.3.16", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", + "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", - "node-object-hash": "^2.0.0" + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" } }, "hast-to-hyperscript": { @@ -13506,6 +13003,14 @@ "space-separated-tokens": "^1.0.0" } }, + "mdast-util-definitions": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", + "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", + "requires": { + "unist-util-visit": "^1.0.0" + } + }, "mdast-util-to-hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-3.0.4.tgz", @@ -13525,9 +13030,9 @@ } }, "mdast-util-toc": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.0.2.tgz", - "integrity": "sha512-IeihbQLXrnCs/427dVzCp3ffvSPpdx/Mc2WWYAdVaS+MFqdKZHlJylGWAA1cGPewhEVyITsWrlXJ/b2d80Wsnw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.0.3.tgz", + "integrity": "sha512-A3xzcgC1XFHK0+abFmbINOxjwo7Bi0Nsfp3yTgTy5JHo2q2V6YZ5BVJreDWoK3szcLlSMvHqe8WPbjY50wAkow==", "requires": { "@types/mdast": "^3.0.3", "@types/unist": "^2.0.3", @@ -13544,9 +13049,9 @@ "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" }, "unist-util-visit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz", - "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -13554,9 +13059,9 @@ } }, "unist-util-visit-parents": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz", - "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", + "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -13564,6 +13069,24 @@ } } }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, "property-information": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", @@ -13573,9 +13096,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "remark-parse": { "version": "6.0.3", @@ -13633,6 +13156,14 @@ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "requires": { + "unist-util-visit": "^1.1.0" + } + }, "unist-util-stringify-position": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", @@ -13646,6 +13177,21 @@ "unist-util-visit-parents": "^2.0.0" } }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + }, + "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + } + } + }, "vfile": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", @@ -13657,6 +13203,11 @@ "vfile-message": "^1.0.0" } }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + }, "vfile-message": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", @@ -13723,9 +13274,9 @@ } }, "git-url-parse": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", - "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.3.tgz", + "integrity": "sha512-GPsfwticcu52WQ+eHp0IYkAyaOASgYdtsQDIt4rUp6GbiNt1P9ddrh3O0kQB0eD4UJZszVqNT3+9Zwcg40fywA==", "requires": { "git-up": "^4.0.0" } @@ -14024,59 +13575,27 @@ "graphql-playground-html": "1.6.25" } }, - "graphql-request": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", - "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", - "requires": { - "cross-fetch": "2.2.2" - } - }, - "graphql-subscriptions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", - "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", - "requires": { - "iterall": "^1.2.1" - } - }, - "graphql-tools-fork": { - "version": "8.6.4", - "resolved": "https://registry.npmjs.org/graphql-tools-fork/-/graphql-tools-fork-8.6.4.tgz", - "integrity": "sha512-Ik6TdKhQXTy2fJ2zPM9NEEigGWuPAVQZ8eq67wOF3yAdNfhCZ+U64i90OUH5KathDRrnY3w4Gou74sSlk5zY7w==", - "requires": { - "apollo-link": "^1.2.13", - "apollo-link-http-common": "^0.2.15", - "deprecated-decorator": "^0.1.6", - "extract-files": "^7.0.0", - "form-data": "^3.0.0", - "iterall": "^1.3.0", - "node-fetch": "^2.6.0", - "uuid": "^7.0.1" - }, - "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" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, - "uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==" - } + "graphql-request": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", + "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", + "requires": { + "cross-fetch": "2.2.2" + } + }, + "graphql-subscriptions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", + "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", + "requires": { + "iterall": "^1.2.1" } }, + "graphql-tag": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz", + "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==" + }, "graphql-type-json": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", @@ -14117,12 +13636,25 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "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" + } + } } }, "has": { @@ -14260,44 +13792,36 @@ } }, "hast-to-hyperscript": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz", - "integrity": "sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz", + "integrity": "sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg==", "requires": { + "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", "property-information": "^5.3.0", "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.2.1", - "unist-util-is": "^3.0.0", - "web-namespaces": "^1.1.2" - }, - "dependencies": { - "style-to-object": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", - "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", - "requires": { - "inline-style-parser": "0.1.1" - } - } + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" } }, "hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz", + "integrity": "sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q==", "requires": { - "ccount": "^1.0.3", + "@types/parse5": "^5.0.0", + "ccount": "^1.0.0", "hastscript": "^5.0.0", "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0" } }, "hast-util-is-element": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.4.tgz", - "integrity": "sha512-NFR6ljJRvDcyPP5SbV7MyPBgF47X3BsskLnmw1U34yL+X6YC0MoBx9EyMg8Jtx4FzGH95jw8+c1VPLHaRA0wDQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", + "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==" }, "hast-util-parse-selector": { "version": "2.2.4", @@ -14305,15 +13829,17 @@ "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==" }, "hast-util-raw": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-5.0.2.tgz", - "integrity": "sha512-3ReYQcIHmzSgMq8UrDZHFL0oGlbuVGdLKs8s/Fe8BfHFAyZDrdv1fy/AGn+Fim8ZuvAHcJ61NQhVMtyfHviT/g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.0.tgz", + "integrity": "sha512-IQo6tv3bMMKxk53DljswliucCJOQxaZFCuKEJ7X80249dmJ1nA9LtOnnylsLlqTG98NjQ+iGcoLAYo9q5FRhRg==", "requires": { - "hast-util-from-parse5": "^5.0.0", - "hast-util-to-parse5": "^5.0.0", + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", "html-void-elements": "^1.0.0", - "parse5": "^5.0.0", + "parse5": "^6.0.0", "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" @@ -14360,11 +13886,11 @@ } }, "hast-util-to-parse5": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-5.1.2.tgz", - "integrity": "sha512-ZgYLJu9lYknMfsBY0rBV4TJn2xiwF1fXFFjbP6EE7S0s5mS8LIKBVWzhA1MeIs1SWW6GnnE4In6c3kPb+CWhog==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", "requires": { - "hast-to-hyperscript": "^7.0.0", + "hast-to-hyperscript": "^9.0.0", "property-information": "^5.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", @@ -14598,9 +14124,9 @@ }, "dependencies": { "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.6.tgz", + "integrity": "sha512-s3GJL04SQoM+gn2c14oyqxvZ3Pcq7cduSDqy3sBFXx6UPSUmgVYwQM9zwkTn9je0lrfg0gHEwR42pF3Q2dCQkQ==" } } }, @@ -14645,9 +14171,9 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" }, "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==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "iconv-lite": { "version": "0.4.24", @@ -14933,6 +14459,143 @@ } } }, + "ink-box": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ink-box/-/ink-box-1.0.0.tgz", + "integrity": "sha512-wD2ldWX9lcE/6+flKbAJ0TZF7gKbTH8CRdhEor6DD8d+V0hPITrrGeST2reDBpCia8wiqHrdxrqTyafwtmVanA==", + "requires": { + "boxen": "^3.0.0", + "prop-types": "^15.7.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "boxen": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, "ink-spinner": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-3.1.0.tgz", @@ -15030,11 +14693,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -15356,6 +15014,11 @@ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -15430,19 +15093,17 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, "is-reference": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", - "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "requires": { - "@types/estree": "0.0.39" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - } + "@types/estree": "*" } }, "is-regex": { @@ -15453,11 +15114,6 @@ "has": "^1.0.3" } }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -15790,11 +15446,11 @@ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "jsonfile": { @@ -15838,6 +15494,11 @@ "json-buffer": "3.0.0" } }, + "khroma": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.1.0.tgz", + "integrity": "sha512-aTO+YX22tYOLEQJYFiatAj1lc5QZ+H5sHWFRBWNCiKwc5NWNUJZyeSeiHEPeURJ2a1GEVYcmyMUwGjjLe5ec5A==" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -15889,27 +15550,20 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "less": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", - "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", "requires": { - "clone": "^2.1.2", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", + "make-dir": "^2.1.0", "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", + "native-request": "^1.0.5", "source-map": "~0.6.0", "tslib": "^1.10.0" }, "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -16281,6 +15935,11 @@ "path-exists": "^3.0.0" } }, + "lock": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", + "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=" + }, "lockfile": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", @@ -16329,11 +15988,6 @@ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, "lodash.every": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", @@ -16359,16 +16013,6 @@ "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -16389,11 +16033,6 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" - }, "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", @@ -16632,11 +16271,11 @@ } }, "mdast-squeeze-paragraphs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-3.0.5.tgz", - "integrity": "sha512-xX6Vbe348Y/rukQlG4W3xH+7v4ZlzUbSY4HUIQCuYrF2DrkcHx584mCaFxkWoDZKNUfyLZItHC9VAqX3kIP7XA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", "requires": { - "unist-util-remove": "^1.0.0" + "unist-util-remove": "^2.0.0" } }, "mdast-util-compact": { @@ -16647,6 +16286,11 @@ "unist-util-visit": "^1.1.0" }, "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, "unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", @@ -16654,36 +16298,36 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } } } }, "mdast-util-definitions": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", - "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz", + "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==", "requires": { - "unist-util-visit": "^1.0.0" - }, - "dependencies": { - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - } + "unist-util-visit": "^2.0.0" } }, "mdast-util-to-hast": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-7.0.0.tgz", - "integrity": "sha512-vxnXKSZgvPG2grZM3kxaF052pxsLtq8TPAkiMkqYj1nFTOazYUPXt3LFYIEB6Ws/IX7Uyvljzk64kD6DwZl/wQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.0.tgz", + "integrity": "sha512-Akl2Vi9y9cSdr19/Dfu58PVwifPXuFt1IrHe7l+Crme1KvgUT+5z+cHLVcQVGCiNTZZcdqjnuv9vPkGsqWytWA==", "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.3", "collapse-white-space": "^1.0.0", "detab": "^2.0.0", - "mdast-util-definitions": "^1.2.0", - "mdurl": "^1.0.1", + "mdast-util-definitions": "^3.0.0", + "mdurl": "^1.0.0", "trim-lines": "^1.0.0", "unist-builder": "^2.0.0", "unist-util-generated": "^1.0.0", @@ -16700,6 +16344,13 @@ "repeat-string": "^1.5.2", "unist-util-position": "^3.0.0", "vfile-location": "^2.0.0" + }, + "dependencies": { + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + } } }, "mdast-util-to-string": { @@ -16730,6 +16381,21 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + }, + "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + } + } } } }, @@ -16798,31 +16464,22 @@ "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" }, "mermaid": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.4.8.tgz", - "integrity": "sha512-sumTNBFwMX7oMQgogdr3NhgTeQOiwcEsm23rQ4KHGW7tpmvMwER1S+1gjCSSnqlmM/zw7Ga7oesYCYicKboRwQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.7.0.tgz", + "integrity": "sha512-SkinxAY3sIdML+o5U4U7rQEIa628OEywEw+pfhc3wSVDFqLk2XNdX2j3YmkyCw3Kcbp9BXar533ei+/saYBs5g==", "requires": { "@braintree/sanitize-url": "^3.1.0", - "crypto-random-string": "^3.0.1", + "babel-eslint": "^10.1.0", "d3": "^5.7.0", "dagre": "^0.8.4", "dagre-d3": "^0.6.4", + "entity-decode": "^2.0.2", "graphlib": "^2.1.7", "he": "^1.2.0", - "lodash": "^4.17.11", + "khroma": "^1.1.0", "minify": "^4.1.1", "moment-mini": "^2.22.1", - "scope-css": "^1.2.1" - }, - "dependencies": { - "crypto-random-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.2.0.tgz", - "integrity": "sha512-8vPu5bsKaq2uKRy3OL7h1Oo7RayAWB8sYexLKAqvCXVib8SxgbmoF1IN4QMKjBv8uI8mp5gPPMbiRah25GMrVQ==", - "requires": { - "type-fest": "^0.8.1" - } - } + "stylis": "^3.5.2" } }, "methods": { @@ -16999,9 +16656,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mississippi": { "version": "3.0.0", @@ -17061,18 +16718,11 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "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=" - } + "minimist": "^1.2.5" } }, "moment": { @@ -17156,6 +16806,13 @@ "sourcemap-codec": "^1.4.1", "stacktrace-js": "^2.0.0", "stylis": "3.5.0" + }, + "dependencies": { + "stylis": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz", + "integrity": "sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw==" + } } }, "nanomatch": { @@ -17176,6 +16833,12 @@ "to-regex": "^3.0.1" } }, + "native-request": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", + "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", + "optional": true + }, "native-url": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", @@ -17355,14 +17018,11 @@ "validate-npm-package-license": "^3.0.1" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.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==" + }, "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -17700,6 +17360,14 @@ } } }, + "optimism": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.12.1.tgz", + "integrity": "sha512-t8I7HM1dw0SECitBYAqFOVHoBAHEQBTeKjIL9y9ImHzAVkdyPK4ifTgM4VJRDtTUY4r/u5Eqxs4XcGPHaoPkeQ==", + "requires": { + "@wry/context": "^0.5.2" + } + }, "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", @@ -17790,13 +17458,6 @@ "integrity": "sha512-6QfeouDf236N+MAxHch0CVIy8o/KBnmhttKjxZoOkUlzqU+u9rZgEyXH3OdckhTgawbqf5rpzmyR+07+Lv0+zg==", "requires": { "eventemitter3": "^3.1.0" - }, - "dependencies": { - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - } } }, "p-retry": { @@ -17912,9 +17573,9 @@ } }, "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -17964,6 +17625,11 @@ "protocols": "^1.4.0" } }, + "parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" + }, "parse-url": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", @@ -17976,9 +17642,9 @@ } }, "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "parseqs": { "version": "0.0.5", @@ -18168,19 +17834,6 @@ "requires": { "lodash": "^4.17.14" } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } } } }, @@ -19169,9 +18822,9 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "randombytes": { "version": "2.1.0", @@ -19561,9 +19214,9 @@ } }, "react-icons": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.10.0.tgz", - "integrity": "sha512-WsQ5n1JToG9VixWilSo1bHv842Cj5aZqTGiS3Ud47myF6aK7S/IUY2+dHcBdmkQcCFRuHsJ9OMUI0kTDfjyZXQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.11.0.tgz", + "integrity": "sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q==", "requires": { "camelcase": "^5.0.0" } @@ -19636,9 +19289,9 @@ "integrity": "sha512-u5l7fhAJXecWUJzVxzMRU2Zvw8m4QmDNHlTrT5uo3KBlYBhmChd7syAakBoay1yIiVhx/8Fi7a6v6kQZfsw81Q==" }, "react-remove-scroll": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.3.0.tgz", - "integrity": "sha512-UqVimLeAe+5EHXKfsca081hAkzg3WuDmoT9cayjBegd6UZVhlTEchleNp9J4TMGkb/ftLve7ARB5Wph+HJ7A5g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.0.tgz", + "integrity": "sha512-BZIO3GaEs0Or1OhA5C//n1ibUP1HdjJmqUVUsOCMxwoIpaCocbB9TFKwHOkBa/nyYy3slirqXeiPYGwdSDiseA==", "requires": { "react-remove-scroll-bar": "^2.1.0", "react-style-singleton": "^2.1.0", @@ -20034,6 +19687,19 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, "remark-parse": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", @@ -20071,11 +19737,40 @@ "x-is-string": "^0.1.0" } }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "requires": { + "unist-util-visit": "^1.1.0" + } + }, "unist-util-stringify-position": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + }, "vfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", @@ -20087,6 +19782,11 @@ "vfile-message": "^1.0.0" } }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + }, "vfile-message": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", @@ -20103,307 +19803,94 @@ "integrity": "sha512-X9Ncj4cj3/CIvLI2Z9IobHtVi8FVdUrdJkCNaL9kdX8ohfsi18DXHsCVd/A7ssARBdccdDb5ODnt62WuEWaM/g==" }, "remark-mdx": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.5.8.tgz", - "integrity": "sha512-wtqqsDuO/mU/ucEo/CDp0L8SPdS2oOE6PRsMm+lQ9TLmqgep4MBmyH8bLpoc8Wf7yjNmae/5yBzUN1YUvR/SsQ==", - "requires": { - "@babel/core": "7.8.4", - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-proposal-object-rest-spread": "7.8.3", - "@babel/plugin-syntax-jsx": "7.8.3", - "@mdx-js/util": "^1.5.8", - "is-alphabetical": "1.0.4", - "remark-parse": "7.0.2", - "unified": "8.4.2" - } - }, - "remark-mdxjs": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/remark-mdxjs/-/remark-mdxjs-2.0.0-next.7.tgz", - "integrity": "sha512-ixa9jEQ1mB65NYJaBq+Hv91DIqQ7B3wk+L9Agwa31NkIzvt6zcgx6TKwavr0zZG69I2n1gZzekhp51AeVCzU1Q==", + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.16.tgz", + "integrity": "sha512-xqZhBQ4TonFiSFpVt6SnTLRnxstu7M6pcaOibKZhqzk4zMRVacVenD7iECjfESK+72LkPm/NW+0r5ahJAg7zlQ==", "requires": { "@babel/core": "7.10.5", "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-proposal-object-rest-spread": "7.10.4", "@babel/plugin-syntax-jsx": "7.10.4", - "@mdx-js/util": "^2.0.0-next.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", - "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } + "@mdx-js/util": "1.6.16", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.1.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "unified": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.1.0.tgz", + "integrity": "sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" } + } + } + }, + "remark-mdxjs": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/remark-mdxjs/-/remark-mdxjs-2.0.0-next.7.tgz", + "integrity": "sha512-ixa9jEQ1mB65NYJaBq+Hv91DIqQ7B3wk+L9Agwa31NkIzvt6zcgx6TKwavr0zZG69I2n1gZzekhp51AeVCzU1Q==", + "requires": { + "@babel/core": "7.10.5", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.10.4", + "@babel/plugin-syntax-jsx": "7.10.4", + "@mdx-js/util": "^2.0.0-next.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, "@mdx-js/util": { "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, "remark-parse": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz", - "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", "requires": { + "ccount": "^1.0.0", "collapse-white-space": "^1.0.2", "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0", "is-whitespace-character": "^1.0.0", "is-word-character": "^1.0.0", "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", + "parse-entities": "^2.0.0", "repeat-string": "^1.5.4", "state-toggle": "^1.0.0", "trim": "0.0.1", "trim-trailing-lines": "^1.0.0", "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", "xtend": "^4.0.1" } }, @@ -20431,6 +19918,14 @@ "web-namespaces": "^1.1.2" } }, + "mdast-util-definitions": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", + "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", + "requires": { + "unist-util-visit": "^1.0.0" + } + }, "mdast-util-to-hast": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-4.0.0.tgz", @@ -20477,6 +19972,21 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + }, + "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + } + } } } }, @@ -20489,11 +19999,11 @@ } }, "remark-squeeze-paragraphs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-3.0.4.tgz", - "integrity": "sha512-Wmz5Yj9q+W1oryo8BV17JrOXZgUKVcpJ2ApE2pwnoHwhFKSk4Wp2PmFNbmJMgYSqAdFwfkoe+TSYop5Fy8wMgA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", "requires": { - "mdast-squeeze-paragraphs": "^3.0.0" + "mdast-squeeze-paragraphs": "^4.0.0" } }, "remark-stringify": { @@ -20515,6 +20025,21 @@ "stringify-entities": "^1.0.1", "unherit": "^1.0.4", "xtend": "^4.0.1" + }, + "dependencies": { + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + } } }, "remark-typescript": { @@ -20528,6 +20053,11 @@ "unist-util-visit": "^1.4.1" }, "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, "unist-util-visit": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", @@ -20535,6 +20065,14 @@ "requires": { "unist-util-visit-parents": "^2.0.0" } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } } } }, @@ -20914,22 +20452,26 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-html": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.22.1.tgz", - "integrity": "sha512-++IMC00KfMQc45UWZJlhWOlS9eMrME38sFG9GXfR+k6oBo9JXSYQgTOZCl9j3v/smFTRNT9XNwz5DseFdMY+2Q==", + "version": "1.27.3", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.3.tgz", + "integrity": "sha512-79tcPlgJ3fuK0/TtUCIBdPeQSvktTSTJP9O/dzrteaO98qw5UV6CATh3ZyPjUzv1LtNjHDlhbq9XOXiKf0zA1w==", "requires": { - "chalk": "^2.4.1", "htmlparser2": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.mergewith": "^4.6.2", - "postcss": "^7.0.27", - "srcset": "^2.0.1", - "xtend": "^4.0.1" + "lodash": "^4.17.15", + "parse-srcset": "^1.0.2", + "postcss": "^7.0.27" }, "dependencies": { + "dom-serializer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz", + "integrity": "sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, "domelementtype": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", @@ -20944,11 +20486,11 @@ } }, "domutils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.0.0.tgz", - "integrity": "sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz", + "integrity": "sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg==", "requires": { - "dom-serializer": "^0.2.1", + "dom-serializer": "^1.0.1", "domelementtype": "^2.0.1", "domhandler": "^3.0.0" } @@ -20975,7 +20517,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "optional": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -20989,29 +20530,6 @@ "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "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" - } - } - } - }, - "scope-css": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scope-css/-/scope-css-1.2.1.tgz", - "integrity": "sha512-UjLRmyEYaDNiOS673xlVkZFlVCtckJR/dKgr434VMm7Lb+AOOqXKdAcY7PpGlJYErjXXJzKN7HWo4uRPiZZG0Q==", - "requires": { - "escaper": "^2.5.3", - "slugify": "^1.3.1", - "strip-css-comments": "^3.0.0" } }, "screenfull": { @@ -21134,9 +20652,9 @@ } }, "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } @@ -21308,12 +20826,51 @@ } }, "side-channel": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", - "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "requires": { - "es-abstract": "^1.17.0-next.1", - "object-inspect": "^1.7.0" + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + } } }, "signal-exit": { @@ -21322,11 +20879,13 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.20.1.tgz", + "integrity": "sha512-aa9s2ZLjXlHCVGbDXQLInMLvLkxKEclqMU9X5HMXi3tLWLxbWObz1UgtyZha6ocHarQtFp0OjQW9KHVR1g6wbA==", "requires": { - "debug": "^4.0.1" + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.1.1" }, "dependencies": { "debug": { @@ -21383,9 +20942,9 @@ } }, "slugify": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.6.tgz", - "integrity": "sha512-wA9XS475ZmGNlEnYYLPReSfuz/c3VQsEMoU43mi6OnKMCdbnFXd4/Yg7J0lBv8jkPolacMpOrWEaoYxuE1+hoQ==" + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.5.tgz", + "integrity": "sha512-WpECLAgYaxHoEAJ8Q1Lo8HOs1ngn7LN7QjXgOLbmmfkcWvosyk4ZTXkTzKyhngK640USTZUlgoQJfED1kz5fnQ==" }, "snake-case": { "version": "2.1.0", @@ -21857,11 +21416,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "srcset": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-2.0.1.tgz", - "integrity": "sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ==" - }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -22309,14 +21863,6 @@ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" }, - "strip-css-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-css-comments/-/strip-css-comments-3.0.0.tgz", - "integrity": "sha1-elYl7/iisibPiUehElTaluE9rok=", - "requires": { - "is-regexp": "^1.0.0" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -22397,14 +21943,14 @@ } }, "stylis": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz", - "integrity": "sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw==" + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" }, "subscriptions-transport-ws": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.17.tgz", - "integrity": "sha512-hNHi2N80PBz4T0V0QhnnsMGvG3XDFDS9mS6BhZ3R12T6EBywC8d/uJscsga0cVO4DKtXCkCRrWm2sOYrbOdhEA==", + "version": "0.9.18", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz", + "integrity": "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==", "requires": { "backo2": "^1.0.2", "eventemitter3": "^3.1.0", @@ -22586,21 +22132,31 @@ } }, "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" }, "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -22639,9 +22195,9 @@ } }, "throttle-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz", - "integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", + "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==" }, "through": { "version": "2.3.8", @@ -22696,6 +22252,14 @@ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" }, + "tippy.js": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.2.6.tgz", + "integrity": "sha512-0tTL3WQNT0nWmpslhDryRahoBm6PT9fh1xXyDfOsvZpDzq52by2rF2nvsW0WX2j9nUZP/jSGDqfKJGjCtoGFKg==", + "requires": { + "@popperjs/core": "^2.4.4" + } + }, "title-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", @@ -22951,20 +22515,9 @@ "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" }, "uglify-js": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", - "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.2.tgz", + "integrity": "sha512-GXCYNwqoo0MbLARghYjxVBxDCnU0tLqN7IPLdHHbibCb1NI5zBkU2EPcy/GaVxc0BtTjqyGXJCINe6JMR2Dpow==" }, "unc-path-regex": { "version": "0.1.2", @@ -23088,9 +22641,9 @@ "integrity": "sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw==" }, "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", + "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" }, "unist-util-map": { "version": "1.0.5", @@ -23114,29 +22667,19 @@ "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" }, "unist-util-remove": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", - "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.0.tgz", + "integrity": "sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g==", "requires": { - "unist-util-is": "^3.0.0" + "unist-util-is": "^4.0.0" } }, "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", "requires": { - "unist-util-visit": "^1.1.0" - }, - "dependencies": { - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - } + "unist-util-visit": "^2.0.0" } }, "unist-util-select": { @@ -23204,11 +22747,12 @@ "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==" }, "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", + "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", "requires": { - "unist-util-is": "^3.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" } }, "universalify": { @@ -23268,9 +22812,9 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-notifier": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", - "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", + "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==", "requires": { "boxen": "^4.2.0", "chalk": "^3.0.0", @@ -23552,9 +23096,9 @@ } }, "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.1.0.tgz", + "integrity": "sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==" }, "vfile-message": { "version": "2.0.4", @@ -23674,12 +23218,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "optional": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, "readdirp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", @@ -23728,12 +23266,6 @@ "readdirp": "^2.2.1", "upath": "^1.1.1" } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true } } }, @@ -23794,19 +23326,6 @@ "estraverse": "^4.1.1" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -23982,11 +23501,6 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -24179,6 +23693,14 @@ "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-0.3.2.tgz", "integrity": "sha512-kxEtPQ6lBBik2qtJlsZkiaDMI6rGXe9w1kLH9ZCdt0wgCGVnbwwPlP60cMqG6tILNFYqXDxNt4+c4OIIuE+Fnw==" }, + "webpack-virtual-modules": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", + "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", + "requires": { + "debug": "^3.0.0" + } + }, "websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -24647,9 +24169,9 @@ "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" }, "zen-observable-ts": { - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz", - "integrity": "sha512-2rkjiPALhOtRaDX6pWyNqK1fnP5KkJJybYebopNSn6wDG1lxBoFs2+nwwXKoA6glHIrtwrfBBy6da0stkKtTAA==", + "version": "0.8.21", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", + "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", "requires": { "tslib": "^1.9.3", "zen-observable": "^0.8.0" diff --git a/docs/package.json b/docs/package.json index 5ce6385b..2370b5bb 100644 --- a/docs/package.json +++ b/docs/package.json @@ -7,13 +7,16 @@ }, "dependencies": { "algoliasearch": "^4.0.3", - "gatsby": "2.23.20", + "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", - "gatsby-source-graphql": "^2.1.33", - "gatsby-theme-apollo-docs": "4.0.14", + "gatsby-source-graphql": "^2.7.1", + "gatsby-theme-apollo-docs": "4.3.9", "instantsearch.css": "^7.4.2", "react": "16.13.1", "react-dom": "16.13.1", "react-instantsearch-dom": "^6.3.0" + }, + "devDependencies": { + "gatsby-cli": "^2.12.88" } } From 1629985544cadeffbb4f792dc4156f47900524cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 11:33:40 +0200 Subject: [PATCH 047/251] hmm --- docs/package-lock.json | 191 ++++------------------------------------- 1 file changed, 16 insertions(+), 175 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 50a428ed..8cd8f05d 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3654,29 +3654,6 @@ } } }, - "@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "requires": { - "debug": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" - }, "@mapbox/hast-util-table-cell-style": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", @@ -11266,30 +11243,6 @@ } } }, - "gatsby-plugin-google-analytics": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/gatsby-plugin-google-analytics/-/gatsby-plugin-google-analytics-2.3.13.tgz", - "integrity": "sha512-K/6c9iByR8uDpFZuJrappjyMsVtWFwPyAkRlXFHhq2mmNtgZeRVKFf5XoGiOHCeMPEpBGE58LLana/F01LLteQ==", - "requires": { - "@babel/runtime": "^7.10.3", - "minimatch": "3.0.4" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, "gatsby-plugin-gtag": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/gatsby-plugin-gtag/-/gatsby-plugin-gtag-1.0.13.tgz", @@ -11387,11 +11340,6 @@ "to-fast-properties": "^2.0.0" } }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -11405,20 +11353,6 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, - "gatsby-core-utils": { - "version": "1.3.16", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", - "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, "loader-utils": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", @@ -11648,6 +11582,11 @@ } } }, + "gatsby-plugin-segment-js": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-segment-js/-/gatsby-plugin-segment-js-3.5.0.tgz", + "integrity": "sha512-KrlULaEdj5KNUec6B12sSvirfXBYJvvAV08Wr2T9YC9LC3oczYhRhvImpzsJEuZyH343Lv2dsOK13I8Q0mWm2A==" + }, "gatsby-plugin-svgr": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", @@ -12612,20 +12551,6 @@ "regenerator-runtime": "^0.13.4" } }, - "gatsby-core-utils": { - "version": "1.3.16", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", - "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -12674,14 +12599,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -12712,14 +12629,6 @@ "requires": { "glob": "^7.1.3" } - }, - "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", - "requires": { - "debug": "^4.0.1" - } } } }, @@ -12857,25 +12766,25 @@ } }, "gatsby-theme-apollo-docs": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.3.9.tgz", - "integrity": "sha512-KEfDSU6eth3fS74a4rB7NMI1/lOJL1I33OXrxmvV10ngCRs4BoQUn2xNG/ey80O6InDiT3sgKdgVeX4jmS+pnA==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.0.14.tgz", + "integrity": "sha512-hptn26w5o8MOA5iH6NZ00KrWdUzPRXUiCgJzh1J4+ggqCtypGixU5uXJIwR/ka9WRUJtQWz9uaJ47XlPnhTMUw==", "requires": { "@mdx-js/mdx": "^1.1.0", "@mdx-js/react": "^1.0.27", - "gatsby-plugin-google-analytics": "^2.2.5", "gatsby-plugin-mdx": "^1.0.23", "gatsby-plugin-printer": "1.0.x", - "gatsby-remark-autolink-headers": "^2.3.11", + "gatsby-plugin-segment-js": "^3.0.1", + "gatsby-remark-autolink-headers": "^2.0.16", "gatsby-remark-check-links": "^2.1.0", "gatsby-remark-code-titles": "^1.1.0", "gatsby-remark-copy-linked-files": "^2.0.12", "gatsby-remark-mermaid": "^1.2.0", "gatsby-remark-prismjs": "^3.2.8", - "gatsby-remark-rewrite-relative-links": "^1.0.8", + "gatsby-remark-rewrite-relative-links": "^1.0.7", "gatsby-source-filesystem": "^2.0.29", "gatsby-source-git": "^1.0.1", - "gatsby-theme-apollo-core": "^3.0.18", + "gatsby-theme-apollo-core": "^3.0.10", "gatsby-transformer-remark": "^2.6.30", "js-yaml": "^3.13.1", "prismjs": "^1.15.0", @@ -12885,7 +12794,6 @@ "remark": "^10.0.1", "remark-react": "^5.0.1", "remark-typescript": "^0.3.0", - "simple-git": "^2.7.0", "source-sans-pro": "^3.6.0", "striptags": "^3.1.1" } @@ -12926,20 +12834,6 @@ "regenerator-runtime": "^0.13.4" } }, - "gatsby-core-utils": { - "version": "1.3.16", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", - "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, "hast-to-hyperscript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", @@ -13583,50 +13477,12 @@ "cross-fetch": "2.2.2" } }, -<<<<<<< HEAD - "graphql-tools-fork": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/graphql-tools-fork/-/graphql-tools-fork-8.10.0.tgz", - "integrity": "sha512-RzUIpnBMxInqgAtTmfET34Z6cwpREwTaXedRDT+0e6vzMdL2GckDqkCQyxsXHghbCVOL80oOXGB02S0rzgkOwA==", - "requires": { - "apollo-link": "^1.2.13", - "apollo-link-http-common": "^0.2.15", - "deprecated-decorator": "^0.1.6", - "extract-files": "^7.0.0", - "form-data": "^3.0.0", - "iterall": "^1.3.0", - "node-fetch": "^2.6.0", - "uuid": "^7.0.2" - }, - "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" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, - "uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==" - } -======= "graphql-subscriptions": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", "requires": { "iterall": "^1.2.1" ->>>>>>> master } }, "graphql-tag": { @@ -13680,19 +13536,6 @@ "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "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" - } - } } }, "has": { @@ -20917,13 +20760,11 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-git": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.20.1.tgz", - "integrity": "sha512-aa9s2ZLjXlHCVGbDXQLInMLvLkxKEclqMU9X5HMXi3tLWLxbWObz1UgtyZha6ocHarQtFp0OjQW9KHVR1g6wbA==", + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", "requires": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.1.1" + "debug": "^4.0.1" }, "dependencies": { "debug": { From c19ac13c74578c81d846756f890dc003a3e1f3dd Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Wed, 26 Aug 2020 12:37:21 +0300 Subject: [PATCH 048/251] fix: upgrade react-instantsearch-dom from 6.3.0 to 6.4.0 (#66) Snyk has created this PR to upgrade react-instantsearch-dom from 6.3.0 to 6.4.0. See this package in NPM: https://www.npmjs.com/package/react-instantsearch-dom See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr Co-authored-by: Jon Arild Torresdal --- docs/package-lock.json | 26 +++++++++++++------------- docs/package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 8646149d..b1c05061 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -19103,33 +19103,33 @@ } }, "react-instantsearch-core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.3.0.tgz", - "integrity": "sha512-mBCgloOs4wkuKHRypPiGZYSYSdT9wngXB3SAr+f02VpiJQFzllcB3Qn9pBFy1Zc7ROdlRovTbpFXFJmJjiWBjA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.4.0.tgz", + "integrity": "sha512-iJ33uxpo9suc9p8LTH3v5by5BXzhuttBvSaoePZheuLLG8dnbpiUt+m0iC4oeyr1cgubKJ1OhGCL8AQN2fR11A==", "requires": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.1.0", - "fast-deep-equal": "^2.0.1", - "prop-types": "^15.5.10" + "prop-types": "^15.5.10", + "react-fast-compare": "^3.0.0" }, "dependencies": { - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "react-fast-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.0.1.tgz", + "integrity": "sha512-C5vP0J644ofZGd54P8++O7AvrqMEbrGf8Ue0eAUJLJyw168dAX2aiYyX/zcY/eSNwO0IDjsKUaLE6n83D+TnEg==" } } }, "react-instantsearch-dom": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.3.0.tgz", - "integrity": "sha512-8B0jkwLLXeLZ0zf+YbND0e2Wqgntf+ez/xdOqQ6oLrLRpQqhf4T6IBanuqBkx+ce5/7JW4mLjZCBeMTj9Svd4g==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.4.0.tgz", + "integrity": "sha512-FyJaD+jVNt59KOd8Nt6nQrmueEEJNH0VmS9IlSwWbQz2NrkQniaCFm+k8G13LsAASOCq4vQ8ULG2up+WpJeS8w==", "requires": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.1.0", "classnames": "^2.2.5", "prop-types": "^15.5.10", - "react-instantsearch-core": "^6.3.0" + "react-instantsearch-core": "^6.4.0" } }, "react-is": { diff --git a/docs/package.json b/docs/package.json index c68f2e68..6c74f155 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ "instantsearch.css": "^7.4.2", "react": "16.13.1", "react-dom": "16.13.1", - "react-instantsearch-dom": "^6.3.0" + "react-instantsearch-dom": "^6.4.0" }, "devDependencies": { "gatsby-cli": "^2.12.88" From 77e25b5d8a6248f338debced346a0af4fe361e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 16:16:48 +0200 Subject: [PATCH 049/251] Cleand up half-finished authentiction docs --- .../source/content/security/authentication.md | 35 +++++++------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md index e3d8a5ea..9600ad28 100644 --- a/docs/source/content/security/authentication.md +++ b/docs/source/content/security/authentication.md @@ -31,30 +31,32 @@ Fore more details, see the [Controller Helm Chart](/stable/azure-key-vault-contr ## Custom Authentication for the Env Injector -The Env-Injector operates locally compared to the Controller, which operates centrally. The Env-Injector running inside a Pod's container needs access to Azure Key Vault credentials to inject secrets. Two options are available to make credentials available during environment injection: +The Env-Injector execute locally inside your Pod and needs access to Azure Key Vault credentials to inject secrets. Two options are available: -1) The Env-Injector running inside the container request credentials from the Env-Injector authentication service -2) The Pod hosting the container provide credentials to the Env-Injector running inside the container +1) The Env-Injector running inside the container request credentials from the Env-Injector authentication service (default / centralized) +2) The Pod hosting the container provide credentials to the Env-Injector running inside the container (custom authentication / local) -For option 1 you only provide credentials once, during the installation of the Env-Injector. +For option 1 you only provide credentials when installation of the Env-Injector. -For option 2 you have to provide Azure Key Vault credentials to every Pod using Env-Injector. +For option 2 you provide credentials to every Pod that will use the Env-Injector. -Option 1 is easiest and most convinient, but also give ALL pods +Option 1 is easiest and most convenient, but will give the same credentials to all Pods using Env-Injector. **Recommendations:** -| | Env-Injector Auth Service | Pass credentials to every Pod | +| | Env-Injector Auth Service | Credentials in Pod | | ---------------------------------------------------- | :-----------------------: | :---------------------------: | | Using one Azure Key Vault per cluster | ✔ | | | Using multiple Azure Key Vaults per cluster (f.ex. one Key Vault per application) and it is OK to use the same credentials to all Key Vaults | ✔ | | | Multi-tenant environment (multiple Azure Key Vaults) | | ✔ | + +| | Env-Injector Auth Service | Credentials in Pod | +| ---------------------------------------------------- | :-----------------------: | :---------------------------: | | Provide credentials only during Env-Injector install | ✔ -| Must provide credentials to every Pod using Env-Injector | | ✔| -| Azure Key Vault credentials available to all Pods using Env-Injector | ✔ || +| Must provide credentials to every Pod when using Env-Injector | | ✔| +| The same Azure Key Vault credentials used in all Pods using Env-Injector | ✔ || | Recommended if there is one Azure Key Vault per cluster | ✔ | | -In practice this means the code that downloads the secrets for Azure Key Vault runs inside the application Container and are executed before the original executable of that container. After the container has started, a Kubernetes user with the right credentials are able to exec into the container. Several steps have been taken to avoid exposing sensitive data in this scenario and are explained below. Another scenario is data stored in Kubernetes Secrets To use custom authentication for the Env Injector there are three options: @@ -66,19 +68,6 @@ To avoid using option no. 3, support for a more convenient solution (no. 2) is s Fore more details, see the [Env Injector Helm Chart](/stable/azure-key-vault-env-injector/README/#installing-the-chart). -### Centralized vs Local credentials - -|Auth method | Centralized | Local | -|------------|-------------|-------| -|[AAD Pod Identity](https://github.com/Azure/aad-pod-identity) | (✔)|✔ | -|Client credentials |✔ |✔| -|Certificate | ✔ | ✔ | -|Username/password | ✔ | ✔ | - -With centralized credentials, the credentials are stored in the same Kuberntes namespace as the Env-Injector and the Env-Injector can provide ... - -Local credentials is when the credentials are passed directly to the Pod - ## Custom Authentication Options The following authentication options are available: From b36c25a65d7fca4b12f08ca0a51855e7582ce9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 17:07:54 +0200 Subject: [PATCH 050/251] Cleaned up and correctred authentication --- .../content/installation/requirements.md | 2 +- docs/source/content/quick-start.mdx | 2 +- .../source/content/security/authentication.md | 65 +++++++++---------- 3 files changed, 32 insertions(+), 37 deletions(-) diff --git a/docs/source/content/installation/requirements.md b/docs/source/content/installation/requirements.md index de2f5f52..4e99511b 100644 --- a/docs/source/content/installation/requirements.md +++ b/docs/source/content/installation/requirements.md @@ -7,7 +7,7 @@ description: "Requirements for installing akv2k8s" * A dedicated kubernetes namespace * Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook * RBAC enabled -* Default [authentication](../security/authentication) requires Kubernetes cluster running in Azure - use [custom authentication](../security/authentication#custom-authentication) if running outside Azure +* Default [authentication](../security/authentication) requires Kubernetes cluster running in Azure - use [custom authentication](../security/authentication) if running outside Azure ## Dedicated namespace for akv2k8s diff --git a/docs/source/content/quick-start.mdx b/docs/source/content/quick-start.mdx index c03cec7f..5a9cf001 100644 --- a/docs/source/content/quick-start.mdx +++ b/docs/source/content/quick-start.mdx @@ -21,7 +21,7 @@ See [installation](installation). ## Ensure Kubernetes can access objects in Azure Key Vault -By default akv2k8s use the AKS cluster credentials to authenticate with Azure Key Vault (if you run outside Azure, see using [custom credentials](security/authentication#custom-authentication)). Run the following command to authorize akv2k8s to access `secret`-objects in Azure Key Vault. +By default akv2k8s use the AKS cluster credentials to authenticate with Azure Key Vault (if you run outside Azure, see using [custom credentials](security/authentication#akv-authentication-with-the-controller)). Run the following command to authorize akv2k8s to access `secret`-objects in Azure Key Vault. ```bash az keyvault set-policy \ diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md index 9600ad28..241a6556 100644 --- a/docs/source/content/security/authentication.md +++ b/docs/source/content/security/authentication.md @@ -1,13 +1,15 @@ --- -title: "Authentication" +title: "Authentication with Azure Key Vault" description: "Learn about the different options for authenticating with Azure Key Vault." --- -By default both the Controller and the Env Injector will assume it is running on Azure (since Azure Key Vault is most commonly used in Azure) - and use the default AKS service principal for authentication - unless custom authentication is provided (see [Custom Authentication](#custom-authentication) below). +By default both the Controller and the Env Injector will assume it is running on Azure (since Azure Key Vault is most commonly used in Azure) - and use the default AKS credentials for authentication (a Service Principal or Azure Managed Identities) - unless custom authentication is provided. -Default authentication is the AKS credentials that are available on all Nodes (hosts) at `/etc/kubernetes/azure.json`. These credentials are the same as the Kubernetes cluster use when interacting with Azure to create VM's, Load Balancers and other cloud infrastructure. +The Controller and Env-Injector have to handle AKV authentication quite differently, as the Controller is centralized and the Env-Injector executes in context of Pods. -> **Note: The preferred solution would be to use [Azure Managed Identities](https://docs.microsoft.com/en-us/azure/aks/use-managed-identity), but this is still in preview - so for now we rely on the default AKS service principal.** +To get more options for AKV authentication, see: + * [AKV Authentication with the Controller](#akv-authentication-with-the-controller) for AKV Controller authentication options + * [AKV Authentication with the Env-Injector](#akv-authentication-with-the-env-injector) for AKV Env-Injector authentication options ## Situations where Default Authentication does not Work @@ -17,54 +19,47 @@ Currently only one situations has been identified, where default authentication Two solutions exists: 1. Change the Pod Security Policy to list `/etc/kubernetes/azure.json` under [AllowedHostPaths](https://kubernetes.io/docs/concepts/policy/pod-security-policy/#volumes-and-file-systems) - 2. Or [use custom authentication](#custom-authentication). + 2. Or use custom authentication (see below). -## Custom Authentication +## AKV Authentication with the Controller -It is possible to give the Controller and/or the Env Injector specific credentials to authenticate with Azure Key Vault. The authentication requirements for the Controller and Env Injector are covered below. - -## Custom Authentication for the Controller - -The Controller will need Azure Key Vault credentials to get Secrets from Azure Key Vault and store them as Kubernetes Secrets. In order to provide custom credentials, pass inn the value `keyVault.customAuth.enabled=true` to the Controller Helm Chart together with one of the [Authentication options](#custom-authentication-options) described below. +The Controller will need Azure Key Vault credentials to get Secrets from Azure Key Vault and store them as Kubernetes Secrets. **If the default option (AKS credentials) works for you, use that.** If not, use custom authentication by passing inn the value `keyVault.customAuth.enabled=true` to the Controller and pick one of the [Authentication options](#custom-authentication-options) described below. Fore more details, see the [Controller Helm Chart](/stable/azure-key-vault-controller/README/#installing-the-chart). -## Custom Authentication for the Env Injector - -The Env-Injector execute locally inside your Pod and needs access to Azure Key Vault credentials to inject secrets. Two options are available: - -1) The Env-Injector running inside the container request credentials from the Env-Injector authentication service (default / centralized) -2) The Pod hosting the container provide credentials to the Env-Injector running inside the container (custom authentication / local) - -For option 1 you only provide credentials when installation of the Env-Injector. +## AKV Authentication with the Env-Injector -For option 2 you provide credentials to every Pod that will use the Env-Injector. +The Env-Injector execute locally inside your Pod and needs access to Azure Key Vault credentials to inject secrets. You can either use default authentication (AKS credentials) or custom authentication. -Option 1 is easiest and most convenient, but will give the same credentials to all Pods using Env-Injector. +Below we outline some guidelines to when you should use Default or Custom authentication. -**Recommendations:** +| | Default | Custom Authentication | +| ---------------------------------------------------- | :-----------------------: | :---------------------------: | +| Kubernetes runs on Azure AKS | ✔|| +| Kubernetes runs outside Azure | | ✔| -| | Env-Injector Auth Service | Credentials in Pod | +| | Default | Custom Authentication | | ---------------------------------------------------- | :-----------------------: | :---------------------------: | | Using one Azure Key Vault per cluster | ✔ | | -| Using multiple Azure Key Vaults per cluster (f.ex. one Key Vault per application) and it is OK to use the same credentials to all Key Vaults | ✔ | | -| Multi-tenant environment (multiple Azure Key Vaults) | | ✔ | +| Using multiple Azure Key Vaults per cluster (like one Key Vault per application) and it is OK to use the same credentials to all Key Vaults | ✔ | | +| Multi-tenant environment (multiple Azure Key Vaults per cluster) | | ✔ | +Implications: -| | Env-Injector Auth Service | Credentials in Pod | +| | Default | Custom Authentication | | ---------------------------------------------------- | :-----------------------: | :---------------------------: | -| Provide credentials only during Env-Injector install | ✔ -| Must provide credentials to every Pod when using Env-Injector | | ✔| -| The same Azure Key Vault credentials used in all Pods using Env-Injector | ✔ || -| Recommended if there is one Azure Key Vault per cluster | ✔ | | +| Provide credentials only once, during Env-Injector install | ✔ +| Provide credentials to every Pod using Env-Injector | | ✔| +| The same Azure Key Vault credentials used in all Pods | ✔ || -To use custom authentication for the Env Injector there are three options: +### Custom AKV Authentication with the Env-Injector -1. Use Microsft's [AAD Pod Identity](https://github.com/Azure/aad-pod-identity) (see [Using Custom Authentication with AAD Pod Identity](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-aad-pod-identity)) -2. Use custom credentials through credential injection (see [Using Custom Authentication with Credential Injection Enabled](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-credential-injection-enabled)) -3. Provide credentials for each Pod using the Env Injector pattern using [Authentication options](#custom-authentication-options) below. +Custom AKV Authentication for the Env-Injector means providing AKV credentials to every Pod using environment injection. Typically this means in every Kubernetes Deployment definition. -To avoid using option no. 3, support for a more convenient solution (no. 2) is supported where the Azure Key Vault credentials in the Env Injector (using [Authentication options](#custom-authentication-options) below) is "forwarded" to the the Pods. The Env Injector will create a Kubernetes Secret containing the credentials and mutate the Pod's env section to reference the credentials in the Secret. +Two options are currently available: + +1. Use Microsft's [AAD Pod Identity](https://github.com/Azure/aad-pod-identity) (see [Using Custom Authentication with AAD Pod Identity](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-aad-pod-identity)) +2. Provide credentials for each Pod using [Authentication options](#custom-authentication-options) below. Fore more details, see the [Env Injector Helm Chart](/stable/azure-key-vault-env-injector/README/#installing-the-chart). From d25c79103a8afb881a1e4519282d25253aacf4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 17:08:16 +0200 Subject: [PATCH 051/251] Corrected webhook env vars --- Makefile | 7 ++- cmd/azure-keyvault-secrets-webhook/main.go | 46 ++++++++++--------- .../registry.go | 4 +- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 1ff1cb42..2ddb0b68 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,11 @@ VCS_URL := https://$(PACKAGE) print-v-webhook: @echo $(DOCKER_RELEASE_TAG_WEBHOOK) -run-docs-dev: - cd ./docs && npm install && GATSBY_ALGOLIA_ENABLED=false npm run start +docs-install-dev: + cd ./docs && npm install + +docs-run-dev: + cd ./docs && GATSBY_ALGOLIA_ENABLED=false npm run start fmt: @echo "==> Fixing source code with gofmt..." diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 002f27b0..288f4217 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -53,10 +53,10 @@ const ( ) type azureKeyVaultConfig struct { - port string - customAuth bool - namespace string - aadPodBindingLabel string + port string + customAuth bool + namespace string + // aadPodBindingLabel string cloudConfigHostPath string serveMetrics bool httpPort string @@ -65,11 +65,12 @@ type azureKeyVaultConfig struct { caFile string useAuthService bool // nameLocallyOverrideAuthService string - authServiceName string - authServicePort string - caBundleConfigMapName string - kubeClient *kubernetes.Clientset - credentials azure.Credentials + dockerImageInspectionTimeout int + authServiceName string + authServicePort string + caBundleConfigMapName string + kubeClient *kubernetes.Clientset + credentials azure.Credentials } var config azureKeyVaultConfig @@ -194,7 +195,7 @@ func healthHandler(w http.ResponseWriter, r *http.Request) { func initConfig() { viper.SetDefault("ca_config_map_name", "akv2k8s-ca") viper.SetDefault("azurekeyvault_env_image", "spvest/azure-keyvault-env:latest") - viper.SetDefault("custom_docker_pull_timeout", 20) + viper.SetDefault("docker_image_inspection_timeout", 20) viper.SetDefault("use_auth_service", true) viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json") viper.SetDefault("metrics_enabled", false) @@ -213,18 +214,19 @@ func main() { setLogLevel(logLevel) config = azureKeyVaultConfig{ - port: viper.GetString("port"), - httpPort: viper.GetString("port_http"), - customAuth: viper.GetBool("custom_auth"), - serveMetrics: viper.GetBool("metrics_enabled"), - certFile: viper.GetString("tls_cert_file"), - keyFile: viper.GetString("tls_private_key_file"), - caFile: viper.GetString("tls_ca_file"), - useAuthService: viper.GetBool("use_auth_service"), - authServiceName: viper.GetString("webhook_auth_service"), - authServicePort: viper.GetString("webhook_auth_service_port"), - caBundleConfigMapName: viper.GetString("ca_config_map_name"), - cloudConfigHostPath: viper.GetString("cloud_config_host_path"), + port: viper.GetString("port"), + httpPort: viper.GetString("port_http"), + customAuth: viper.GetBool("custom_auth"), + serveMetrics: viper.GetBool("metrics_enabled"), + certFile: viper.GetString("tls_cert_file"), + keyFile: viper.GetString("tls_private_key_file"), + caFile: viper.GetString("tls_ca_file"), + useAuthService: viper.GetBool("use_auth_service"), + authServiceName: viper.GetString("webhook_auth_service"), + authServicePort: viper.GetString("webhook_auth_service_port"), + caBundleConfigMapName: viper.GetString("ca_config_map_name"), + cloudConfigHostPath: viper.GetString("cloud_config_host_path"), + dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), } log.Info("Active settings:") diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 0641c2bf..c0957cab 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -72,8 +72,8 @@ type imageOptions struct { } func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { - log.Debugf("docker image inspection timeout: %v seconds", 20) - timeout := time.Duration(20) * time.Second + log.Debugf("docker image inspection timeout: %d seconds", config.dockerImageInspectionTimeout) + timeout := time.Duration(config.dockerImageInspectionTimeout) * time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() From 78d2a8b9e4fb20910282944f86294b3d62e36e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 20:50:38 +0200 Subject: [PATCH 052/251] Fixed docker inspection test --- cmd/azure-keyvault-secrets-webhook/registry_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/azure-keyvault-secrets-webhook/registry_test.go b/cmd/azure-keyvault-secrets-webhook/registry_test.go index aca68dd5..2478c2a1 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry_test.go +++ b/cmd/azure-keyvault-secrets-webhook/registry_test.go @@ -10,6 +10,8 @@ import ( ) func TestDockerPull(t *testing.T) { + config.dockerImageInspectionTimeout = 20 + opts := imageOptions{ image: "openjdk:slim", credentials: types.DockerAuthConfig{}, From 0d78a956528e84a9929b939461a6e96c33c8d1c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 26 Aug 2020 20:55:43 +0200 Subject: [PATCH 053/251] Print version in github action when releaseing --- .github/workflows/ca-bundle-controller-release.yaml | 3 +++ .github/workflows/controller-release.yaml | 3 +++ .github/workflows/vaultenv-release.yaml | 3 +++ .github/workflows/webhook-release.yaml | 3 +++ Makefile | 9 +++++++++ 5 files changed, 21 insertions(+) diff --git a/.github/workflows/ca-bundle-controller-release.yaml b/.github/workflows/ca-bundle-controller-release.yaml index 8fe3f955..c9ff3e00 100644 --- a/.github/workflows/ca-bundle-controller-release.yaml +++ b/.github/workflows/ca-bundle-controller-release.yaml @@ -10,6 +10,9 @@ jobs: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@master + + - name: Version + run: make print-v-ca-bundle-controller - name: Pull images from private repo run: | diff --git a/.github/workflows/controller-release.yaml b/.github/workflows/controller-release.yaml index 9ba1f188..92e88ef1 100644 --- a/.github/workflows/controller-release.yaml +++ b/.github/workflows/controller-release.yaml @@ -11,6 +11,9 @@ jobs: steps: - uses: actions/checkout@master + - name: Version + run: make print-v-controller + - name: Pull images from private repo run: | echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io diff --git a/.github/workflows/vaultenv-release.yaml b/.github/workflows/vaultenv-release.yaml index f32d56eb..c5c6a00f 100644 --- a/.github/workflows/vaultenv-release.yaml +++ b/.github/workflows/vaultenv-release.yaml @@ -11,6 +11,9 @@ jobs: steps: - uses: actions/checkout@master + - name: Version + run: make print-v-vaultenv + - name: Pull images from private repo run: | echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io diff --git a/.github/workflows/webhook-release.yaml b/.github/workflows/webhook-release.yaml index cdaeb555..7f746c0a 100644 --- a/.github/workflows/webhook-release.yaml +++ b/.github/workflows/webhook-release.yaml @@ -11,6 +11,9 @@ jobs: steps: - uses: actions/checkout@master + - name: Version + run: make print-v-webhook + - name: Pull image from private repo run: | echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io diff --git a/Makefile b/Makefile index 2ddb0b68..dcfee864 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,15 @@ VCS_URL := https://$(PACKAGE) print-v-webhook: @echo $(DOCKER_RELEASE_TAG_WEBHOOK) +print-v-controller: + @echo $(DOCKER_RELEASE_TAG_CONTROLLER) + +print-v-vaultenv: + @echo $(DOCKER_RELEASE_TAG_VAULTENV) + +print-v-ca-bundle-controller: + @echo $(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) + docs-install-dev: cd ./docs && npm install From 004a4152ecd65b74d76eca01f05e177b93169389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 27 Aug 2020 21:03:27 +0200 Subject: [PATCH 054/251] Added env vars with secrets to int-tests --- .github/workflows/ca-bundle-controller-build.yaml | 6 ++++++ .github/workflows/controller-build.yaml | 5 +++++ .github/workflows/vaultenv-build.yaml | 5 +++++ .github/workflows/webhook-build.yaml | 5 +++++ 4 files changed, 21 insertions(+) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index e4597660..4b5d3986 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -27,6 +27,12 @@ jobs: - name: Build uses: ./.github/actions/build + env: + AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID + AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET + AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID + AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION + with: build-make-action: build-ca-bundle-controller diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index 3ad70193..271ed467 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -27,6 +27,11 @@ jobs: - name: Build uses: ./.github/actions/build + env: + AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID + AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET + AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID + AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION with: build-make-action: build-controller diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index 075f46f5..2114f159 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -27,6 +27,11 @@ jobs: - name: Build uses: ./.github/actions/build + env: + AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID + AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET + AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID + AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION with: build-make-action: build-vaultenv diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index 9184e6cc..1397635d 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -27,6 +27,11 @@ jobs: - name: Build uses: ./.github/actions/build + env: + AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID + AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET + AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID + AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION with: build-make-action: build-webhook From 041cb0f764eefc24fc89c18ec42cf67d3e17c267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 27 Aug 2020 21:03:44 +0200 Subject: [PATCH 055/251] Added support for integration tests --- Makefile | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index dcfee864..0e22eee5 100644 --- a/Makefile +++ b/Makefile @@ -20,10 +20,18 @@ DOCKER_RELEASE_TAG_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"con DOCKER_RELEASE_TAG_VAULTENV := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"vaultenv-"/""/g) DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"ca-bundle-controller-"/""/g) +TAG= + +# Used for integration tests +AKV2K8S_CLIENT_ID= +AKV2K8S_CLIENT_SECRET= +AKV2K8S_CLIENT_TENANT_ID= +# AKV2K8S_AZURE_SUBSCRIPTION= + BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") VCS_URL := https://$(PACKAGE) -.PHONY: run-docs-dev build build-controller build-webhook build-auth-service build-vaultenv build-akv2k8s-env-test test push push-controller push-webhook push-auth-service push-vaultenv push-akv2k8s-env-test pull-release release release-controller release-webhook release-auth-service release-vaultenv +.PHONY: check-tag run-docs-dev build build-controller build-webhook build-auth-service build-vaultenv build-akv2k8s-env-test test push push-controller push-webhook push-auth-service push-vaultenv push-akv2k8s-env-test pull-release release release-controller release-webhook release-auth-service release-vaultenv print-v-webhook: @echo $(DOCKER_RELEASE_TAG_WEBHOOK) @@ -37,6 +45,29 @@ print-v-vaultenv: print-v-ca-bundle-controller: @echo $(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) +tag-all: tag-webhook tag-controller tag-ca-bundle-controller tag-vaultenv + +tag-webhook: check-tag + git tag -a webhook-$(TAG) -m "Webhook version $(TAG)" + git push --tags + +tag-controller: check-tag + git tag -a controller-$(TAG) -m "Controller version $(TAG)" + git push --tags + +tag-ca-bundle-controller: check-tag + git tag -a ca-bundle-controller-$(TAG) -m "CA Bundle Controller version $(TAG)" + git push --tags + +tag-vaultenv: check-tag + git tag -a vaultenv-$(TAG) -m "Vaultenv version $(TAG)" + git push --tags + +check-tag: +ifndef TAG + $(error TAG is undefined) +endif + docs-install-dev: cd ./docs && npm install @@ -61,6 +92,20 @@ codegen: test: fmtcheck CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/) +init-int-test: + $(eval azure_client_id := $(shell az keyvault secret show --name int-test-azure-client-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION) --output tsv --query 'value')) + $(eval azure_client_secret := $(shell az keyvault secret show --name int-test-azure-client-secret --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION) --output tsv --query 'value')) + $(eval azure_tenant_id := $(shell az keyvault secret show --name int-test-azure-tenant-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION) --output tsv --query 'value')) + + AKV2K8S_CLIENT_ID=$(azure_client_id) + AKV2K8S_CLIENT_SECRET=$(azure_client_secret) + AKV2K8S_CLIENT_TENANT_ID=$(azure_tenant_id) + +int-test-local: fmtcheck init-int-test int-test + +int-test: + CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/) + build-local: fmtcheck CGO_ENABLED=0 go build -v $(shell go list ./...) From 8ee6fc2e3ee8ff9f5d376ad6cdbe89e0192e5e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 27 Aug 2020 21:09:43 +0200 Subject: [PATCH 056/251] Fix issue with incorrect audience - not keyvault --- cmd/azure-keyvault-controller/main.go | 11 +- cmd/azure-keyvault-secrets-webhook/main.go | 12 +- .../registry.go | 15 ++- .../container-injection-log-level.md | 0 pkg/azure/credential.go | 114 +++++++++++++----- pkg/azure/credential_test.go | 106 +++++++++++++--- 6 files changed, 210 insertions(+), 48 deletions(-) delete mode 100644 docs/source/content/troubleshooting/container-injection-log-level.md diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 7b9ede32..6ca07c5d 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -124,7 +124,16 @@ func main() { log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) } } else { - cloudCnfProvider := azure.NewFromCloudConfig(&cloudconfig) + f, err := os.Open(cloudconfig) + if err != nil { + log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) + } + defer f.Close() + + cloudCnfProvider, err := azure.NewFromCloudConfig(f) + if err != nil { + log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) + } if vaultAuth, err = cloudCnfProvider.GetCredentials(); err != nil { log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 288f4217..5ae53d82 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -254,7 +254,17 @@ func main() { log.Fatal(err) } } else { - cloudCnfProvider := azure.NewFromCloudConfig(&config.cloudConfigHostPath) + f, err := os.Open(config.cloudConfigHostPath) + if err != nil { + log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) + } + defer f.Close() + + cloudCnfProvider, err := azure.NewFromCloudConfig(f) + if err != nil { + log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) + } + config.credentials, err = cloudCnfProvider.GetCredentials() if err != nil { log.Fatal(err) diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index c0957cab..33030f27 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -22,6 +22,7 @@ import ( "encoding/base64" "encoding/json" "fmt" + "os" "strings" "time" @@ -180,7 +181,19 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) return types.DockerAuthConfig{}, false } - cloudCnfProvider := azure.NewFromCloudConfig(&config.cloudConfigHostPath) + f, err := os.Open(config.cloudConfigHostPath) + if err != nil { + log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) + return types.DockerAuthConfig{}, false + } + defer f.Close() + + cloudCnfProvider, err := azure.NewFromCloudConfig(f) + if err != nil { + log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) + return types.DockerAuthConfig{}, false + } + dockerConfList, err := cloudCnfProvider.GetAcrCredentials(image) if err != nil { return types.DockerAuthConfig{}, false diff --git a/docs/source/content/troubleshooting/container-injection-log-level.md b/docs/source/content/troubleshooting/container-injection-log-level.md deleted file mode 100644 index e69de29b..00000000 diff --git a/pkg/azure/credential.go b/pkg/azure/credential.go index e593e7c3..15b8959a 100644 --- a/pkg/azure/credential.go +++ b/pkg/azure/credential.go @@ -24,7 +24,6 @@ import ( "fmt" "io" "io/ioutil" - "os" "regexp" "strings" @@ -58,7 +57,6 @@ type DockerConfig map[string]docker.DockerAuthConfig // CloudConfigProvider provides credentials for Azure type CloudConfigProvider struct { - file *string config *auth.AzureAuthConfig environment *azure.Environment servicePrincipalToken *adal.ServicePrincipalToken @@ -89,18 +87,23 @@ type crendentialsToken struct { } // NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider -func NewFromCloudConfig(configFile *string) *CloudConfigProvider { - token, config, env, err := getServicePrincipalTokenFromCloudConfig(configFile) - +func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { + authSettings, err := azureAuth.GetSettingsFromEnvironment() if err != nil { + return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) + } + + token, config, err := getServicePrincipalTokenFromCloudConfig(configReader, authSettings.Environment) + if err != nil { + return nil, err } + return &CloudConfigProvider{ - file: configFile, config: config, - environment: env, + environment: &authSettings.Environment, servicePrincipalToken: token, - } + }, nil } // NewFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault @@ -293,24 +296,84 @@ func (c OAuthCredentials) Endpoint(keyVaultName string) string { return fmt.Sprintf(c.EndpointPartial, keyVaultName) } -func getServicePrincipalTokenFromCloudConfig(cloudConfigPath *string) (*adal.ServicePrincipalToken, *auth.AzureAuthConfig, *azure.Environment, error) { - f, err := os.Open(*cloudConfigPath) +func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.Environment) (*adal.ServicePrincipalToken, *auth.AzureAuthConfig, error) { + config, err := ParseConfig(configReader) if err != nil { - return nil, nil, nil, err + return nil, nil, fmt.Errorf("failed reading cloud config, error: %+v", err) } - defer f.Close() - config, env, err := ParseConfig(f) + if config.UseManagedIdentityExtension { + // klog.V(2).Infoln("azure: using managed identity extension to retrieve access token") + msiEndpoint, err := adal.GetMSIVMEndpoint() + if err != nil { + return nil, nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) + } + + if len(config.UserAssignedIdentityID) > 0 { + // klog.V(4).Info("azure: using User Assigned MSI ID to retrieve access token") + token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, + env.ResourceIdentifiers.KeyVault, + config.UserAssignedIdentityID) + + return token, config, err + } + // klog.V(4).Info("azure: using System Assigned MSI to retrieve access token") + token, err := adal.NewServicePrincipalTokenFromMSI( + msiEndpoint, + env.ResourceIdentifiers.KeyVault) + + return token, config, err + } + + oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) if err != nil { - return nil, nil, nil, fmt.Errorf("failed reading cloud config, error: %+v", err) + return nil, nil, fmt.Errorf("creating the OAuth config: %v", err) } - token, err := auth.GetServicePrincipalToken(config, env) - return token, config, env, err + if len(config.AADClientSecret) > 0 { + // klog.V(2).Infoln("azure: using client_id+client_secret to retrieve access token") + token, err := adal.NewServicePrincipalToken( + *oauthConfig, + config.AADClientID, + config.AADClientSecret, + env.ResourceIdentifiers.KeyVault) + + return token, config, err + } + + if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 { + // klog.V(2).Infoln("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") + certData, err := ioutil.ReadFile(config.AADClientCertPath) + if err != nil { + return nil, nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) + } + certificate, privateKey, err := decodePkcs12(certData, config.AADClientCertPassword) + if err != nil { + return nil, nil, fmt.Errorf("decoding the client certificate: %v", err) + } + token, err := adal.NewServicePrincipalTokenFromCertificate( + *oauthConfig, + config.AADClientID, + certificate, + privateKey, + env.ResourceIdentifiers.KeyVault) + return token, config, err + } + + return nil, nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID) } func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) { - err := token.Refresh() + authSettings, err := azureAuth.GetSettingsFromEnvironment() + if err != nil { + return nil, err + } + + if token.Token().Resource != authSettings.Environment.KeyVaultEndpoint { + err = token.RefreshExchange(authSettings.Environment.KeyVaultEndpoint) + } else { + err = token.Refresh() + } if err != nil { return nil, err } @@ -323,32 +386,27 @@ func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) { } // ParseConfig returns a parsed configuration for an Azure cloudprovider config file -func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, *azure.Environment, error) { +func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, error) { var config auth.AzureAuthConfig if configReader == nil { - return &config, nil, nil + return &config, nil } limitedReader := &io.LimitedReader{R: configReader, N: maxReadLength} configContents, err := ioutil.ReadAll(limitedReader) if err != nil { - return nil, nil, err + return nil, err } if limitedReader.N <= 0 { - return nil, nil, errors.New("the read limit is reached") + return nil, errors.New("the read limit is reached") } err = yaml.Unmarshal(configContents, &config) if err != nil { - return nil, nil, err - } - - environment, err := auth.ParseAzureEnvironment(config.Cloud) - if err != nil { - return nil, nil, err + return nil, err } - return &config, environment, nil + return &config, nil } func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { diff --git a/pkg/azure/credential_test.go b/pkg/azure/credential_test.go index b975c220..c9788628 100644 --- a/pkg/azure/credential_test.go +++ b/pkg/azure/credential_test.go @@ -17,7 +17,9 @@ limitations under the License. package azure import ( + "fmt" "os" + "strings" "testing" "github.com/Azure/go-autorest/autorest/azure" @@ -45,28 +47,28 @@ func ensureIntegrationEnvironment(t *testing.T) { os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID")) } -// func TestChinaCloud(t *testing.T) { -// ensureIntegrationEnvironment(t) +func TestChinaCloud(t *testing.T) { + ensureIntegrationEnvironment(t) -// os.Setenv("AZURE_ENVIRONMENT", "AzureChinaCloud") + os.Setenv("AZURE_ENVIRONMENT", "AzureChinaCloud") -// creds, err := NewAzureKeyVaultCredentialsFromEnvironment() -// if err != nil { -// t.Error(err) -// } + creds, err := NewFromEnvironment() + if err != nil { + t.Error(err) + } -// token := creds.(*azureKeyVaultCredentials).Token -// err = token.Refresh() -// if err != nil { -// t.Error(err) -// } + token := creds.(*credentials).Token + err = token.Refresh() + if err != nil { + t.Error(err) + } -// if token.Token().Resource != azure.ChinaCloud.ResourceIdentifiers.KeyVault { -// t.Errorf("Endpoint incorrect. Expected '%s', but got '%s'", azure.ChinaCloud.ResourceIdentifiers.KeyVault, token.Token().Resource) -// } -// } + if token.Token().Resource != azure.ChinaCloud.ResourceIdentifiers.KeyVault { + t.Errorf("Endpoint incorrect. Expected '%s', but got '%s'", azure.ChinaCloud.ResourceIdentifiers.KeyVault, token.Token().Resource) + } +} -func TestAudience(t *testing.T) { +func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { ensureIntegrationEnvironment(t) creds, err := NewFromEnvironment() @@ -75,6 +77,7 @@ func TestAudience(t *testing.T) { } token := creds.(*credentials).Token + t.Logf("%s", creds.Endpoint("test")) err = token.Refresh() if err != nil { t.Error(err) @@ -84,3 +87,72 @@ func TestAudience(t *testing.T) { t.Error() } } + +func TestIntegrationAuthFromConfigAudience(t *testing.T) { + ensureIntegrationEnvironment(t) + + tenantId := os.Getenv("AZURE_TENANT_ID") + subscriptionId := "0967fd64-a807-47e1-bf05-0e55e24a68d5" + clientId := os.Getenv("AZURE_CLIENT_ID") + clientSecret := os.Getenv("AZURE_CLIENT_SECRET") + + config := fmt.Sprintf(`{ + "cloud":"AzurePublicCloud", + "tenantId": "%s", + "subscriptionId": "%s", + "aadClientId": "%s", + "aadClientSecret": "%s", + "resourceGroup": "", + "location": "westeurope", + "vmType": "vmss", + "subnetName": "", + "securityGroupName": "", + "vnetName": "", + "vnetResourceGroup": "", + "routeTableName": "", + "primaryAvailabilitySetName": "", + "primaryScaleSetName": "", + "cloudProviderBackoffMode": "v2", + "cloudProviderBackoff": true, + "cloudProviderBackoffRetries": 6, + "cloudProviderBackoffDuration": 5, + "cloudProviderRatelimit": true, + "cloudProviderRateLimitQPS": 10, + "cloudProviderRateLimitBucket": 100, + "cloudProviderRatelimitQPSWrite": 10, + "cloudProviderRatelimitBucketWrite": 100, + "useManagedIdentityExtension": false, + "userAssignedIdentityID": "", + "useInstanceMetadata": true, + "loadBalancerSku": "Standard", + "disableOutboundSNAT": false, + "excludeMasterFromStandardLB": true, + "providerVaultName": "", + "maximumLoadBalancerRuleCount": 250, + "providerKeyName": "k8s", + "providerKeyVersion": "" +}`, tenantId, subscriptionId, clientId, clientSecret) + + r := strings.NewReader(config) + + conf, err := NewFromCloudConfig(r) + if err != nil { + t.Error(err) + } + + creds, err := conf.GetCredentials() + if err != nil { + t.Error(err) + } + + token := creds.(*credentials).Token + t.Logf("%s", creds.Endpoint("test")) + err = token.Refresh() + if err != nil { + t.Error(err) + } + + if token.Token().Resource != azure.PublicCloud.ResourceIdentifiers.KeyVault { + t.Errorf("expected resource uri '%s', got '%s'", azure.PublicCloud.ResourceIdentifiers.KeyVault, token.Token().Resource) + } +} From 69a226cc5eac8a01478e01b7c64701b19507ab08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 27 Aug 2020 23:37:55 +0200 Subject: [PATCH 057/251] Minor cleanup --- Makefile | 5 +---- cmd/azure-keyvault-secrets-webhook/main.go | 16 ++++++++-------- go.mod | 2 -- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 0e22eee5..7070765c 100644 --- a/Makefile +++ b/Makefile @@ -101,10 +101,7 @@ init-int-test: AKV2K8S_CLIENT_SECRET=$(azure_client_secret) AKV2K8S_CLIENT_TENANT_ID=$(azure_tenant_id) -int-test-local: fmtcheck init-int-test int-test - -int-test: - CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/) +int-test-local: fmtcheck init-int-test test build-local: fmtcheck CGO_ENABLED=0 go build -v $(shell go list ./...) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 5ae53d82..724c9828 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -230,16 +230,16 @@ func main() { } log.Info("Active settings:") - log.Infof("Webhook port : %s", config.port) - log.Infof("Serve metrics : %t", config.serveMetrics) - log.Infof("Use custom auth : %t", config.customAuth) - log.Infof("Use auth service : %t", config.useAuthService) + log.Infof(" Webhook port : %s", config.port) + log.Infof(" Serve metrics : %t", config.serveMetrics) + log.Infof(" Use custom auth : %t", config.customAuth) + log.Infof(" Use auth service : %t", config.useAuthService) if config.useAuthService { - log.Infof("Auth service name : %s", config.authServiceName) - log.Infof("Auth service port :%s", config.authServicePort) + log.Infof(" Auth service name : %s", config.authServiceName) + log.Infof(" Auth service port : %s", config.authServicePort) } - log.Infof("CA ConfigMap name : %s", config.caBundleConfigMapName) - log.Infof("Cloud config path : %s", config.cloudConfigHostPath) + log.Infof(" CA ConfigMap name : %s", config.caBundleConfigMapName) + log.Infof(" Cloud config path : %s", config.cloudConfigHostPath) mutator := mutating.MutatorFunc(vaultSecretsMutator) metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer) diff --git a/go.mod b/go.mod index 752ef669..6bde85e1 100644 --- a/go.mod +++ b/go.mod @@ -25,8 +25,6 @@ require ( k8s.io/api v0.17.9 k8s.io/apimachinery v0.17.9 k8s.io/client-go v0.17.9 - k8s.io/klog v1.0.0 - k8s.io/kubernetes v1.13.0 k8s.io/legacy-cloud-providers v0.17.9 sigs.k8s.io/yaml v1.2.0 ) From b5bc22485d1f82c1e9f4581b0b0920c29e1d993f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 28 Aug 2020 10:53:45 +0200 Subject: [PATCH 058/251] Downgraded to Kubernetes 1.15.11 --- go.mod | 14 +++---- go.sum | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 6bde85e1..038a204b 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.13 require ( github.com/Azure/azure-sdk-for-go v40.5.0+incompatible - github.com/Azure/go-autorest/autorest v0.10.0 - github.com/Azure/go-autorest/autorest/adal v0.8.2 + github.com/Azure/go-autorest/autorest v0.11.4 + github.com/Azure/go-autorest/autorest/adal v0.9.0 github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 github.com/Azure/go-autorest/autorest/to v0.3.0 // indirect github.com/Azure/go-autorest/autorest/validation v0.2.0 // indirect @@ -19,12 +19,12 @@ require ( github.com/slok/kubewebhook v0.4.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.4.0 - golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 gonum.org/v1/gonum v0.8.1 // indirect gopkg.in/yaml.v2 v2.2.8 - k8s.io/api v0.17.9 - k8s.io/apimachinery v0.17.9 - k8s.io/client-go v0.17.9 - k8s.io/legacy-cloud-providers v0.17.9 + k8s.io/api v0.15.11 + k8s.io/apimachinery v0.15.11 + k8s.io/client-go v0.15.11 + k8s.io/legacy-cloud-providers v0.15.11 sigs.k8s.io/yaml v1.2.0 ) diff --git a/go.sum b/go.sum index d3265212..a42cb771 100644 --- a/go.sum +++ b/go.sum @@ -3,20 +3,29 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= +github.com/Azure/azure-sdk-for-go v21.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible h1:CVQNKuUepSFBo6BW6gM1J9slPHLRcjn6vaw+j+causw= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v11.1.2+incompatible h1:viZ3tV5l4gE2Sw0xrasFHytCGtzYCrT+um/rrSQ1BfA= +github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.4 h1:iWJqGEvip7mjibEqC/srXNdo+4wLEPiwlP/7dZLtoPc= +github.com/Azure/go-autorest/autorest v0.11.4/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0 h1:SigMbuFNuKgc1xcGhaeapbh+8fgsu+GxgDRFyg7f5lM= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= @@ -24,10 +33,13 @@ github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9 github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= @@ -36,11 +48,16 @@ github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOL github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/k8s-cloud-provider v0.0.0-20181220005116-f8e995905100/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -114,6 +131,7 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= 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= @@ -135,6 +153,7 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -146,15 +165,20 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -164,6 +188,8 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1 h1:wSt/4CYxs70xbATrGXhokKF1i0tZjENLOo1ioIO13zk= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -185,6 +211,7 @@ github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tF github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -198,6 +225,8 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/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= @@ -206,12 +235,26 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= 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 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= 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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= @@ -227,6 +270,9 @@ github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsC github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -238,6 +284,7 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -264,11 +311,14 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= @@ -286,6 +336,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= @@ -298,6 +349,7 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -335,6 +387,7 @@ github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -372,6 +425,7 @@ github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BU github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9 h1:kyf9snWXHvQc+yxE9imhdI8YAm4oKeZISlaAR+x73zs= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= 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.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= @@ -379,15 +433,18 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 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.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/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.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= @@ -456,6 +513,7 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE= +github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -475,6 +533,7 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -485,6 +544,8 @@ golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBux golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -504,6 +565,7 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r 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-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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -517,12 +579,18 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL 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 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc h1:gkKoSkUmnU6bpS/VhkuO27bzQeSA51uaEfbOW5dNb68= +golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -550,15 +618,23 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdO golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867 h1:JoRuNIf+rpHl+VhScRQQvzbHed86tKkqwPMV34T8myw= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= @@ -582,6 +658,7 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 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= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485 h1:OB/uP/Puiu5vS5QMRPrXCDWUPb+kt8f1KW8oQzFejQw= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= @@ -590,6 +667,7 @@ gonum.org/v1/gonum v0.8.1/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -605,6 +683,8 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBm google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +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.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -614,6 +694,18 @@ google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +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.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= @@ -624,6 +716,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= @@ -647,6 +740,8 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b h1:38Nx0U83WjBqn1hUWxlgKc7mvH7WhyHfypxeW3zWwCQ= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.15.11 h1:aw1gBdi7fq5LODyqKtJLE+2Gg5arV0UZp684GyB+6Ak= +k8s.io/api v0.15.11/go.mod h1:DI3kWWWBG0byhZ4druNYQvleDRhbocPrm+Glq4xVpkM= k8s.io/api v0.17.9 h1:BA/U8qtSNzx7BbmQy3lODbCxVMKGNUpBJ2fjsKt6OOY= k8s.io/api v0.17.9/go.mod h1:avJJAA1fSV6tnbCGW2K+S+ilDFW7WpNr5BScoiZ1M1U= k8s.io/api v0.18.0 h1:lwYk8Vt7rsVTwjRU6pzEsa9YNhThbmbocQlKvNBB4EQ= @@ -655,8 +750,12 @@ k8s.io/api v0.18.3 h1:2AJaUQdgUZLoDZHrun21PW2Nx9+ll6cUzvn3IKhSIn0= k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= k8s.io/api v0.18.8 h1:aIKUzJPb96f3fKec2lxtY7acZC9gQNDLVhfSGpxBAC4= k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= +k8s.io/api v0.19.0 h1:XyrFIJqTYZJ2DU7FBE/bSPz7b1HvbVBuBf07oeo6eTc= +k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a h1:lDydUqHrbL/1l5ZQrqD1RIlabhmX8aiZEtxVUb+30iU= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.15.11 h1:CMtikEzqbN2dgCHcn1fAAJ4INE8DgIuzN8EC60nUHjM= +k8s.io/apimachinery v0.15.11/go.mod h1:ZRw+v83FjgEqlzqaBkxL3XB21MSLYdzjsY9Bgxclhdw= k8s.io/apimachinery v0.17.9 h1:knQxNgMu57Oxlm12J6DS375kmGMeuWV0VNzRRUBB2Yk= k8s.io/apimachinery v0.17.9/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= k8s.io/apimachinery v0.18.0 h1:fuPfYpk3cs1Okp/515pAf0dNhL66+8zk8RLbSX+EgAE= @@ -665,6 +764,8 @@ k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= k8s.io/apimachinery v0.18.8 h1:jimPrycCqgx2QPearX3to1JePz7wSbVLq+7PdBTTwQ0= k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= +k8s.io/apimachinery v0.19.0 h1:gjKnAda/HZp5k4xQYjL0K/Yb66IvNqjthCb03QlKpaQ= +k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apiserver v0.17.9/go.mod h1:Qaxd3EbeoPRBHVMtFyuKNAObqP6VAkzIMyWYz8KuE2k= k8s.io/apiserver v0.18.0 h1:ELAWpGWC6XdbRLi5lwAbEbvksD7hkXxPdxaJsdpist4= k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= @@ -673,6 +774,8 @@ k8s.io/client-go v0.0.0-20170217214107-bcde30fb7eae/go.mod h1:7vJpHMYJwNQCWgzmNV k8s.io/client-go v0.0.0-20190817222206-ee6c071a42cf/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7 h1:WyPHgjjXvF4zVVwKGZKKiJGBUW45AuN44uSOuH8euuE= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.15.11 h1:yujXordVnH33fhe1bddPnFWsGfl0Gq6FyZ335TC3qk4= +k8s.io/client-go v0.15.11/go.mod h1:gkprEfouvgHvzeCvwwz2T8MTlfNuZn8vluW8orojRKI= k8s.io/client-go v0.17.9 h1:qUPhohX4bUBx0L7pfye02aPnu3PQ0t+B8dqHfGvt++k= k8s.io/client-go v0.17.9/go.mod h1:3cM92qAd1XknA5IRkRfpJhl9OQjkYy97ZEUio70wVnI= k8s.io/client-go v0.18.0 h1:yqKw4cTUQraZK3fcVCMeSa+lqKwcjZ5wtcOIPnxQno4= @@ -682,6 +785,7 @@ k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= k8s.io/client-go v0.18.8 h1:SdbLpIxk5j5YbFr1b7fq8S7mDgDjYmUxSbszyoesoDM= k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= +k8s.io/cloud-provider v0.15.11/go.mod h1:ZmKzHyUA3/7CoogzbGwVHPEKvHKmcCyNv5t3XsR2Ju8= k8s.io/cloud-provider v0.17.9/go.mod h1:yjQQgdWmd3sYNMzraq49mbABlegaptBBB9OEnRXHRbY= k8s.io/cloud-provider v0.18.8/go.mod h1:cn9AlzMPVIXA4HHLVbgGUigaQlZyHSZ7WAwDEFNrQSs= k8s.io/code-generator v0.17.9 h1:gJ/y22bRtF0pTzdAaEgfnrzUDJi19SdD8wock9TP4Ik= @@ -693,6 +797,7 @@ k8s.io/component-base v0.17.9/go.mod h1:Wg22ePDK0mfTa+bEFgZHGwr0h40lXnYy6D7D+f7i k8s.io/component-base v0.18.0 h1:I+lP0fNfsEdTDpHaL61bCAqTZLoiWjEEP304Mo5ZQgE= k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= k8s.io/component-base v0.18.8/go.mod h1:00frPRDas29rx58pPCxNkhUfPbwajlyyvu8ruNgSErU= +k8s.io/csi-translation-lib v0.15.11/go.mod h1:3GXSymXac3TVZgJlWXDdStD1xbiIi8m9rGrW7TNV0a8= k8s.io/csi-translation-lib v0.17.9/go.mod h1:wDkbibpo06FClp/OWvaMFpUWf/ogmUYBLSzGqnaTZ3w= k8s.io/csi-translation-lib v0.18.8/go.mod h1:6cA6Btlzxy9s3QrS4BCZzQqclIWnTLr6Jx3H2ctAzY4= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= @@ -701,10 +806,17 @@ k8s.io/gengo v0.0.0-20190822140433-26a664648505 h1:ZY6yclUKVbZ+SdWnkfY+Je5vrMpKO k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 h1:RPscN6KhmG54S33L+lr3GS+oD1jmchIU0ll519K6FA4= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30 h1:TRb4wNWoBVrH9plmkp2q86FIDppkbrEXdXlxU3a3BMI= +k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe h1:GOfbcWvX5wW2vcfNch83xYp9SDZjRgAJk+t373yaHKk= k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= @@ -712,16 +824,22 @@ k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOEC k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/kubernetes v1.13.11 h1:PuVgT0kD6Aah8XnJpcG4ngzJ/pjbJNam15MflwUn5Lc= k8s.io/kubernetes v1.13.11/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.15.11 h1:k9NXQK1LCGq7O1Gqu0Yzj+MkYN/SK1qg/L4VkDEsbFg= +k8s.io/legacy-cloud-providers v0.15.11/go.mod h1:UVtftPy4w6uuEPl1jvT5G4zASTgv/UKu4LQgxT913EI= k8s.io/legacy-cloud-providers v0.17.9 h1:UjJfTJYmT7z+WzJ6EHwbZFfwNuqKxMvcZ+R7pq95AQM= k8s.io/legacy-cloud-providers v0.17.9/go.mod h1:6FdEAYK7AlGetm4ulIQ8uZMqkcu02Mv8Z0Z3theL9Rc= k8s.io/legacy-cloud-providers v0.18.8 h1:IGASZSYJjkMk5d1HU9+zskZqoRG3zccVzvA3hV7hCL0= k8s.io/legacy-cloud-providers v0.18.8/go.mod h1:tgp4xYf6lvjrWnjQwTOPvWQE9IVqSBGPF4on0IyICQE= k8s.io/sample-controller v0.18.3 h1:SQZ5w15wmZ2gSGxHnMj9n4OQyHjzTkSMtRfOAxvBMLU= k8s.io/sample-controller v0.18.3/go.mod h1:jH/zaO86WF7aGg0KzqxcAJ133tmBU9X5s2C6W3yU+4Y= +k8s.io/utils v0.0.0-20190221042446-c2654d5206da h1:ElyM7RPonbKnQqOcw7dG2IK5uvQQn3b/WPHqD5mBvP4= +k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= @@ -737,6 +855,8 @@ sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7m sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= From 9b536920f144ddf935cbba78f26ce25a56fbe20e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 28 Aug 2020 10:54:21 +0200 Subject: [PATCH 059/251] Disabled test for China cloud --- pkg/azure/credential_test.go | 39 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/pkg/azure/credential_test.go b/pkg/azure/credential_test.go index c9788628..4b533c24 100644 --- a/pkg/azure/credential_test.go +++ b/pkg/azure/credential_test.go @@ -45,28 +45,29 @@ func ensureIntegrationEnvironment(t *testing.T) { os.Setenv("AZURE_CLIENT_ID", os.Getenv("AKV2K8S_CLIENT_ID")) os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET")) os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID")) + os.Setenv("AZURE_SUBSCRIPTION_ID", os.Getenv("AKV2K8S_AZURE_SUBSCRIPTION_ID")) } -func TestChinaCloud(t *testing.T) { - ensureIntegrationEnvironment(t) +// func TestChinaCloud(t *testing.T) { +// ensureIntegrationEnvironment(t) - os.Setenv("AZURE_ENVIRONMENT", "AzureChinaCloud") +// os.Setenv("AZURE_ENVIRONMENT", "AzureChinaCloud") - creds, err := NewFromEnvironment() - if err != nil { - t.Error(err) - } +// creds, err := NewFromEnvironment() +// if err != nil { +// t.Error(err) +// } - token := creds.(*credentials).Token - err = token.Refresh() - if err != nil { - t.Error(err) - } +// token := creds.(*credentials).Token +// err = token.Refresh() +// if err != nil { +// t.Error(err) +// } - if token.Token().Resource != azure.ChinaCloud.ResourceIdentifiers.KeyVault { - t.Errorf("Endpoint incorrect. Expected '%s', but got '%s'", azure.ChinaCloud.ResourceIdentifiers.KeyVault, token.Token().Resource) - } -} +// if token.Token().Resource != azure.ChinaCloud.ResourceIdentifiers.KeyVault { +// t.Errorf("Endpoint incorrect. Expected '%s', but got '%s'", azure.ChinaCloud.ResourceIdentifiers.KeyVault, token.Token().Resource) +// } +// } func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { ensureIntegrationEnvironment(t) @@ -77,14 +78,13 @@ func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { } token := creds.(*credentials).Token - t.Logf("%s", creds.Endpoint("test")) err = token.Refresh() if err != nil { t.Error(err) } if token.Token().Resource != azure.PublicCloud.ResourceIdentifiers.KeyVault { - t.Error() + t.Errorf("expected resource uri '%s', got '%s'", azure.PublicCloud.ResourceIdentifiers.KeyVault, token.Token().Resource) } } @@ -92,7 +92,7 @@ func TestIntegrationAuthFromConfigAudience(t *testing.T) { ensureIntegrationEnvironment(t) tenantId := os.Getenv("AZURE_TENANT_ID") - subscriptionId := "0967fd64-a807-47e1-bf05-0e55e24a68d5" + subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID") clientId := os.Getenv("AZURE_CLIENT_ID") clientSecret := os.Getenv("AZURE_CLIENT_SECRET") @@ -146,7 +146,6 @@ func TestIntegrationAuthFromConfigAudience(t *testing.T) { } token := creds.(*credentials).Token - t.Logf("%s", creds.Endpoint("test")) err = token.Refresh() if err != nil { t.Error(err) From bf1732ee331ef08cf0cad8662af9785c0dab3281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 28 Aug 2020 10:55:12 +0200 Subject: [PATCH 060/251] Generated new libs with version 1.15.11 of Kubernetes --- pkg/k8s/client/clientset/versioned/clientset.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index 59aa523e..fc4d062c 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -22,8 +22,6 @@ limitations under the License. package versioned import ( - "fmt" - azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" discovery "k8s.io/client-go/discovery" @@ -64,14 +62,9 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { } // NewForConfig creates a new Clientset for the given config. -// If config's RateLimiter is not set and QPS and Burst are acceptable, -// NewForConfig will generate a rate-limiter in configShallowCopy. func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { - if configShallowCopy.Burst <= 0 { - return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") - } configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) } var cs Clientset From d4b0c417c1f7ff5026ee75f2df557e3aa0ab6556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 28 Aug 2020 10:55:52 +0200 Subject: [PATCH 061/251] Enabled integration tests and pass on credentials to use with Azure Key Vault --- Makefile | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 7070765c..0f3bd08f 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ PACKAGE=github.com/SparebankenVest/azure-key-vault-to-kubernetes -KUBERNETES_VERSION=v1.17.9 -KUBERNETES_DEP_VERSION=v0.17.9 +KUBERNETES_VERSION=v1.15.11 +KUBERNETES_DEP_VERSION=v0.15.11 DOCKER_INTERNAL_REG=dokken.azurecr.io DOCKER_RELEASE_REG=spvest @@ -22,16 +22,10 @@ DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | TAG= -# Used for integration tests -AKV2K8S_CLIENT_ID= -AKV2K8S_CLIENT_SECRET= -AKV2K8S_CLIENT_TENANT_ID= -# AKV2K8S_AZURE_SUBSCRIPTION= - BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") VCS_URL := https://$(PACKAGE) -.PHONY: check-tag run-docs-dev build build-controller build-webhook build-auth-service build-vaultenv build-akv2k8s-env-test test push push-controller push-webhook push-auth-service push-vaultenv push-akv2k8s-env-test pull-release release release-controller release-webhook release-auth-service release-vaultenv +.PHONY: int-test-init int-test-local check-tag run-docs-dev build build-controller build-webhook build-auth-service build-vaultenv build-akv2k8s-env-test test push push-controller push-webhook push-auth-service push-vaultenv push-akv2k8s-env-test pull-release release release-controller release-webhook release-auth-service release-vaultenv print-v-webhook: @echo $(DOCKER_RELEASE_TAG_WEBHOOK) @@ -90,18 +84,15 @@ codegen: ./hack/update-codegen.sh test: fmtcheck - CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/) + @CGO_ENABLED=0 AKV2K8S_CLIENT_ID=$(AKV2K8S_CLIENT_ID) AKV2K8S_CLIENT_SECRET=$(AKV2K8S_CLIENT_SECRET) AKV2K8S_CLIENT_TENANT_ID=$(AKV2K8S_CLIENT_TENANT_ID) AKV2K8S_AZURE_SUBSCRIPTION_ID=$(AKV2K8S_AZURE_SUBSCRIPTION_ID) go test -count=1 -v $(shell go list ./... | grep -v /pkg/k8s/) -init-int-test: - $(eval azure_client_id := $(shell az keyvault secret show --name int-test-azure-client-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION) --output tsv --query 'value')) - $(eval azure_client_secret := $(shell az keyvault secret show --name int-test-azure-client-secret --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION) --output tsv --query 'value')) - $(eval azure_tenant_id := $(shell az keyvault secret show --name int-test-azure-tenant-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION) --output tsv --query 'value')) +init-int-test-local: + $(eval AKV2K8S_CLIENT_ID ?= $(shell az keyvault secret show --name int-test-azure-client-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value')) + $(eval AKV2K8S_CLIENT_SECRET ?= $(shell az keyvault secret show --name int-test-azure-client-secret --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value')) + $(eval AKV2K8S_CLIENT_TENANT_ID ?= $(shell az keyvault secret show --name int-test-azure-tenant-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value')) - AKV2K8S_CLIENT_ID=$(azure_client_id) - AKV2K8S_CLIENT_SECRET=$(azure_client_secret) - AKV2K8S_CLIENT_TENANT_ID=$(azure_tenant_id) +int-test-local: init-int-test-local test -int-test-local: fmtcheck init-int-test test build-local: fmtcheck CGO_ENABLED=0 go build -v $(shell go list ./...) From 3ead82760c79b7df889f9029179e441d4b2002d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 28 Aug 2020 11:01:24 +0200 Subject: [PATCH 062/251] Pass on secrets properly --- .github/workflows/ca-bundle-controller-build.yaml | 10 +++++----- .github/workflows/controller-build.yaml | 8 ++++---- .github/workflows/vaultenv-build.yaml | 8 ++++---- .github/workflows/webhook-build.yaml | 8 ++++---- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index 4b5d3986..5e63114e 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -28,15 +28,15 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID - AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET - AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID - AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION + AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-ca-bundle-controller - - name: Push + - name: Push}} uses: ./.github/actions/push with: push-make-action: push-ca-bundle-controller diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index 271ed467..5c949bcb 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -28,10 +28,10 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID - AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET - AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID - AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION + AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-controller diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index 2114f159..af4db3dc 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -28,10 +28,10 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID - AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET - AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID - AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION + AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-vaultenv diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index 1397635d..aba7fe97 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -28,10 +28,10 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: secret.INT_TEST_CLIENT_ID - AKV2K8S_CLIENT_SECRET: secret.INT_TEST_CLIENT_SECRET - AKV2K8S_CLIENT_TENANT_ID: secret.INT_TEST_TENANT_ID - AKV2K8S_AZURE_SUBSCRIPTION: secret.INT_TEST_SUBSCRIPTION + AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-webhook From 6597272d7b9e34fb06cc67ea9e075e735e926e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 28 Aug 2020 11:02:56 +0200 Subject: [PATCH 063/251] Using secrets in GitHub Actions and NOT secret (plural) --- .github/workflows/ca-bundle-controller-build.yaml | 8 ++++---- .github/workflows/controller-build.yaml | 8 ++++---- .github/workflows/vaultenv-build.yaml | 8 ++++---- .github/workflows/webhook-build.yaml | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index 5e63114e..4092088f 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -28,10 +28,10 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} - AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} - AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} - AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} + AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-ca-bundle-controller diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index 5c949bcb..933b1a0a 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -28,10 +28,10 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} - AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} - AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} - AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} + AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-controller diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index af4db3dc..77c2fb77 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -28,10 +28,10 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} - AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} - AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} - AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} + AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-vaultenv diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index aba7fe97..5a0eee1a 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -28,10 +28,10 @@ jobs: - name: Build uses: ./.github/actions/build env: - AKV2K8S_CLIENT_ID: ${{ secret.INT_TEST_CLIENT_ID }} - AKV2K8S_CLIENT_SECRET: ${{ secret.INT_TEST_CLIENT_SECRET }} - AKV2K8S_CLIENT_TENANT_ID: ${{ secret.INT_TEST_TENANT_ID }} - AKV2K8S_AZURE_SUBSCRIPTION: ${{ secret.INT_TEST_SUBSCRIPTION }} + AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }} + AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }} + AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} + AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: build-make-action: build-webhook From a7851014e311e9c2f42c54a47aaef28c485dc284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 28 Aug 2020 19:09:55 +0200 Subject: [PATCH 064/251] Set correct akv resource when authenticating with msi --- go.sum | 1 + pkg/akv2k8s/testing/main.go | 18 +++ pkg/azure/credential.go | 20 ++- pkg/azure/credential_test.go | 16 +-- .../client/azure_keyvault_service_test.go | 125 ++++++++++++++++++ 5 files changed, 155 insertions(+), 25 deletions(-) create mode 100644 pkg/akv2k8s/testing/main.go create mode 100644 pkg/azure/keyvault/client/azure_keyvault_service_test.go diff --git a/go.sum b/go.sum index a42cb771..fe5c201a 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,7 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0 h1:z20OWOSG5aCye0HEkDp6TPmP17ZcfeMxPi6HnSALa8c= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= diff --git a/pkg/akv2k8s/testing/main.go b/pkg/akv2k8s/testing/main.go new file mode 100644 index 00000000..d032ffb5 --- /dev/null +++ b/pkg/akv2k8s/testing/main.go @@ -0,0 +1,18 @@ +package testing + +import ( + "os" + "testing" +) + +// EnsureIntegrationEnvironment will check env vars needed by integration tests +func EnsureIntegrationEnvironment(t *testing.T) { + if os.Getenv("AKV2K8S_CLIENT_ID") == "" { + t.Skip("Skipping integration test - no credentials") + } + + os.Setenv("AZURE_CLIENT_ID", os.Getenv("AKV2K8S_CLIENT_ID")) + os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET")) + os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID")) + os.Setenv("AZURE_SUBSCRIPTION_ID", os.Getenv("AKV2K8S_AZURE_SUBSCRIPTION_ID")) +} diff --git a/pkg/azure/credential.go b/pkg/azure/credential.go index 15b8959a..8e593972 100644 --- a/pkg/azure/credential.go +++ b/pkg/azure/credential.go @@ -193,6 +193,7 @@ func NewFromEnvironment() (Credentials, error) { EndpointPartial: endpoint, } + // ClientID / Secret if creds, err := authSettings.GetClientCredentials(); err == nil { creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault @@ -206,6 +207,7 @@ func NewFromEnvironment() (Credentials, error) { return akvCreds, nil } + // Certificate if creds, err := authSettings.GetClientCertificate(); err == nil { creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault @@ -218,6 +220,7 @@ func NewFromEnvironment() (Credentials, error) { return akvCreds, nil } + // Username / Password if creds, err := authSettings.GetUsernamePassword(); err == nil { creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault @@ -236,8 +239,9 @@ func NewFromEnvironment() (Credentials, error) { return nil, err } + // User-Assigned Managed Identity if msi.ClientID != "" { - token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, msi.Resource, msi.ClientID) + token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, authSettings.Environment.ResourceIdentifiers.KeyVault, msi.ClientID) if err != nil { return nil, err } @@ -245,7 +249,8 @@ func NewFromEnvironment() (Credentials, error) { return akvCreds, nil } - token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, msi.Resource) + // System-Assigned Managed Identity + token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, authSettings.Environment.ResourceIdentifiers.KeyVault) if err != nil { return nil, err } @@ -364,16 +369,7 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E } func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) { - authSettings, err := azureAuth.GetSettingsFromEnvironment() - if err != nil { - return nil, err - } - - if token.Token().Resource != authSettings.Environment.KeyVaultEndpoint { - err = token.RefreshExchange(authSettings.Environment.KeyVaultEndpoint) - } else { - err = token.Refresh() - } + err := token.Refresh() if err != nil { return nil, err } diff --git a/pkg/azure/credential_test.go b/pkg/azure/credential_test.go index 4b533c24..9204be99 100644 --- a/pkg/azure/credential_test.go +++ b/pkg/azure/credential_test.go @@ -23,6 +23,7 @@ import ( "testing" "github.com/Azure/go-autorest/autorest/azure" + akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing" ) // func TestAuthDefault(t *testing.T) { @@ -37,17 +38,6 @@ import ( // } // } -func ensureIntegrationEnvironment(t *testing.T) { - if os.Getenv("AKV2K8S_CLIENT_ID") == "" { - t.Skip("Skipping integration test - no credentials") - } - - os.Setenv("AZURE_CLIENT_ID", os.Getenv("AKV2K8S_CLIENT_ID")) - os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET")) - os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID")) - os.Setenv("AZURE_SUBSCRIPTION_ID", os.Getenv("AKV2K8S_AZURE_SUBSCRIPTION_ID")) -} - // func TestChinaCloud(t *testing.T) { // ensureIntegrationEnvironment(t) @@ -70,7 +60,7 @@ func ensureIntegrationEnvironment(t *testing.T) { // } func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { - ensureIntegrationEnvironment(t) + akv2k8sTesting.EnsureIntegrationEnvironment(t) creds, err := NewFromEnvironment() if err != nil { @@ -89,7 +79,7 @@ func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { } func TestIntegrationAuthFromConfigAudience(t *testing.T) { - ensureIntegrationEnvironment(t) + akv2k8sTesting.EnsureIntegrationEnvironment(t) tenantId := os.Getenv("AZURE_TENANT_ID") subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID") diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go new file mode 100644 index 00000000..e03bc430 --- /dev/null +++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go @@ -0,0 +1,125 @@ +package client + +import ( + "fmt" + "os" + "strings" + "testing" + + akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing" + auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func secret(name string, keyVaultName string, secretName string) *akvs.AzureKeyVaultSecret { + return &akvs.AzureKeyVaultSecret{ + TypeMeta: metav1.TypeMeta{APIVersion: akvs.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Spec: akvs.AzureKeyVaultSecretSpec{ + Vault: akvs.AzureKeyVault{ + Name: keyVaultName, + Object: akvs.AzureKeyVaultObject{ + Name: secretName, + Type: "secret", + }, + }, + }, + } +} + +func TestIntegrationGetSecret(t *testing.T) { + akv2k8sTesting.EnsureIntegrationEnvironment(t) + + tenantId := os.Getenv("AZURE_TENANT_ID") + subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID") + clientId := os.Getenv("AZURE_CLIENT_ID") + clientSecret := os.Getenv("AZURE_CLIENT_SECRET") + + config := fmt.Sprintf(`{ + "cloud":"AzurePublicCloud", + "tenantId": "%s", + "subscriptionId": "%s", + "aadClientId": "%s", + "aadClientSecret": "%s", + "resourceGroup": "", + "location": "westeurope", + "vmType": "vmss", + "subnetName": "", + "securityGroupName": "", + "vnetName": "", + "vnetResourceGroup": "", + "routeTableName": "", + "primaryAvailabilitySetName": "", + "primaryScaleSetName": "", + "cloudProviderBackoffMode": "v2", + "cloudProviderBackoff": true, + "cloudProviderBackoffRetries": 6, + "cloudProviderBackoffDuration": 5, + "cloudProviderRatelimit": true, + "cloudProviderRateLimitQPS": 10, + "cloudProviderRateLimitBucket": 100, + "cloudProviderRatelimitQPSWrite": 10, + "cloudProviderRatelimitBucketWrite": 100, + "useManagedIdentityExtension": false, + "userAssignedIdentityID": "", + "useInstanceMetadata": true, + "loadBalancerSku": "Standard", + "disableOutboundSNAT": false, + "excludeMasterFromStandardLB": true, + "providerVaultName": "", + "maximumLoadBalancerRuleCount": 250, + "providerKeyName": "k8s", + "providerKeyVersion": "" +}`, tenantId, subscriptionId, clientId, clientSecret) + + r := strings.NewReader(config) + + provider, err := auth.NewFromCloudConfig(r) + if err != nil { + t.Error(err) + } + + creds, err := provider.GetCredentials() + if err != nil { + t.Error(err) + } + + srvc := NewService(creds) + akvSecret := secret("mySecret", "akv2k8s-test", "my-secret") + + secret, err := srvc.GetSecret(&akvSecret.Spec.Vault) + if err != nil { + t.Error(err) + } + + if secret == "" { + t.Fail() + } + +} + +func TestIntegrationEnvironmentGetSecret(t *testing.T) { + akv2k8sTesting.EnsureIntegrationEnvironment(t) + + creds, err := auth.NewFromEnvironment() + if err != nil { + t.Error(err) + } + + srvc := NewService(creds) + akvSecret := secret("mySecret", "akv2k8s-test", "my-secret") + + secret, err := srvc.GetSecret(&akvSecret.Spec.Vault) + if err != nil { + t.Error(err) + } + + if secret == "" { + t.Fail() + } + +} From 7bc4deefe91f2eae0ee27a26c6ba488a33222b0b Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 26 Aug 2020 23:13:20 +0000 Subject: [PATCH 065/251] fix: upgrade gatsby-theme-apollo-docs from 4.0.14 to 4.3.6 Snyk has created this PR to upgrade gatsby-theme-apollo-docs from 4.0.14 to 4.3.6. See this package in npm: https://www.npmjs.com/package/gatsby-theme-apollo-docs See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 163 +++++++++++++++++++++++++++++++++-------- docs/package.json | 2 +- 2 files changed, 134 insertions(+), 31 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index b1c05061..89aa1cbf 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3654,6 +3654,29 @@ } } }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "requires": { + "debug": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, "@mapbox/hast-util-table-cell-style": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", @@ -11243,6 +11266,30 @@ } } }, + "gatsby-plugin-google-analytics": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/gatsby-plugin-google-analytics/-/gatsby-plugin-google-analytics-2.3.13.tgz", + "integrity": "sha512-K/6c9iByR8uDpFZuJrappjyMsVtWFwPyAkRlXFHhq2mmNtgZeRVKFf5XoGiOHCeMPEpBGE58LLana/F01LLteQ==", + "requires": { + "@babel/runtime": "^7.10.3", + "minimatch": "3.0.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, "gatsby-plugin-gtag": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/gatsby-plugin-gtag/-/gatsby-plugin-gtag-1.0.13.tgz", @@ -11273,9 +11320,9 @@ } }, "gatsby-plugin-mdx": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.2.35.tgz", - "integrity": "sha512-XSlKr56PQznSYbgmKkGMaA3qwoI2b+2LTXZisC6hKiOGD5QXngdRV1FbDrDNLVlInPW3ZgT9EwqfWkaNzbtMmA==", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.2.36.tgz", + "integrity": "sha512-fmspqK7WrJaITIgQrKmv6Ds1mtK+6Q+hKblpojhQEek39UeuG1Ku+qjpgP1T5qOVK6ehfeW0RzFqOCUvWR0McA==", "requires": { "@babel/core": "^7.10.3", "@babel/generator": "^7.10.3", @@ -11292,7 +11339,7 @@ "escape-string-regexp": "^1.0.5", "eval": "^0.1.4", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.16", + "gatsby-core-utils": "^1.3.17", "gray-matter": "^4.0.2", "json5": "^2.1.3", "loader-utils": "^1.4.0", @@ -11353,6 +11400,20 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, + "gatsby-core-utils": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.17.tgz", + "integrity": "sha512-nRKsoR4Y0N/O8U9xSnSbNlEtny1LEPQDl3IKru7JKwCu82nTeC4L4HSZATqXeRzadMlqmpY8j8Z6wblTewjnjg==", + "requires": { + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" + } + }, "loader-utils": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", @@ -11582,11 +11643,6 @@ } } }, - "gatsby-plugin-segment-js": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-segment-js/-/gatsby-plugin-segment-js-3.5.0.tgz", - "integrity": "sha512-KrlULaEdj5KNUec6B12sSvirfXBYJvvAV08Wr2T9YC9LC3oczYhRhvImpzsJEuZyH343Lv2dsOK13I8Q0mWm2A==" - }, "gatsby-plugin-svgr": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", @@ -12522,9 +12578,9 @@ } }, "gatsby-source-filesystem": { - "version": "2.3.25", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.3.25.tgz", - "integrity": "sha512-ZrLi8on+wMQOvd4YLmpb/bcw6K0BA6IeZ949+I465iTf3FIivdh7+at06q52fv1hfsPDQ8PF1KrWp3qDftbORQ==", + "version": "2.3.26", + "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.3.26.tgz", + "integrity": "sha512-dQJoZ4MLEHInGMThLBkiJ6N49r1VkRFoOo01Qga3LgB6hBlrfRWbzPg8yh/WN6o5lnwtbMHHKnuumnuke4kHWQ==", "requires": { "@babel/runtime": "^7.10.3", "better-queue": "^3.8.10", @@ -12532,7 +12588,7 @@ "chokidar": "3.4.0", "file-type": "^12.4.2", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.16", + "gatsby-core-utils": "^1.3.17", "got": "^9.6.0", "md5-file": "^3.2.3", "mime": "^2.4.6", @@ -12551,6 +12607,20 @@ "regenerator-runtime": "^0.13.4" } }, + "gatsby-core-utils": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.17.tgz", + "integrity": "sha512-nRKsoR4Y0N/O8U9xSnSbNlEtny1LEPQDl3IKru7JKwCu82nTeC4L4HSZATqXeRzadMlqmpY8j8Z6wblTewjnjg==", + "requires": { + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -12599,6 +12669,14 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -12629,6 +12707,14 @@ "requires": { "glob": "^7.1.3" } + }, + "simple-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "requires": { + "debug": "^4.0.1" + } } } }, @@ -12766,25 +12852,25 @@ } }, "gatsby-theme-apollo-docs": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.0.14.tgz", - "integrity": "sha512-hptn26w5o8MOA5iH6NZ00KrWdUzPRXUiCgJzh1J4+ggqCtypGixU5uXJIwR/ka9WRUJtQWz9uaJ47XlPnhTMUw==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.3.6.tgz", + "integrity": "sha512-JzPfEVU0mSyol8eGCR82F4GLioh81F47xt6j4z8hIYMBQGME4fUpJ9NwNMPoD02hh9jiFydOiGCjXh9fXBSPJQ==", "requires": { "@mdx-js/mdx": "^1.1.0", "@mdx-js/react": "^1.0.27", + "gatsby-plugin-google-analytics": "^2.2.5", "gatsby-plugin-mdx": "^1.0.23", "gatsby-plugin-printer": "1.0.x", - "gatsby-plugin-segment-js": "^3.0.1", "gatsby-remark-autolink-headers": "^2.0.16", "gatsby-remark-check-links": "^2.1.0", "gatsby-remark-code-titles": "^1.1.0", "gatsby-remark-copy-linked-files": "^2.0.12", "gatsby-remark-mermaid": "^1.2.0", "gatsby-remark-prismjs": "^3.2.8", - "gatsby-remark-rewrite-relative-links": "^1.0.7", + "gatsby-remark-rewrite-relative-links": "^1.0.8", "gatsby-source-filesystem": "^2.0.29", "gatsby-source-git": "^1.0.1", - "gatsby-theme-apollo-core": "^3.0.10", + "gatsby-theme-apollo-core": "^3.0.18", "gatsby-transformer-remark": "^2.6.30", "js-yaml": "^3.13.1", "prismjs": "^1.15.0", @@ -12794,18 +12880,19 @@ "remark": "^10.0.1", "remark-react": "^5.0.1", "remark-typescript": "^0.3.0", + "simple-git": "^2.7.0", "source-sans-pro": "^3.6.0", "striptags": "^3.1.1" } }, "gatsby-transformer-remark": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.8.29.tgz", - "integrity": "sha512-X3b+3v7AYN0fWs4540n+tYKHSImaXXuKSI9kNi2lnPu0FKh3Lqy78qckW6hTdDB01a48cYRDCvGXP8by71z95g==", + "version": "2.8.30", + "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.8.30.tgz", + "integrity": "sha512-xqPPtYmLOWp6vnEWnbJ+Ic11LoFpCkFvj7DL+58P7yJ6GHB6ax5XqPsc1acjcH4JCmaP1MXV3aQGe8KlwiAc2w==", "requires": { "@babel/runtime": "^7.10.3", "bluebird": "^3.7.2", - "gatsby-core-utils": "^1.3.16", + "gatsby-core-utils": "^1.3.17", "gray-matter": "^4.0.2", "hast-util-raw": "^4.0.0", "hast-util-to-html": "^4.0.1", @@ -12834,6 +12921,20 @@ "regenerator-runtime": "^0.13.4" } }, + "gatsby-core-utils": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.17.tgz", + "integrity": "sha512-nRKsoR4Y0N/O8U9xSnSbNlEtny1LEPQDl3IKru7JKwCu82nTeC4L4HSZATqXeRzadMlqmpY8j8Z6wblTewjnjg==", + "requires": { + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" + } + }, "hast-to-hyperscript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", @@ -20333,9 +20434,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-html": { - "version": "1.27.3", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.3.tgz", - "integrity": "sha512-79tcPlgJ3fuK0/TtUCIBdPeQSvktTSTJP9O/dzrteaO98qw5UV6CATh3ZyPjUzv1LtNjHDlhbq9XOXiKf0zA1w==", + "version": "1.27.4", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.4.tgz", + "integrity": "sha512-VvY1hxVvMXzSos/LzqeBl9/KYu3mkEOtl5NMwz6jER318dSHDCig0AOjZOtnoCwAC3HMs9LhfWkPCmQGttb4ng==", "requires": { "htmlparser2": "^4.1.0", "lodash": "^4.17.15", @@ -20760,11 +20861,13 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.20.1.tgz", + "integrity": "sha512-aa9s2ZLjXlHCVGbDXQLInMLvLkxKEclqMU9X5HMXi3tLWLxbWObz1UgtyZha6ocHarQtFp0OjQW9KHVR1g6wbA==", "requires": { - "debug": "^4.0.1" + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.1.1" }, "dependencies": { "debug": { diff --git a/docs/package.json b/docs/package.json index 6c74f155..99cca5b5 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,7 +10,7 @@ "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.7.1", - "gatsby-theme-apollo-docs": "4.0.14", + "gatsby-theme-apollo-docs": "4.3.6", "instantsearch.css": "^7.4.2", "react": "16.13.1", "react-dom": "16.13.1", From 7e2347c0f67027f4564616c6f7fa83d538d12824 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 26 Aug 2020 23:13:25 +0000 Subject: [PATCH 066/251] fix: upgrade algoliasearch from 4.1.0 to 4.3.1 Snyk has created this PR to upgrade algoliasearch from 4.1.0 to 4.3.1. See this package in npm: https://www.npmjs.com/package/algoliasearch See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 166 ++++++++++++++++++++--------------------- docs/package.json | 2 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 89aa1cbf..c25e13c1 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3,118 +3,118 @@ "lockfileVersion": 1, "dependencies": { "@algolia/cache-browser-local-storage": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.1.0.tgz", - "integrity": "sha512-r8BOgqZXVt+JPgP19PQNzZ+lYP+MP6eZKNQqfRYofFEx+K9oyfdtGCqmoWJsBUi3nNOzhbOcg2jfP2GJzJBZ5g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.3.1.tgz", + "integrity": "sha512-pNelJomUeeQS5ZagEeUti8HltrfJbqXHnZXB1fez4Ycdm7GsEQm0r6fRCfx+1/6hqQJNo5zQUSA4ZgWi8VMs4Q==", "requires": { - "@algolia/cache-common": "4.1.0" + "@algolia/cache-common": "4.3.1" } }, "@algolia/cache-common": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.1.0.tgz", - "integrity": "sha512-ZvvK40bs1BWLErchleZL4ctHT2uH56uLMnpZPCuIk+H2PKddeiIQc/z2JDu2BHr68u513XIAAoQ+C+LgKNugmw==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.3.1.tgz", + "integrity": "sha512-BgZVQKfQ3rYSKHDbEuYeIHgQ7cIqbDVUe8gPib/YI6hB2FWdt3hQyDqKslulBt65MxZ5CLSrWg8mq/qL077Bog==" }, "@algolia/cache-in-memory": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.1.0.tgz", - "integrity": "sha512-2382OXYFDeoPLA5vP9KP58ad15ows24ML5/io/T1N0xsZ0eVXDkT52qgaJw/esUfEkWScZ2R8kpesUa+qEP+kw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.3.1.tgz", + "integrity": "sha512-bd2Aqn8efGJpR8snjUvBJIONyQ2uqYQSbFH9rTrLPmJPMYdoTKTcVLrtpOhOlmvTTfguhqlv+zIjYdJcraeBvg==", "requires": { - "@algolia/cache-common": "4.1.0" + "@algolia/cache-common": "4.3.1" } }, "@algolia/client-account": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.1.0.tgz", - "integrity": "sha512-GFINlsxAHM/GEeDBjoTx8+J1ra9SINQCuXi2C9QSLFClPKug2lzApm8niJJGXckhyZ2aDLb7drJ1qJ8bTspApw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.3.1.tgz", + "integrity": "sha512-062Cxw61llvkeHS2bWghufNI0munw5fKGZBhUfDdnC7lsJpzYJwQdkdchzLqqIOXZa8k9vdLlnlKHk8f53E5fQ==", "requires": { - "@algolia/client-common": "4.1.0", - "@algolia/client-search": "4.1.0", - "@algolia/transporter": "4.1.0" + "@algolia/client-common": "4.3.1", + "@algolia/client-search": "4.3.1", + "@algolia/transporter": "4.3.1" } }, "@algolia/client-analytics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.1.0.tgz", - "integrity": "sha512-JMyZ9vXGbTJWiO66fWEu9uJ7GSYfouUyaq8W/6esADPtBbelf+Nc0NRlicOwHHJGwiJvWdvELafxrhkR1+KR8A==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.3.1.tgz", + "integrity": "sha512-+/gn1z3oAh2CE0xox7/Df9SseHcOuqgm4ngSXGh1cWpldsF+gioA9HWSh/4RSydViASKu3YIk5O61zFzVTKbOA==", "requires": { - "@algolia/client-common": "4.1.0", - "@algolia/client-search": "4.1.0", - "@algolia/requester-common": "4.1.0", - "@algolia/transporter": "4.1.0" + "@algolia/client-common": "4.3.1", + "@algolia/client-search": "4.3.1", + "@algolia/requester-common": "4.3.1", + "@algolia/transporter": "4.3.1" } }, "@algolia/client-common": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.1.0.tgz", - "integrity": "sha512-fjSMKeG54vAyQAhf+uz039/birTiLun8nDuCNx4CUbzGl97M0g96Q8jpsiZa0cjSNgh0VakMzn2GnHbS55W9/Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.3.1.tgz", + "integrity": "sha512-1dcADKy3F/gMN+s+p5yvYdF6A4L5YEY0ll4JjSHGKXvZyWLDxKjyu/ToeUuHlrutWQu9w8UT2X7urES8BZU5WQ==", "requires": { - "@algolia/requester-common": "4.1.0", - "@algolia/transporter": "4.1.0" + "@algolia/requester-common": "4.3.1", + "@algolia/transporter": "4.3.1" } }, "@algolia/client-recommendation": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.1.0.tgz", - "integrity": "sha512-UEN/QgQwVtVH++yAs2uTuyZZQQ1p5Xs/7/FKT4Kh9/8NAyqDD49zuyq/giw8PRNhWc3C/9jiO7X4RKE8QrVWGw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.3.1.tgz", + "integrity": "sha512-4WZ9Pa2waOkpqv5acom4f8XBBlrnafeEwcSK4R0msubHJpUdkvD/+rxT5Ya1/0FAGvBPhOvtOJqsauaJYKM2Dw==", "requires": { - "@algolia/client-common": "4.1.0", - "@algolia/requester-common": "4.1.0", - "@algolia/transporter": "4.1.0" + "@algolia/client-common": "4.3.1", + "@algolia/requester-common": "4.3.1", + "@algolia/transporter": "4.3.1" } }, "@algolia/client-search": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.1.0.tgz", - "integrity": "sha512-bpCYMEXUdyiopEBSHHwnrRhNEwOLstIeb0Djz+/pVuTXEr3Xg3JUoAZ8xFsCVldcXaZQpbi1/T0y3ky6xUVzfw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.3.1.tgz", + "integrity": "sha512-BGI8+8Gi3OELHtyXHflGz0Ms0DQLUQFu2Hs4us3L9gidyYhuvjl76x8EOOQRkXhQcWzEeqx+L2c2InTKtNfQfg==", "requires": { - "@algolia/client-common": "4.1.0", - "@algolia/requester-common": "4.1.0", - "@algolia/transporter": "4.1.0" + "@algolia/client-common": "4.3.1", + "@algolia/requester-common": "4.3.1", + "@algolia/transporter": "4.3.1" } }, "@algolia/logger-common": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.1.0.tgz", - "integrity": "sha512-QrE4Srf1LB7ekLzl68bFqlTrv7Wk7+GpsaGfB4xFZ9Pfv89My9p7qTVqdLlA44hEFY3fZ9csJp1/PFVucgNB4w==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.3.1.tgz", + "integrity": "sha512-HOY89EkxFFR0LjeqE+fqaF3EeQUAYFdVdrAXsnrWhm/OsAlXiy+vsoHL4EaJLXvTQlJRBbgNyyQv8ZPAN9JLCw==" }, "@algolia/logger-console": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.1.0.tgz", - "integrity": "sha512-sKELkiKIrj/tPRAdhOPNI0UxhK2uiIUXnGs/3ztAif6QX7vyE3lY19sj5pIVJctRvl8LW2UlzpBFGlcCDkho9Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.3.1.tgz", + "integrity": "sha512-aIJ2N++eTVLkwGFxb1AY60hxYIrNf3FgaEMkokPOAV7sPoWThITSQPj/2vruRLJsYZS2EnD8jxiETrCwSet7mw==", "requires": { - "@algolia/logger-common": "4.1.0" + "@algolia/logger-common": "4.3.1" } }, "@algolia/requester-browser-xhr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.1.0.tgz", - "integrity": "sha512-bLMfIAkOLs1/vGA09yxU0N5+bE0fSSvEH2ySqVssfWLMP+KRAvby2Goxm8BgI9xLkOvLbhazfQ4Ov2448VvA1g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.3.1.tgz", + "integrity": "sha512-aSkBWqt9IjZYzmJpP14ISO9tizjyumwAmGxnx2t/QuE3LUh/sJG2FL3Vvq44wjNk9yTPC/c1yiQA85IqeqGZ7g==", "requires": { - "@algolia/requester-common": "4.1.0" + "@algolia/requester-common": "4.3.1" } }, "@algolia/requester-common": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.1.0.tgz", - "integrity": "sha512-Cy0ciOv5uIm6wF+uLc9DHhxgPJtYQuy1f//hwJcW5mlPX/prPgxWwLXzWyyA+Ca7uU3q+0Y3cIFvEWM5pDxMEg==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.3.1.tgz", + "integrity": "sha512-2lu0gOB2Rt4mn9gKDxjB8rY2IvU4usDA8bZVGl5tf/E81kRovtDZcgZjuKQ5zMyJ/xuIYXjx+ECXAxjUnNhieA==" }, "@algolia/requester-node-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.1.0.tgz", - "integrity": "sha512-tXp6Pjx9dFgM5ccW6YfEN6v2Zqq8uGwhS1pyq03/aRYRBK60LptjG5jo++vrOytrQDOnIjcZtQzBQch2GjCVmw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.3.1.tgz", + "integrity": "sha512-CnVQ5fHJVsvOZjOIagAIWW315NwGF/spBT5o8/+9ZFTuKQTeLk8/jdj7OXKZ2+vbWkqDM1sKMFXH2jyHOlZjtQ==", "requires": { - "@algolia/requester-common": "4.1.0" + "@algolia/requester-common": "4.3.1" } }, "@algolia/transporter": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.1.0.tgz", - "integrity": "sha512-Z7PjHazSC+KFLDuCFOjvRNgLfh7XOE4tXi0a9O3gBRup4Sk3VQCfTw4ygCF3rRx6uYbq192efLu0nL1E9azxLA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.3.1.tgz", + "integrity": "sha512-fbA/XHjdVoO+sp+rPVe/+oK/mCac0S6VugMycg7Etujb4+6nv3STIZxtPiC+Xppbouh5tEEOE81F1aALHXBkBQ==", "requires": { - "@algolia/cache-common": "4.1.0", - "@algolia/logger-common": "4.1.0", - "@algolia/requester-common": "4.1.0" + "@algolia/cache-common": "4.3.1", + "@algolia/logger-common": "4.3.1", + "@algolia/requester-common": "4.3.1" } }, "@apollo/client": { @@ -5147,24 +5147,24 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "algoliasearch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.1.0.tgz", - "integrity": "sha512-0lzjvqQZkJYPuv7LyQauMIMCFFzJWfUf3m9KuHjmFubwbnTDa87KCMXKouMJ0kWXXt6nTLNt0+2YRREOWx2PHw==", - "requires": { - "@algolia/cache-browser-local-storage": "4.1.0", - "@algolia/cache-common": "4.1.0", - "@algolia/cache-in-memory": "4.1.0", - "@algolia/client-account": "4.1.0", - "@algolia/client-analytics": "4.1.0", - "@algolia/client-common": "4.1.0", - "@algolia/client-recommendation": "4.1.0", - "@algolia/client-search": "4.1.0", - "@algolia/logger-common": "4.1.0", - "@algolia/logger-console": "4.1.0", - "@algolia/requester-browser-xhr": "4.1.0", - "@algolia/requester-common": "4.1.0", - "@algolia/requester-node-http": "4.1.0", - "@algolia/transporter": "4.1.0" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.3.1.tgz", + "integrity": "sha512-q8aIYgdZZWOMzmvlIwxcbktVa8+M5cyI8hIrgd/NcSz/XKHfVTKdNYbnsmPqmYrssAmepx8C8vHnJrPuumUnYA==", + "requires": { + "@algolia/cache-browser-local-storage": "4.3.1", + "@algolia/cache-common": "4.3.1", + "@algolia/cache-in-memory": "4.3.1", + "@algolia/client-account": "4.3.1", + "@algolia/client-analytics": "4.3.1", + "@algolia/client-common": "4.3.1", + "@algolia/client-recommendation": "4.3.1", + "@algolia/client-search": "4.3.1", + "@algolia/logger-common": "4.3.1", + "@algolia/logger-console": "4.3.1", + "@algolia/requester-browser-xhr": "4.3.1", + "@algolia/requester-common": "4.3.1", + "@algolia/requester-node-http": "4.3.1", + "@algolia/transporter": "4.3.1" } }, "algoliasearch-helper": { diff --git a/docs/package.json b/docs/package.json index 99cca5b5..be4f35a6 100644 --- a/docs/package.json +++ b/docs/package.json @@ -6,7 +6,7 @@ "serve": "gatsby serve" }, "dependencies": { - "algoliasearch": "^4.1.0", + "algoliasearch": "^4.3.1", "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.7.1", From d539f503927336e64b1100e079f9e5dc761a9930 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 26 Aug 2020 23:13:29 +0000 Subject: [PATCH 067/251] fix: upgrade react-instantsearch-dom from 6.4.0 to 6.7.0 Snyk has created this PR to upgrade react-instantsearch-dom from 6.4.0 to 6.7.0. See this package in npm: https://www.npmjs.com/package/react-instantsearch-dom See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 26 +++++++++++++------------- docs/package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c25e13c1..cfaab367 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -5168,9 +5168,9 @@ } }, "algoliasearch-helper": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.1.1.tgz", - "integrity": "sha512-Jkqlp8jezQRixf7sbQ2zFXHpdaT41g9sHBqT6pztv5nfDmg94K+pwesAy6UbxRY78IL54LIaV1FLttMtT+IzzA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.2.2.tgz", + "integrity": "sha512-/3XvE33R+gQKaiPdy3nmHYqhF8hqIu8xnlOicVxb1fD6uMFmxW8rGLzzrRfsPfxgAfm+c1NslLb3TzQVIB8aVA==", "requires": { "events": "^1.1.1" }, @@ -19204,9 +19204,9 @@ } }, "react-instantsearch-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.4.0.tgz", - "integrity": "sha512-iJ33uxpo9suc9p8LTH3v5by5BXzhuttBvSaoePZheuLLG8dnbpiUt+m0iC4oeyr1cgubKJ1OhGCL8AQN2fR11A==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.7.0.tgz", + "integrity": "sha512-wIvSIwkWfqPbaQZcbKsfBK3Gpm1e7ahSwU8Bmx1N5RfUqA/NghqS0Ppv3sz4vCXjoEAdPV06R+Fpn9lT+cE9/Q==", "requires": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.1.0", @@ -19215,22 +19215,22 @@ }, "dependencies": { "react-fast-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.0.1.tgz", - "integrity": "sha512-C5vP0J644ofZGd54P8++O7AvrqMEbrGf8Ue0eAUJLJyw168dAX2aiYyX/zcY/eSNwO0IDjsKUaLE6n83D+TnEg==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" } } }, "react-instantsearch-dom": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.4.0.tgz", - "integrity": "sha512-FyJaD+jVNt59KOd8Nt6nQrmueEEJNH0VmS9IlSwWbQz2NrkQniaCFm+k8G13LsAASOCq4vQ8ULG2up+WpJeS8w==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.7.0.tgz", + "integrity": "sha512-J1C9xkHHLLa6rkKLKFDa7szA0TDo6yPFGmDzh2+JLaq4o694RIqivfUpROHus0Ki3BAQu9QmzLtodf6K1NOBWQ==", "requires": { "@babel/runtime": "^7.1.2", "algoliasearch-helper": "^3.1.0", "classnames": "^2.2.5", "prop-types": "^15.5.10", - "react-instantsearch-core": "^6.4.0" + "react-instantsearch-core": "^6.7.0" } }, "react-is": { diff --git a/docs/package.json b/docs/package.json index be4f35a6..ed06a1c0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ "instantsearch.css": "^7.4.2", "react": "16.13.1", "react-dom": "16.13.1", - "react-instantsearch-dom": "^6.4.0" + "react-instantsearch-dom": "^6.7.0" }, "devDependencies": { "gatsby-cli": "^2.12.88" From 2bb55d592f607a6530e2700f6ad10f808e51aaf2 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 27 Aug 2020 23:12:50 +0000 Subject: [PATCH 068/251] fix: upgrade instantsearch.css from 7.4.2 to 7.4.3 Snyk has created this PR to upgrade instantsearch.css from 7.4.2 to 7.4.3. See this package in npm: https://www.npmjs.com/package/instantsearch.css See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 6 +++--- docs/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index cfaab367..17c0d97d 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -14709,9 +14709,9 @@ } }, "instantsearch.css": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/instantsearch.css/-/instantsearch.css-7.4.2.tgz", - "integrity": "sha512-CaOdFWCpHOWGAkJRpwC4+8ROU3Upp3xrUuc0Mg92UucJ84MWMJWkVZDDyRwubgJe4HXQM2rV6b+bJaDeeZGunw==" + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/instantsearch.css/-/instantsearch.css-7.4.3.tgz", + "integrity": "sha512-Ywwf5QMKXpaoWsEPZbDHIcyka9ocyhxuSp8HgRK8v05DiyKz2kv0K3ysinshtAqAd1ut8HEh36dviWD/Z/+w2A==" }, "internal-ip": { "version": "4.3.0", diff --git a/docs/package.json b/docs/package.json index ed06a1c0..40de186c 100644 --- a/docs/package.json +++ b/docs/package.json @@ -11,7 +11,7 @@ "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.7.1", "gatsby-theme-apollo-docs": "4.3.6", - "instantsearch.css": "^7.4.2", + "instantsearch.css": "^7.4.3", "react": "16.13.1", "react-dom": "16.13.1", "react-instantsearch-dom": "^6.7.0" From 92624dd784596cfe0e4de4057399fee7fc6a2890 Mon Sep 17 00:00:00 2001 From: Jon Arild Torresdal Date: Wed, 2 Sep 2020 08:25:48 +0200 Subject: [PATCH 069/251] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8bad0216..2f849a8b 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@

Azure Key Vault to Kubernetes (akv2k8s) makes Azure Key Vault secrets, certificates and keys available to your applications in Kubernetes, in a simple and secure way.

Documentation available at https://akv2k8s.io

+

Join our Slack workspace

## Overview From 5c346e31e5809473bb058e148e06bfc2ddfcd53f Mon Sep 17 00:00:00 2001 From: Jon Arild Torresdal Date: Wed, 2 Sep 2020 08:27:58 +0200 Subject: [PATCH 070/251] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 2f849a8b..f6797091 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,7 @@

Azure Key Vault to Kubernetes (akv2k8s) makes Azure Key Vault secrets, certificates and keys available to your applications in Kubernetes, in a simple and secure way.

-

Documentation available at https://akv2k8s.io

-

Join our Slack workspace

+

Documentation available at https://akv2k8s.io and join our Slack Workspace to ask questions to the akv2k8s community.

## Overview From af54ee87957580882b44c90bc6b11bb18ac8bf92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 4 Sep 2020 23:43:36 +0200 Subject: [PATCH 071/251] Added multi version support in docs --- docs/gatsby-config.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/gatsby-config.js b/docs/gatsby-config.js index eda99136..0dd14bea 100644 --- a/docs/gatsby-config.js +++ b/docs/gatsby-config.js @@ -51,7 +51,7 @@ module.exports = { baseUrl: 'https://akv2k8s.io', baseDir: 'docs', logoLink: 'https://akv2k8s.io/', - contentDir: 'source/content/', + contentDir: 'source/content', siteName: '', pageTitle: 'akv2k8s docs', subtitle: '', @@ -63,6 +63,10 @@ module.exports = { spectrumPath: '', spectrumHandle: '', twitterHandle: '', + defaultVersion: '1.1', + versions: { + '1.0': 'doc-version-1.0.2', + }, sidebarCategories: { null: ['index', 'why-akv2k8s', 'quick-start', 'how-it-works'], 'Installation': [ @@ -82,7 +86,6 @@ module.exports = { 'tutorials/env-injection/1-secret', 'tutorials/env-injection/2-certificate', 'tutorials/env-injection/3-signing-key', - // 'tutorials/env-injection/4-multi-value-secret', 'tutorials/env-injection/5-pfx-certificate', ], Security: [ From bc3fb5fdfbfd119c17bc20a62292485ee8df3c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 5 Sep 2020 00:14:24 +0200 Subject: [PATCH 072/251] Fixed links to helm repos --- docs/package.json | 2 +- .../installation/installing-with-helm.md | 4 +- .../installation/updating-with-helm.md | 4 +- .../source/content/security/authentication.md | 42 ++++--------------- 4 files changed, 14 insertions(+), 38 deletions(-) diff --git a/docs/package.json b/docs/package.json index 40de186c..b03870db 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,7 +1,7 @@ { "scripts": { "prestart": "gatsby clean", - "start": "gatsby develop", + "start": "GATSBY_ALGOLIA_ENABLED=false gatsby develop", "build": "gatsby build", "serve": "gatsby serve" }, diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md index c61ebec9..7e73d951 100644 --- a/docs/source/content/installation/installing-with-helm.md +++ b/docs/source/content/installation/installing-with-helm.md @@ -36,8 +36,8 @@ helm install azure-key-vault-env-injector \ For more details about installation options, see the individual Helm charts: -* [Controller](../stable/azure-key-vault-controller/README) -* [Env Injector](../stable/azure-key-vault-env-injector/README) +* [Controller](/vdefault/stable/azure-key-vault-controller/README/) +* [Env Injector](/vdefault/stable/azure-key-vault-env-injector/README/) ## Installing with Helm outside Azure AKS diff --git a/docs/source/content/installation/updating-with-helm.md b/docs/source/content/installation/updating-with-helm.md index de80856e..0eb8ffe8 100644 --- a/docs/source/content/installation/updating-with-helm.md +++ b/docs/source/content/installation/updating-with-helm.md @@ -30,5 +30,5 @@ helm install azure-key-vault-env-injector \ For more details about installation options, see the individual Helm charts: -* [Controller](../stable/azure-key-vault-controller/README/) -* [Env Injector](../stable/azure-key-vault-env-injector/README/) +* [Controller](/vdefault/stable/azure-key-vault-controller/README/) +* [Env Injector](/vdefault/stable/azure-key-vault-env-injector/README/) diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md index 241a6556..42a7b308 100644 --- a/docs/source/content/security/authentication.md +++ b/docs/source/content/security/authentication.md @@ -7,7 +7,7 @@ By default both the Controller and the Env Injector will assume it is running on The Controller and Env-Injector have to handle AKV authentication quite differently, as the Controller is centralized and the Env-Injector executes in context of Pods. -To get more options for AKV authentication, see: +For more details about AKV authentication, see: * [AKV Authentication with the Controller](#akv-authentication-with-the-controller) for AKV Controller authentication options * [AKV Authentication with the Env-Injector](#akv-authentication-with-the-env-injector) for AKV Env-Injector authentication options @@ -23,47 +23,23 @@ Two solutions exists: ## AKV Authentication with the Controller -The Controller will need Azure Key Vault credentials to get Secrets from Azure Key Vault and store them as Kubernetes Secrets. **If the default option (AKS credentials) works for you, use that.** If not, use custom authentication by passing inn the value `keyVault.customAuth.enabled=true` to the Controller and pick one of the [Authentication options](#custom-authentication-options) described below. +The Controller will need AKV credentials to get Secrets from AKV and store them as Kubernetes Secrets. **If the default option (AKS credentials) works for you, use that.** If not, use custom authentication by passing inn the value `keyVault.customAuth.enabled=true` to the Controller and pick one of the [Authentication options](#custom-akv-authentication-options) described below. -Fore more details, see the [Controller Helm Chart](/stable/azure-key-vault-controller/README/#installing-the-chart). +Fore more details, see the [Controller Helm Chart](/vdefault/stable/azure-key-vault-controller/README/). ## AKV Authentication with the Env-Injector -The Env-Injector execute locally inside your Pod and needs access to Azure Key Vault credentials to inject secrets. You can either use default authentication (AKS credentials) or custom authentication. +The Env-Injector execute locally inside Pods and needs AKV credentials to download and inject secrets into container programs. You can either use default authentication (AKS credentials) or custom authentication. Use the following decision tree to find the best option: -Below we outline some guidelines to when you should use Default or Custom authentication. +![Authentication decision tree](../assets/auth-decision.svg) -| | Default | Custom Authentication | -| ---------------------------------------------------- | :-----------------------: | :---------------------------: | -| Kubernetes runs on Azure AKS | ✔|| -| Kubernetes runs outside Azure | | ✔| +> **For custom AKV authentication using Option 1 and akv2k8s versions `< 1.1.0`, set `customAuth.enabled=true` and `customAuth.autoInject.enabled=true` to have the Env-Injector auto-inject credentials as a Kubernetes Secret into Pods. Akv2k8s versions `> 1.1.0` handles this automatically through the auth-service introduced in version `1.1.0` without using Kubernetes Secret.** -| | Default | Custom Authentication | -| ---------------------------------------------------- | :-----------------------: | :---------------------------: | -| Using one Azure Key Vault per cluster | ✔ | | -| Using multiple Azure Key Vaults per cluster (like one Key Vault per application) and it is OK to use the same credentials to all Key Vaults | ✔ | | -| Multi-tenant environment (multiple Azure Key Vaults per cluster) | | ✔ | +> **For multi-tenant environments (using namespaces as isolation), Option 2 is currently the only viable option.** -Implications: +Fore more details, see the [Env Injector Helm Chart](/vdefault/stable/azure-key-vault-env-injector/README/) and which custom AKV authentication options are available below. -| | Default | Custom Authentication | -| ---------------------------------------------------- | :-----------------------: | :---------------------------: | -| Provide credentials only once, during Env-Injector install | ✔ -| Provide credentials to every Pod using Env-Injector | | ✔| -| The same Azure Key Vault credentials used in all Pods | ✔ || - -### Custom AKV Authentication with the Env-Injector - -Custom AKV Authentication for the Env-Injector means providing AKV credentials to every Pod using environment injection. Typically this means in every Kubernetes Deployment definition. - -Two options are currently available: - -1. Use Microsft's [AAD Pod Identity](https://github.com/Azure/aad-pod-identity) (see [Using Custom Authentication with AAD Pod Identity](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-aad-pod-identity)) -2. Provide credentials for each Pod using [Authentication options](#custom-authentication-options) below. - -Fore more details, see the [Env Injector Helm Chart](/stable/azure-key-vault-env-injector/README/#installing-the-chart). - -## Custom Authentication Options +## Custom AKV Authentication Options The following authentication options are available: From 950efc519d6bc7d35eccfe279b434ab130f481a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 5 Sep 2020 01:00:53 +0200 Subject: [PATCH 073/251] Removed git source for pages --- docs/gatsby-config.js | 25 ++++++++----------- docs/package.json | 1 + .../installation/installing-with-helm.md | 4 +-- .../installation/updating-with-helm.md | 4 +-- .../source/content/security/authentication.md | 4 +-- 5 files changed, 18 insertions(+), 20 deletions(-) diff --git a/docs/gatsby-config.js b/docs/gatsby-config.js index 0dd14bea..9aef4f43 100644 --- a/docs/gatsby-config.js +++ b/docs/gatsby-config.js @@ -14,20 +14,17 @@ module.exports = { anonymize: false, }, }, - { - resolve: `gatsby-source-git`, - options: { - name: `default`, - remote: `https://github.com/SparebankenVest/public-helm-charts.git`, - // Optionally supply a branch. If none supplied, you'll get the default branch. - // branch: `develop`, - // Tailor which files get imported eg. import the docs folder from a codebase. - patterns: [ - 'stable/azure-key-vault-controller/README.md', - 'stable/azure-key-vault-env-injector/README.md', - ] - } - }, + // { + // resolve: `gatsby-source-git`, + // options: { + // name: `default`, + // remote: `https://github.com/SparebankenVest/public-helm-charts.git`, + // patterns: [ + // 'stable/azure-key-vault-controller/README.md', + // 'stable/azure-key-vault-env-injector/README.md', + // ] + // } + // }, // { // resolve: "gatsby-source-graphql", // options: { diff --git a/docs/package.json b/docs/package.json index b03870db..5f6af777 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,6 +10,7 @@ "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.7.1", + "gatsby-source-git": "1.1.0", "gatsby-theme-apollo-docs": "4.3.6", "instantsearch.css": "^7.4.3", "react": "16.13.1", diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md index 7e73d951..b210ae50 100644 --- a/docs/source/content/installation/installing-with-helm.md +++ b/docs/source/content/installation/installing-with-helm.md @@ -36,8 +36,8 @@ helm install azure-key-vault-env-injector \ For more details about installation options, see the individual Helm charts: -* [Controller](/vdefault/stable/azure-key-vault-controller/README/) -* [Env Injector](/vdefault/stable/azure-key-vault-env-injector/README/) +* [Controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller/README.md) +* [Env Injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector/README.md) ## Installing with Helm outside Azure AKS diff --git a/docs/source/content/installation/updating-with-helm.md b/docs/source/content/installation/updating-with-helm.md index 0eb8ffe8..2742d114 100644 --- a/docs/source/content/installation/updating-with-helm.md +++ b/docs/source/content/installation/updating-with-helm.md @@ -30,5 +30,5 @@ helm install azure-key-vault-env-injector \ For more details about installation options, see the individual Helm charts: -* [Controller](/vdefault/stable/azure-key-vault-controller/README/) -* [Env Injector](/vdefault/stable/azure-key-vault-env-injector/README/) +* [Controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller/README.md) +* [Env Injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/stable/azure-key-vault-env-injector/README.md) diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md index 42a7b308..da161c48 100644 --- a/docs/source/content/security/authentication.md +++ b/docs/source/content/security/authentication.md @@ -25,7 +25,7 @@ Two solutions exists: The Controller will need AKV credentials to get Secrets from AKV and store them as Kubernetes Secrets. **If the default option (AKS credentials) works for you, use that.** If not, use custom authentication by passing inn the value `keyVault.customAuth.enabled=true` to the Controller and pick one of the [Authentication options](#custom-akv-authentication-options) described below. -Fore more details, see the [Controller Helm Chart](/vdefault/stable/azure-key-vault-controller/README/). +Fore more details, see the [Controller Helm Chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller/README.md). ## AKV Authentication with the Env-Injector @@ -37,7 +37,7 @@ The Env-Injector execute locally inside Pods and needs AKV credentials to downlo > **For multi-tenant environments (using namespaces as isolation), Option 2 is currently the only viable option.** -Fore more details, see the [Env Injector Helm Chart](/vdefault/stable/azure-key-vault-env-injector/README/) and which custom AKV authentication options are available below. +Fore more details, see the [Env Injector Helm Chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector/README.md) and which custom AKV authentication options are available below. ## Custom AKV Authentication Options From 11060e4c779b753c961bd11469631bbe9ac466a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 5 Sep 2020 02:25:41 +0200 Subject: [PATCH 074/251] Added image showing decision tree for auth options for env-injector --- docs/source/content/assets/auth-decision.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/source/content/assets/auth-decision.svg diff --git a/docs/source/content/assets/auth-decision.svg b/docs/source/content/assets/auth-decision.svg new file mode 100644 index 00000000..ba07e74b --- /dev/null +++ b/docs/source/content/assets/auth-decision.svg @@ -0,0 +1 @@ +Using AzureAKSYesNoUse CustomCredentialsYesUse AKS identityto access AzureKey Vault?This is Default.No special configneededYesNoSingle Azure KeyVault perKubernetes ClusterYesNoAccess all AzureKey Vaults withthe same identity?NocustomAuth = truePass custom AKV credentialsto Env-InjectorcustomAuth = truePass custom AKV credentialsto Env-InjectorcustomAuth = truePass custom AKV credentials toevery PODOption 1Option 2 \ No newline at end of file From 345e0ad80d52d968756f2774992c0a0eb713b6e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 5 Sep 2020 02:43:20 +0200 Subject: [PATCH 075/251] Updated decision tree --- docs/source/content/assets/auth-decision.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/content/assets/auth-decision.svg b/docs/source/content/assets/auth-decision.svg index ba07e74b..e979ddbd 100644 --- a/docs/source/content/assets/auth-decision.svg +++ b/docs/source/content/assets/auth-decision.svg @@ -1 +1 @@ -Using AzureAKSYesNoUse CustomCredentialsYesUse AKS identityto access AzureKey Vault?This is Default.No special configneededYesNoSingle Azure KeyVault perKubernetes ClusterYesNoAccess all AzureKey Vaults withthe same identity?NocustomAuth = truePass custom AKV credentialsto Env-InjectorcustomAuth = truePass custom AKV credentialsto Env-InjectorcustomAuth = truePass custom AKV credentials toevery PODOption 1Option 2 \ No newline at end of file +Using AzureAKSYesNoUse CustomCredentialsYesUse AKS identityto access AzureKey Vault?This is Default.No special configneededYesNoSingle Azure KeyVault perKubernetes ClusterNoAccess all AzureKey Vaults withthe same identity?NocustomAuth = truePass custom AKV credentialsto Env-InjectorcustomAuth = truePass custom AKV credentials toevery PODOption 1Option 2Yes \ No newline at end of file From f12a8415e89c04a847067ec1b6017a04182e6522 Mon Sep 17 00:00:00 2001 From: Roger Solsvik Date: Mon, 7 Sep 2020 12:12:35 +0200 Subject: [PATCH 076/251] Create CODEOWNERS We now require all repositories within our organization to have CODEOWNERS defined. I see this repository has a OWNERS file defined, but could not find any documentation on Github that suggests that this is supported or what the difference is compared to CODEOWNERS. Could it be obsolete? Either way the latter would server the same purpose. --- CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..a45eb1ef --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,2 @@ +# See: https://help.github.com/en/articles/about-code-owners#codeowners-syntax +* @torresdal @vidarw From bc216207985ecfe2a144215cc8da3e0f5fa38a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 10 Sep 2020 13:45:56 +0200 Subject: [PATCH 077/251] replaced name for ca configmap with variable --- pkg/akv2k8s/controller/cabundleinjector/controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index b185199a..34a81526 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -384,7 +384,7 @@ func (c *Controller) syncHandlerSecret(key string) error { log.Debugf("looping all labelled namespaces looking for config map '%s'", c.caBundleConfigMapName) for _, ns := range labelledNamespaces { - configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get("akv2k8s-ca") + configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) // If the resource doesn't exist, we'll create it if errors.IsNotFound(err) { From 5599c865345799e405882aae8598b3ce8489dda9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 09:13:04 +0200 Subject: [PATCH 078/251] Added crd --- crds/AzureKeyVaultSecret.yaml | 100 ++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 crds/AzureKeyVaultSecret.yaml diff --git a/crds/AzureKeyVaultSecret.yaml b/crds/AzureKeyVaultSecret.yaml new file mode 100644 index 00000000..3b66f262 --- /dev/null +++ b/crds/AzureKeyVaultSecret.yaml @@ -0,0 +1,100 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: azurekeyvaultsecrets.spv.no + labels: + app.kubernetes.io/name: akv2k8s + annotations: + "helm.sh/resource-policy": keep +spec: + group: spv.no + names: + kind: AzureKeyVaultSecret + listKind: AzureKeyVaultSecretList + plural: azurekeyvaultsecrets + singular: azurekeyvaultsecret + shortNames: + - akvs + categories: + - all + additionalPrinterColumns: + - name: Vault + type: string + description: Which Azure Key Vault this resource is asosiated with + JSONPath: .spec.vault.name + - name: Vault Object + type: string + description: Which Azure Key Vault object this resource is asosiated with + JSONPath: .spec.vault.object.name + - name: Secret Name + type: string + description: Which Kubernetes Secret this resource is synched with, if any + JSONPath: .status.secretName + - name: Synched + type: string + description: When this resource was last synched with Azure Key Vault + JSONPath: .status.lastAzureUpdate + scope: Namespaced + versions: + - name: v1alpha1 + served: true + storage: false + - name: v1 + served: true + storage: true + + subresources: + status: {} + validation: + openAPIV3Schema: + properties: + spec: + required: ['vault'] + properties: + vault: + required: ['name', 'object'] + properties: + name: + type: string + description: Name of the Azure Key Vault + object: + required: ['name', 'type'] + properties: + name: + type: string + description: The object name in Azure Key Vault + type: + type: string + description: The type of object in Azure Key Vault + enum: + - secret + - certificate + - key + - multi-key-value-secret + version: + type: string + description: The object version in Azure Key Vault + contentType: + type: string + description: Only used when type is multi-key-value-secret. + enum: + - application/x-json + - application/x-yaml + output: + properties: + transform: + type: array + items: + type: string + secret: + required: ['name'] + properties: + name: + type: string + description: Name for Kubernetes secret + type: + type: string + description: Type of Secret in Kubernetes + dataKey: + type: string + description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data From a7fbc144500521c9951e256c3e9d09d207b2ad6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 10:28:07 +0200 Subject: [PATCH 079/251] Updated installation instructions to manually install CRD --- .../installation/installing-with-helm.md | 50 +++++++++++++------ .../installation/installing-without-helm.md | 11 ++-- .../content/installation/requirements.md | 6 +-- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md index b210ae50..b66ce3fc 100644 --- a/docs/source/content/installation/installing-with-helm.md +++ b/docs/source/content/installation/installing-with-helm.md @@ -5,14 +5,27 @@ description: "How to install Azure Key Vault to Kubernetes with Helm" > Make sure to check the [requirements](requirements) before installing. -## Installing with Helm on Azure AKS +Before installing the Chart, the Custom Resource Definition must be installed, by pointing to the correct version: -Create `akv2k8s` namespace: +``` +kubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/{{ version }}/crds/AzureKeyVaultSecret.yaml +``` + +E.g. for version 1.1.0 use: + +``` +https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/crd-1.1.0/crds/AzureKeyVaultSecret.yaml +``` + +A dedicated namespace needs to be created for akv2k8s: ```bash kubectl create ns akv2k8s ``` +## Installing with Helm on Azure AKS + + Add Helm repository: ```bash @@ -23,13 +36,10 @@ helm repo update Install both Controller and Env-Injector: ```bash -helm install azure-key-vault-controller \ - spv-charts/azure-key-vault-controller \ - --namespace akv2k8s +helm upgrade -i azure-key-vault-controller spv-charts/azure-key-vault-controller \ + --namespace akv2k8s -helm install azure-key-vault-env-injector \ - spv-charts/azure-key-vault-env-injector \ - --set installCrd=false \ +helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ --namespace akv2k8s ``` @@ -39,7 +49,7 @@ individual Helm charts: * [Controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller/README.md) * [Env Injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector/README.md) -## Installing with Helm outside Azure AKS +## Installing with Helm outside Azure AKS When running inside Azure AKS, akv2k8s can use the AKS cluster credentials for authorizing with Azure Key Vault (default behavior). Outside Azure AKS - credentials (Azure Service Principal) must be provided by setting `keyVault.customAuth=true`. See [Authentication](../security/authentication) for more details. @@ -59,20 +69,32 @@ helm repo update Install both Controller and Env-Injector: ```bash -helm install azure-key-vault-controller \ - spv-charts/azure-key-vault-controller \ +helm upgrade -i azure-key-vault-controller spv-charts/azure-key-vault-controller \ --namespace akv2k8s \ --set keyVault.customAuth.enabled=true \ --set env.AZURE_TENANT_ID= \ --set env.AZURE_CLIENT_ID= \ --set env.AZURE_CLIENT_SECRET= -helm install azure-key-vault-env-injector \ - spv-charts/azure-key-vault-env-injector \ +helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ --namespace akv2k8s \ - --set installCrd=false \ --set keyVault.customAuth.enabled=true \ --set env.AZURE_TENANT_ID= \ --set env.AZURE_CLIENT_ID= \ --set env.AZURE_CLIENT_SECRET= +``` + +## Installing with Helm for akv2k8s versions < 1.1.0 + +> Helm charts prior to version 1.1.0 installed the Azure Key Vault Secret CRD as part of the Helm chart. As [documented by Helm](https://helm.sh/docs/chart_best_practices/custom_resource_definitions/), this has its drawbacks and we decided to handle the CRD outside of Helm for versions >= 1.1.0. + +For akv2k8s versions < 1.1.0 we need to tell Helm NOT to install the CRD for the second Chart, setting `installCrd=false`: + +```bash +helm upgrade -i azure-key-vault-controller spv-charts/azure-key-vault-controller \ + --namespace akv2k8s + +helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ + --set installCrd=false \ + --namespace akv2k8s ``` \ No newline at end of file diff --git a/docs/source/content/installation/installing-without-helm.md b/docs/source/content/installation/installing-without-helm.md index 7933b86e..2059f787 100644 --- a/docs/source/content/installation/installing-without-helm.md +++ b/docs/source/content/installation/installing-without-helm.md @@ -19,9 +19,9 @@ helm repo update Render akv2k8s charts locally: ```bash -helm install --debug --dry-run akv2k8s spv-charts/azure-key-vault-controller +helm install --debug --dry-run azure-key-vault-controller spv-charts/azure-key-vault-controller --namespace akv2k8s -helm install --debug --dry-run akv2k8s spv-charts/azure-key-vault-env-injector \ +helm install --debug --dry-run azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ --set installCrd=false --namespace akv2k8s ``` @@ -30,14 +30,15 @@ helm install --debug --dry-run akv2k8s spv-charts/azure-key-vault-env-injector \ Download the Git repository: ```bash -git clone git@github.com:SparebankenVest/c.git +git clone git@github.com:SparebankenVest/public-helm-charts.git ``` -Render chart template locally: +Render chart templates locally: ```bash cd public-helm-charts -helm template akv2k8s ./stable/azure-key-vault-env-injector/ +helm template azure-key-vault-controller ./stable/azure-key-vault-controller/ +helm template azure-key-vault-env-injector ./stable/azure-key-vault-env-injector/ ``` ## Options and more diff --git a/docs/source/content/installation/requirements.md b/docs/source/content/installation/requirements.md index 4e99511b..c5003d9e 100644 --- a/docs/source/content/installation/requirements.md +++ b/docs/source/content/installation/requirements.md @@ -3,15 +3,15 @@ title: "Requirements" description: "Requirements for installing akv2k8s" --- -* Kubernetes version >= 1.17.9 -* A dedicated kubernetes namespace +* Kubernetes version >= 1.15.11 +* A dedicated kubernetes namespace (e.g. akv2k8s) * Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook * RBAC enabled * Default [authentication](../security/authentication) requires Kubernetes cluster running in Azure - use [custom authentication](../security/authentication) if running outside Azure ## Dedicated namespace for akv2k8s -Akv2k8s should be installed in a dedicated Kubernetes namespace that is **NOT** label with `azure-key-vault-env-injection: enabled`. +Akv2k8s should be installed in a dedicated Kubernetes namespace **NOT** label with `azure-key-vault-env-injection: enabled`. **If the namespace where the akv2k8s components is installed has the injector enabled (`azure-key-vault-env-injection: enabled`), the Env Injector will most likely not be able to start.** This is because the Env Injector mutating webhook will trigger for every pod about to start in namespaces where enabled, and in the home namepsace of the Env Injector, it will effectively point to itself, which does not exist yet. From 7e6f38e918a961452f7bb15f5d04fbfaa6c158d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 22:05:52 +0200 Subject: [PATCH 080/251] updated install and security docs with latest changes --- docs/README.md | 23 ++++--------------- .../installation/installing-with-helm.md | 2 +- docs/source/content/quick-start.mdx | 2 +- .../source/content/security/authentication.md | 8 +++++++ 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/docs/README.md b/docs/README.md index 51d58f41..2197d127 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,27 +4,12 @@ This is the documentation **source** for this repository. The **deployed** version of the documentation for this repository is available at: -* https://www.apollographql.com/docs/ - -## Documentation for the documentation - -This `README.md` is intentionally short since the [documentation for the documentation](https://docs-docs.netlify.com/docs/docs/) provides details for the documentation framework _itself_. Additional information should generally be added to that documentation rather than here in this `README.md`, in order to provide a centralized resource that benefits all documentation deployments. +* https://akv2k8s.io ## Running locally -For more information, consult the documentation for the documentation, referenced above. +From the root of this repository: -In general though: - -* `npm install` in this directory -* `npm start` in this directory +* `make docs-install-dev` +* `make docs-run-dev` * Open a browser to the link provided in the console. - -> **Important note:** Changes to the markdown source does not result in an automatic "hot reload" in the browser; it is necessary to reload the page manually in the browser to see it re-rendered. Additionally, changes to `_config.yml` require stopping the server and restarting with `npm start` again. - -## Deploy previews - -Documentation repositories should be setup with a "deploy preview" feature which automatically provides "preview" links in the _status checks_ section of pull-requests. - -In the event that it's not possible to run the documentation locally, pushing changes to the branch for a pull-request can be a suitable alternative that ensures changes to the documentation are properly rendered. - diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md index b66ce3fc..080c0e86 100644 --- a/docs/source/content/installation/installing-with-helm.md +++ b/docs/source/content/installation/installing-with-helm.md @@ -51,7 +51,7 @@ individual Helm charts: ## Installing with Helm outside Azure AKS -When running inside Azure AKS, akv2k8s can use the AKS cluster credentials for authorizing with Azure Key Vault (default behavior). Outside Azure AKS - credentials (Azure Service Principal) must be provided by setting `keyVault.customAuth=true`. See [Authentication](../security/authentication) for more details. +When running inside Azure AKS, akv2k8s will use the AKS cluster credentials by default to authenticate with Azure Key Vault. Outside Azure AKS - credentials must be provided by setting `keyVault.customAuth=true` and provide credentials as documentend under [Authentication](../security/authentication) for more details. Create `akv2k8s` namespace: diff --git a/docs/source/content/quick-start.mdx b/docs/source/content/quick-start.mdx index 5a9cf001..8db8024c 100644 --- a/docs/source/content/quick-start.mdx +++ b/docs/source/content/quick-start.mdx @@ -21,7 +21,7 @@ See [installation](installation). ## Ensure Kubernetes can access objects in Azure Key Vault -By default akv2k8s use the AKS cluster credentials to authenticate with Azure Key Vault (if you run outside Azure, see using [custom credentials](security/authentication#akv-authentication-with-the-controller)). Run the following command to authorize akv2k8s to access `secret`-objects in Azure Key Vault. +By default akv2k8s use the AKS cluster credentials to authenticate with Azure Key Vault (if you run outside Azure, see using [custom credentials](security/authentication)). Run the following command to authorize akv2k8s to access `secret`-objects in Azure Key Vault. ```bash az keyvault set-policy \ diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md index da161c48..7b53b2bd 100644 --- a/docs/source/content/security/authentication.md +++ b/docs/source/content/security/authentication.md @@ -39,6 +39,14 @@ The Env-Injector execute locally inside Pods and needs AKV credentials to downlo Fore more details, see the [Env Injector Helm Chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector/README.md) and which custom AKV authentication options are available below. +## Using custom authentication with AAD Pod Identity + +Requires Pod Identity: https://github.com/Azure/aad-pod-identity + +When deploying Pods, set the `aadpodidbinding` according to the +[AAD Pod Identity project docs](https://github.com/Azure/aad-pod-identity/blob/master/README.md) and +the env-injector will use these credentials when communicating with Azure Key Vault. + ## Custom AKV Authentication Options The following authentication options are available: From 794c86123f2486501b0200db38b030e34f72a040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 22:06:38 +0200 Subject: [PATCH 081/251] ignore builds when crds folder changes --- .github/workflows/ca-bundle-controller-build.yaml | 1 + .github/workflows/controller-build.yaml | 1 + .github/workflows/pull-request.yaml | 2 ++ .github/workflows/vaultenv-build.yaml | 1 + .github/workflows/webhook-build.yaml | 1 + 5 files changed, 6 insertions(+) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index 4092088f..a40f6624 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -13,6 +13,7 @@ on: - 'cmd/ca-bundle-controller/**' - 'pkg/**' - '!docs/**' + - '!crds/**' jobs: build-deploy: diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index 933b1a0a..5f50406f 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -13,6 +13,7 @@ on: - 'cmd/azure-keyvault-controller/**' - 'pkg/**' - '!docs/**' + - '!crds/**' jobs: build-deploy: diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index 96bb4529..71146ee1 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -10,6 +10,8 @@ on: - 'cmd/**' - 'pkg/**' - '!docs/**' + - '!crds/**' + jobs: build-deploy: runs-on: ubuntu-18.04 diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index 77c2fb77..5f084b76 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -13,6 +13,7 @@ on: - 'cmd/azure-keyvault-env/**' - 'pkg/**' - '!docs/**' + - '!crds/**' jobs: build-deploy: diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index 5a0eee1a..b2d3303e 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -13,6 +13,7 @@ on: - 'cmd/azure-keyvault-secrets-webhook/**' - 'pkg/**' - '!docs/**' + - '!crds/**' jobs: build-deploy: From 29706943cc383ce51627e8dc7fbf8e080976e6fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 22:07:05 +0200 Subject: [PATCH 082/251] support version tagging of crds --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0f3bd08f..b515d69e 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,11 @@ print-v-vaultenv: print-v-ca-bundle-controller: @echo $(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) -tag-all: tag-webhook tag-controller tag-ca-bundle-controller tag-vaultenv +tag-all: tag-crd tag-webhook tag-controller tag-ca-bundle-controller tag-vaultenv + +tag-crd: check-tag + git tag -a crd-$(TAG) -m "CRD version $(TAG)" + git push --tags tag-webhook: check-tag git tag -a webhook-$(TAG) -m "Webhook version $(TAG)" From e0ddbf11d79d05713116f0ac565e335e1ed47f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 22:07:31 +0200 Subject: [PATCH 083/251] Removed install stuff, pointing to docs instead --- README.md | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index f6797091..ee327f17 100644 --- a/README.md +++ b/README.md @@ -53,31 +53,9 @@ Goals for this project was: All of these goals are met. -## Requirements - -* Kubernetes version >= 1.13 -* Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook -* RBAC enabled -* Default [authentication](#authentication) requires Kubernetes cluster running in Azure - use custom authentication if running outside Azure - ## Installation -It's recommended to use Helm charts for installation: - -Controller: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller - -Env Injector: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector - -For more details, see full documentation at https://akv2k8s.io. - - -### Installation without Helm - -If Helm is not an option in Kubernetes, use Helm on a local computer to generate the Kubernetes templates like below: - -`helm install --debug --dry-run ` - -See the individual Helm charts above for ``. +For installation instructions, see documentation at https://akv2k8s.io/installation/ ## Credits @@ -105,5 +83,5 @@ Azure Key Vault to Kubernetes is licensed under Apache License 2.0. ### Contribute to the Documentation -The documentation is located at [docs/content](docs/content). We're using Gatsby + MDX (Markdown + JSX) to generate static docs for https://akv2k8s.io. See [docs/README.md](docs/README.md) for details. +The documentation is located at [docs/source/content](docs/source/content). We're using Gatsby + MDX (Markdown + JSX) to generate static docs for https://akv2k8s.io. See [docs/README.md](docs/README.md) for details. From a4c77b673402645874dae44c6c61ed7140f4d911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 22:09:04 +0200 Subject: [PATCH 084/251] fixed issue #55 where auth with acs was not working --- cmd/azure-keyvault-secrets-webhook/main.go | 39 +++++++++++++------ cmd/azure-keyvault-secrets-webhook/pod.go | 8 ++-- .../registry.go | 9 ++++- 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 724c9828..67096fe1 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -53,9 +53,10 @@ const ( ) type azureKeyVaultConfig struct { - port string - customAuth bool - namespace string + port string + runningInsideAzureAks bool + customAuth bool + namespace string // aadPodBindingLabel string cloudConfigHostPath string serveMetrics bool @@ -66,6 +67,7 @@ type azureKeyVaultConfig struct { useAuthService bool // nameLocallyOverrideAuthService string dockerImageInspectionTimeout int + useAksCredentialsWithAcs bool authServiceName string authServicePort string caBundleConfigMapName string @@ -193,9 +195,11 @@ func healthHandler(w http.ResponseWriter, r *http.Request) { } func initConfig() { + viper.SetDefault("running_inside_azure_aks", true) viper.SetDefault("ca_config_map_name", "akv2k8s-ca") viper.SetDefault("azurekeyvault_env_image", "spvest/azure-keyvault-env:latest") viper.SetDefault("docker_image_inspection_timeout", 20) + viper.SetDefault("docker_image_inspection_use_acs_credentials", true) viper.SetDefault("use_auth_service", true) viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json") viper.SetDefault("metrics_enabled", false) @@ -216,6 +220,7 @@ func main() { config = azureKeyVaultConfig{ port: viper.GetString("port"), httpPort: viper.GetString("port_http"), + runningInsideAzureAks: viper.GetBool("running_inside_azure_aks"), customAuth: viper.GetBool("custom_auth"), serveMetrics: viper.GetBool("metrics_enabled"), certFile: viper.GetString("tls_cert_file"), @@ -227,19 +232,29 @@ func main() { caBundleConfigMapName: viper.GetString("ca_config_map_name"), cloudConfigHostPath: viper.GetString("cloud_config_host_path"), dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), + useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), + } + + if !config.runningInsideAzureAks { + config.useAksCredentialsWithAcs = false } log.Info("Active settings:") - log.Infof(" Webhook port : %s", config.port) - log.Infof(" Serve metrics : %t", config.serveMetrics) - log.Infof(" Use custom auth : %t", config.customAuth) - log.Infof(" Use auth service : %t", config.useAuthService) + log.Infof(" Running inside Azure AKS : %t", config.runningInsideAzureAks) + log.Infof(" Webhook port : %s", config.port) + log.Infof(" Serve metrics : %t", config.serveMetrics) + log.Infof(" Use custom auth : %t", config.customAuth) + log.Infof(" Use auth service : %t", config.useAuthService) if config.useAuthService { - log.Infof(" Auth service name : %s", config.authServiceName) - log.Infof(" Auth service port : %s", config.authServicePort) + log.Infof(" Auth service name : %s", config.authServiceName) + log.Infof(" Auth service port : %s", config.authServicePort) + } + if config.runningInsideAzureAks { + log.Infof(" Use AKS creds with ACS : %s", config.useAksCredentialsWithAcs) } - log.Infof(" CA ConfigMap name : %s", config.caBundleConfigMapName) - log.Infof(" Cloud config path : %s", config.cloudConfigHostPath) + log.Infof(" Docker inspection timeout : %s", config.dockerImageInspectionTimeout) + log.Infof(" CA ConfigMap name : %s", config.caBundleConfigMapName) + log.Infof(" Cloud config path : %s", config.cloudConfigHostPath) mutator := mutating.MutatorFunc(vaultSecretsMutator) metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer) @@ -248,7 +263,7 @@ func main() { podHandler := handlerFor(mutating.WebhookConfig{Name: "azurekeyvault-secrets-pods", Obj: &corev1.Pod{}}, mutator, metricsRecorder, internalLogger) var err error - if config.customAuth { + if !config.runningInsideAzureAks || config.customAuth { config.credentials, err = azure.NewFromEnvironment() if err != nil { log.Fatal(err) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index f2234a1c..dee350fc 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -118,13 +118,13 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock regCred, ok := creds[registryName] if ok { - log.Infof("found credentials to use with registry '%s'", registryName) - } else { + log.Infof("found imagePullSecrets credentials to use with registry '%s'", registryName) + } else if config.runningInsideAzureAks { regCred, ok = getAcrCredentials(registryName, container.Image) } if !ok { - log.Infof("did not find credentials to use with registry '%s' - skipping credentials", registryName) + log.Debugf("did not find credentials to use with registry during docker image inspection '%s' - skipping credentials", registryName) } autoArgs, err := getContainerCmd(container, regCred) @@ -239,7 +239,7 @@ func mutatePodSpec(pod *corev1.Pod) error { return err } - regCred, err := getRegistryCreds(*clientset, podSpec) + regCred, err := getRegistryCredsFromImagePullSecrets(*clientset, podSpec) if err != nil { return err } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 33030f27..aacbed25 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -113,7 +113,7 @@ func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { return config, nil } -func getRegistryCreds(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) (map[string]types.DockerAuthConfig, error) { +func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) (map[string]types.DockerAuthConfig, error) { creds := make(map[string]types.DockerAuthConfig) var conf struct { @@ -181,6 +181,13 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) return types.DockerAuthConfig{}, false } + //Check if cloud config file exists + _, err := os.Stat(config.cloudConfigHostPath) + if err != nil { + log.Debugf("did not find cloud config - most likely because we're not in Azure/AKS") + return types.DockerAuthConfig{}, false + } + f, err := os.Open(config.cloudConfigHostPath) if err != nil { log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) From 30d736adc1185a0d4f43dce7f52fd35f3493d41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 22:15:27 +0200 Subject: [PATCH 085/251] fixed fmt issue with int --- cmd/azure-keyvault-secrets-webhook/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 67096fe1..b08caf5f 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -250,9 +250,9 @@ func main() { log.Infof(" Auth service port : %s", config.authServicePort) } if config.runningInsideAzureAks { - log.Infof(" Use AKS creds with ACS : %s", config.useAksCredentialsWithAcs) + log.Infof(" Use AKS creds with ACS : %t", config.useAksCredentialsWithAcs) } - log.Infof(" Docker inspection timeout : %s", config.dockerImageInspectionTimeout) + log.Infof(" Docker inspection timeout : %d", config.dockerImageInspectionTimeout) log.Infof(" CA ConfigMap name : %s", config.caBundleConfigMapName) log.Infof(" Cloud config path : %s", config.cloudConfigHostPath) From a40ced3f3212ffa26901e3ebf554caf886492bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 22:49:45 +0200 Subject: [PATCH 086/251] improve success messages in ca bundle injector --- pkg/akv2k8s/controller/cabundleinjector/controller.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index 34a81526..2ef07257 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -243,7 +243,6 @@ func (c *Controller) Run(threadiness int, stopCh <-chan struct{}) error { } log.Info("Starting workers") - // Launch two workers to process AzureKeyVaultSecret resources for i := 0; i < threadiness; i++ { go wait.Until(c.runSecretWorker, time.Second, stopCh) go wait.Until(c.runNewNamespaceWorker, time.Second, stopCh) @@ -306,14 +305,16 @@ func (c *Controller) processNextWorkItem(queue workqueue.RateLimitingInterface, var err error log.Debugf("Handling '%s' in queue...", key) - successMsg = "Successfully synced CA Bundle '%s'" switch typeOfQueue { case workQueueTypeSecret: + successMsg = "Successfully synced CA Bundle from updated secret '%s' to all enabled namespaces" err = c.syncHandlerSecret(key) case workQueueTypeNewNamespace: + successMsg = "Successfully synced CA Bundle to new namespace '%s'" err = c.syncHandlerNewNamespace(key) case workQueueTypeChangedNamespace: + successMsg = "Successfully synced CA Bundle to changed namespace '%s'" err = c.syncHandlerChangedNamespace(key) } @@ -482,8 +483,8 @@ func (c *Controller) syncHandlerChangedNamespace(key string) error { return err } - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, key) - cm, err := c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) + cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) if err != nil { if errors.IsNotFound(err) { log.Debugf("configmap '%s' not found in updated namespace '%s' - creating", c.caBundleConfigMapName, key) From 2d6762963f7221568e60d7886958ee6fd27d70f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 23:20:29 +0200 Subject: [PATCH 087/251] Fixed issue where ca bundle controller fails to create configmaps when config map already exists --- .../controller/cabundleinjector/controller.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index 2ef07257..f6a6caad 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -449,7 +449,7 @@ func (c *Controller) syncHandlerNewNamespace(key string) error { } log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, key) - _, err = c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) + cm, err := c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) if err != nil { if errors.IsNotFound(err) { // if configmap does not exist, create it @@ -472,7 +472,21 @@ func (c *Controller) syncHandlerNewNamespace(key string) error { return err } - log.Debugf("configmap '%s' found in new labelled namespace '%s' - strange... ignoring", c.caBundleConfigMapName, key) + if cm != nil { + log.Debugf("configmap '%s' exists in namespace '%s' with old ca bundle - updating", c.caBundleConfigMapName, key) + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) + if err != nil { + log.Errorf("failed to update configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) + return err + } + } + return nil } From 3a1ca2df0ec8d6d077abc82a866979313e18ed8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 19 Sep 2020 23:38:56 +0200 Subject: [PATCH 088/251] Cleaned up logging --- .../controller/cabundleinjector/controller.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index f6a6caad..6f6d0cc0 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -140,7 +140,7 @@ func NewController(kubeclientset kubernetes.Interface, secretInformer coreinform // return // } - log.Debugf("Secret '%s' monitored by CA Bundle Injector added. Adding to queue.", secret.Name) + log.Infof("Secret '%s' monitored by CA Bundle Injector added. Adding to queue.", secret.Name) controller.enqueueSecret(obj) }, UpdateFunc: func(old, new interface{}) { // When CA Bundle gets changed in akv2k8s @@ -157,7 +157,7 @@ func NewController(kubeclientset kubernetes.Interface, secretInformer coreinform return } secret := new.(*corev1.Secret) - log.Debugf("Secret '%s' monitored by CA Bundle Injector changed. Handling.", secret.Name) + log.Infof("Secret '%s' monitored by CA Bundle Injector changed. Handling.", secret.Name) controller.enqueueSecret(new) }, DeleteFunc: func(obj interface{}) { // When CA Bundle gets deleted in akv2k8s @@ -167,7 +167,7 @@ func NewController(kubeclientset kubernetes.Interface, secretInformer coreinform return } - log.Debugf("Secret '%s' monitored by CA Bundle Injector deleted. Handling.", secret.Name) + log.Infof("Secret '%s' monitored by CA Bundle Injector deleted. Handling.", secret.Name) controller.enqueueSecret(obj) }, }) @@ -180,7 +180,7 @@ func NewController(kubeclientset kubernetes.Interface, secretInformer coreinform return } - log.Debugf("Namespace '%s' labeled '%s' will be monitored by CA Bundle Injector. Adding to queue.", ns.Name, lbl) + log.Infof("Namespace '%s' labeled '%s' will be monitored by CA Bundle Injector. Adding to queue.", ns.Name, lbl) controller.enqueueNewNamespace(obj) }, UpdateFunc: func(old, new interface{}) { // When an existing namespace gets updated, that potentually have akv2k8s label on it @@ -202,7 +202,7 @@ func NewController(kubeclientset kubernetes.Interface, secretInformer coreinform } ns := new.(*corev1.Namespace) - log.Debugf("labels in namespace '%s' changed, handling.", ns.Name) + log.Infof("labels in namespace '%s' changed, handling.", ns.Name) controller.enqueueChangedNamespace(new) }, // DeleteFunc: func(obj interface{}) { @@ -382,7 +382,7 @@ func (c *Controller) syncHandlerSecret(key string) error { return err } - log.Debugf("looping all labelled namespaces looking for config map '%s'", c.caBundleConfigMapName) + log.Infof("looping all labelled namespaces looking for config map '%s' to update", c.caBundleConfigMapName) for _, ns := range labelledNamespaces { configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) @@ -463,7 +463,6 @@ func (c *Controller) syncHandlerNewNamespace(key string) error { newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { - log.Errorf("failed to create configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) return err } return nil @@ -482,7 +481,6 @@ func (c *Controller) syncHandlerNewNamespace(key string) error { newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) if err != nil { - log.Errorf("failed to update configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) return err } } @@ -510,7 +508,6 @@ func (c *Controller) syncHandlerChangedNamespace(key string) error { newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { - log.Errorf("failed to create configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) return err } return nil From 1bb2e3c110282fcab46d46a681757f44175e2546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 20 Sep 2020 02:38:39 +0200 Subject: [PATCH 089/251] updated with new secret key value --- .github/workflows/ca-bundle-controller-build.yaml | 2 +- pkg/akv2k8s/controller/cabundleinjector/controller.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index a40f6624..d8ab11ce 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -37,7 +37,7 @@ jobs: with: build-make-action: build-ca-bundle-controller - - name: Push}} + - name: Push uses: ./.github/actions/push with: push-make-action: push-ca-bundle-controller diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index 6f6d0cc0..acb2251a 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -537,7 +537,7 @@ func (c *Controller) isNamespacesLabelled(ns *corev1.Namespace) bool { } func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigMap { - dataByte := secret.Data["caCert"] + dataByte := secret.Data["ca.crt"] return &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: name, From 95c11735a74fd74b73e7c9f1140052c4710caf42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 20 Sep 2020 09:09:08 +0200 Subject: [PATCH 090/251] support log format fmt and json --- cmd/azure-keyvault-secrets-webhook/main.go | 43 ++++++++++++++-------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index b08caf5f..2386f901 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -53,19 +53,17 @@ const ( ) type azureKeyVaultConfig struct { - port string - runningInsideAzureAks bool - customAuth bool - namespace string - // aadPodBindingLabel string - cloudConfigHostPath string - serveMetrics bool - httpPort string - certFile string - keyFile string - caFile string - useAuthService bool - // nameLocallyOverrideAuthService string + port string + runningInsideAzureAks bool + customAuth bool + namespace string + cloudConfigHostPath string + serveMetrics bool + httpPort string + certFile string + keyFile string + caFile string + useAuthService bool dockerImageInspectionTimeout int useAksCredentialsWithAcs bool authServiceName string @@ -108,6 +106,17 @@ func setLogLevel(logLevel string) { log.SetLevel(logrusLevel) } +func setLogFormat(logFormat string) { + switch logFormat { + case "fmt": + log.SetFormatter(&log.TextFormatter{}) + case "json": + log.SetFormatter(&log.JSONFormatter{}) + default: + log.Warnf("Log format %s not supported - using default fmt", logFormat) + } +} + func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { req := whcontext.GetAdmissionRequest(ctx) config.namespace = req.Namespace @@ -205,7 +214,8 @@ func initConfig() { viper.SetDefault("metrics_enabled", false) viper.SetDefault("port_http", "80") viper.SetDefault("port", "443") - + viper.SetDefault("log_level", "Info") + viper.SetDefault("log_format", "fmt") viper.AutomaticEnv() } @@ -214,9 +224,12 @@ func main() { initConfig() fmt.Fprintln(os.Stdout, "config initialized") - logLevel := viper.GetString("LOG_LEVEL") + logLevel := viper.GetString("log_level") setLogLevel(logLevel) + logFormat := viper.GetString("log_format") + setLogFormat(logFormat) + config = azureKeyVaultConfig{ port: viper.GetString("port"), httpPort: viper.GetString("port_http"), From 843fb23503e920a33c1bac3bc145de152d691257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 20 Sep 2020 09:42:30 +0200 Subject: [PATCH 091/251] Remove auto push tags --- Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Makefile b/Makefile index b515d69e..7080bcd5 100644 --- a/Makefile +++ b/Makefile @@ -43,23 +43,18 @@ tag-all: tag-crd tag-webhook tag-controller tag-ca-bundle-controller tag-vaulten tag-crd: check-tag git tag -a crd-$(TAG) -m "CRD version $(TAG)" - git push --tags tag-webhook: check-tag git tag -a webhook-$(TAG) -m "Webhook version $(TAG)" - git push --tags tag-controller: check-tag git tag -a controller-$(TAG) -m "Controller version $(TAG)" - git push --tags tag-ca-bundle-controller: check-tag git tag -a ca-bundle-controller-$(TAG) -m "CA Bundle Controller version $(TAG)" - git push --tags tag-vaultenv: check-tag git tag -a vaultenv-$(TAG) -m "Vaultenv version $(TAG)" - git push --tags check-tag: ifndef TAG From 77b03df362135b58c224fc455672f4f2bd511ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 20 Sep 2020 09:43:17 +0200 Subject: [PATCH 092/251] support json logging #88 --- cmd/azure-keyvault-controller/main.go | 22 ++++++++++++++---- cmd/azure-keyvault-env/main.go | 22 +++++++++++++----- cmd/azure-keyvault-secrets-webhook/main.go | 5 ++++- cmd/ca-bundle-controller/main.go | 26 ++++++++++++++++------ 4 files changed, 57 insertions(+), 18 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 6ca07c5d..ab299d66 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -60,10 +60,10 @@ const controllerAgentName = "azurekeyvaultcontroller" func main() { flag.Parse() - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) + logFormat := "fmt" + logFormat, _ = os.LookupEnv("LOG_FORMAT") + + setLogFormat(logFormat) // set up signals so we handle the first shutdown signal gracefully stopCh := signals.SetupSignalHandler() @@ -166,6 +166,20 @@ func init() { flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") } +func setLogFormat(logFormat string) { + switch logFormat { + case "fmt": + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) + case "json": + log.SetFormatter(&log.JSONFormatter{}) + default: + log.Warnf("Log format %s not supported - using default fmt", logFormat) + } +} + func setLogLevel() { if logLevel == "" { var ok bool diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 38e8e699..8273d00d 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -59,11 +59,18 @@ type stop struct { error } -func formatLogger() { - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) +func formatLogger(logFormat string) { + switch logFormat { + case "fmt": + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) + case "json": + log.SetFormatter(&log.JSONFormatter{}) + default: + log.Warnf("Log format %s not supported - using default fmt", logFormat) + } logger = log.WithFields(log.Fields{ "component": "akv2k8s", @@ -117,6 +124,8 @@ func initConfig() { viper.SetDefault("env_injector_custom_auth", false) viper.SetDefault("env_injector_use_auth_service", true) viper.SetDefault("env_injector_skip_args_validation", false) + viper.SetDefault("env_injector_log_level", "Info") + viper.SetDefault("env_injector_log_format", "fmt") viper.AutomaticEnv() } @@ -150,7 +159,8 @@ func main() { logLevel := viper.GetString("env_injector_log_level") setLogLevel(logLevel) - formatLogger() + logFormat := viper.GetString("env_injector_log_format") + formatLogger(logFormat) logger.Debugf("azure key vault env injector initializing") diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 2386f901..d80f07bc 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -109,7 +109,10 @@ func setLogLevel(logLevel string) { func setLogFormat(logFormat string) { switch logFormat { case "fmt": - log.SetFormatter(&log.TextFormatter{}) + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) case "json": log.SetFormatter(&log.JSONFormatter{}) default: diff --git a/cmd/ca-bundle-controller/main.go b/cmd/ca-bundle-controller/main.go index 58509b15..d3c61e65 100644 --- a/cmd/ca-bundle-controller/main.go +++ b/cmd/ca-bundle-controller/main.go @@ -42,6 +42,7 @@ var ( kubeconfig string cloudconfig string logLevel string + logFormat string azureVaultFastRate time.Duration azureVaultSlowRate time.Duration @@ -54,14 +55,9 @@ const controllerAgentName = "ca-bundle-controller" func main() { flag.Parse() - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) - // set up signals so we handle the first shutdown signal gracefully stopCh := signals.SetupSignalHandler() - setLogLevel() + initLog() akvLabelName, err := getEnvStr("AKV_LABEL_NAME", "azure-key-vault-env-injection") if err != nil { @@ -128,7 +124,7 @@ func init() { flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") } -func setLogLevel() { +func initLog() { if logLevel == "" { var ok bool if logLevel, ok = os.LookupEnv("LOG_LEVEL"); !ok { @@ -142,6 +138,22 @@ func setLogLevel() { } log.SetLevel(logrusLevel) log.Printf("Log level set to '%s'", logrusLevel.String()) + + logFormat := "fmt" + logFormat, _ = os.LookupEnv("LOG_FORMAT") + + switch logFormat { + case "fmt": + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) + case "json": + log.SetFormatter(&log.JSONFormatter{}) + default: + log.Warnf("Log format %s not supported - using default fmt", logFormat) + } + } func getEnvDuration(key string, fallback time.Duration) (time.Duration, error) { From 0715166288092631f012f0eb59b38cb7eb552a87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 21 Sep 2020 00:25:21 +0200 Subject: [PATCH 093/251] Fixed typo in log statement --- cmd/azure-keyvault-controller/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index ab299d66..42fa8ce3 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -87,7 +87,7 @@ func main() { customAuth, err = getEnvBool("CUSTOM_AUTH", false) if err != nil { - log.Fatalf("Error parsing env var AZURE_VAULT_MAX_FAILURE_ATTEMPTS: %s", err.Error()) + log.Fatalf("Error parsing env var CUSTOM_AUTH: %s", err.Error()) } cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) From 803aba7aae2536dd45cb4e1de2cb4617b35ede14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 21 Sep 2020 00:25:43 +0200 Subject: [PATCH 094/251] Updated installation instructions to use new chart --- docs/gatsby-config.js | 6 ---- .../installation/installing-with-helm.md | 34 ++++++------------- .../installation/installing-without-helm.md | 25 ++------------ .../content/installation/requirements.md | 2 +- .../installation/updating-with-helm.md | 34 ------------------- 5 files changed, 13 insertions(+), 88 deletions(-) delete mode 100644 docs/source/content/installation/updating-with-helm.md diff --git a/docs/gatsby-config.js b/docs/gatsby-config.js index 9aef4f43..9c15625e 100644 --- a/docs/gatsby-config.js +++ b/docs/gatsby-config.js @@ -71,7 +71,6 @@ module.exports = { 'installation/requirements', 'installation/installing-with-helm', 'installation/installing-without-helm', - 'installation/updating-with-helm', ], Tutorials: [ 'tutorials/index', @@ -91,9 +90,6 @@ module.exports = { 'security/authorization', 'security/enable-env-injection', ], - 'Availability': [ - 'getting-started/scaling', - ], Troubleshooting: [ 'troubleshooting/controller-log', 'troubleshooting/env-injector-log-level', @@ -102,8 +98,6 @@ module.exports = { Reference: [ 'reference/index', 'reference/azure-key-vault-secret', - 'stable/azure-key-vault-controller/README', - 'stable/azure-key-vault-env-injector/README', ], }, navConfig: {}, diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md index 080c0e86..e463bf25 100644 --- a/docs/source/content/installation/installing-with-helm.md +++ b/docs/source/content/installation/installing-with-helm.md @@ -5,26 +5,31 @@ description: "How to install Azure Key Vault to Kubernetes with Helm" > Make sure to check the [requirements](requirements) before installing. -Before installing the Chart, the Custom Resource Definition must be installed, by pointing to the correct version: +## Installing the AzureKeyVaultSecret CRD + +Before installing the Chart, the Custom Resource Definition for AzureKeyVaultSecret must be installed by pointing to the correct version: ``` kubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/{{ version }}/crds/AzureKeyVaultSecret.yaml ``` -E.g. for version 1.1.0 use: +For the latest version (`1.1.0`) run: ``` https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/crd-1.1.0/crds/AzureKeyVaultSecret.yaml ``` +## Create a dedicated namespace + A dedicated namespace needs to be created for akv2k8s: ```bash kubectl create ns akv2k8s ``` -## Installing with Helm on Azure AKS +## Installation +### Installing with Helm on Azure AKS Add Helm repository: @@ -43,13 +48,9 @@ helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-inje --namespace akv2k8s ``` -For more details about installation options, see the -individual Helm charts: +For more details about installation options, see the [Helm chart for akv2k8s](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s): -* [Controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller/README.md) -* [Env Injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector/README.md) - -## Installing with Helm outside Azure AKS +### Installing with Helm outside Azure AKS When running inside Azure AKS, akv2k8s will use the AKS cluster credentials by default to authenticate with Azure Key Vault. Outside Azure AKS - credentials must be provided by setting `keyVault.customAuth=true` and provide credentials as documentend under [Authentication](../security/authentication) for more details. @@ -82,19 +83,4 @@ helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-inje --set env.AZURE_TENANT_ID= \ --set env.AZURE_CLIENT_ID= \ --set env.AZURE_CLIENT_SECRET= -``` - -## Installing with Helm for akv2k8s versions < 1.1.0 - -> Helm charts prior to version 1.1.0 installed the Azure Key Vault Secret CRD as part of the Helm chart. As [documented by Helm](https://helm.sh/docs/chart_best_practices/custom_resource_definitions/), this has its drawbacks and we decided to handle the CRD outside of Helm for versions >= 1.1.0. - -For akv2k8s versions < 1.1.0 we need to tell Helm NOT to install the CRD for the second Chart, setting `installCrd=false`: - -```bash -helm upgrade -i azure-key-vault-controller spv-charts/azure-key-vault-controller \ - --namespace akv2k8s - -helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ - --set installCrd=false \ - --namespace akv2k8s ``` \ No newline at end of file diff --git a/docs/source/content/installation/installing-without-helm.md b/docs/source/content/installation/installing-without-helm.md index 2059f787..836de776 100644 --- a/docs/source/content/installation/installing-without-helm.md +++ b/docs/source/content/installation/installing-without-helm.md @@ -7,25 +7,7 @@ Make sure to check the [requirements](requirements) before installing. If Helm is not an option, use Helm on a local computer to generate the Kubernetes templates like below. -## Helm 2 - -Add Helm repository: - -```bash -helm repo add spv-charts http://charts.spvapi.no -helm repo update -``` - -Render akv2k8s charts locally: - -```bash -helm install --debug --dry-run azure-key-vault-controller spv-charts/azure-key-vault-controller - --namespace akv2k8s -helm install --debug --dry-run azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ - --set installCrd=false --namespace akv2k8s -``` - -## Helm 3 +## Using Helm 3 Download the Git repository: @@ -43,7 +25,4 @@ helm template azure-key-vault-env-injector ./stable/azure-key-vault-env-injector ## Options and more -For more details about installation options, see the individual Helm charts: - -* Controller: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller -* Env Injector: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector +For more details about installation options, see the [Helm chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s) \ No newline at end of file diff --git a/docs/source/content/installation/requirements.md b/docs/source/content/installation/requirements.md index c5003d9e..eddc22e5 100644 --- a/docs/source/content/installation/requirements.md +++ b/docs/source/content/installation/requirements.md @@ -7,7 +7,7 @@ description: "Requirements for installing akv2k8s" * A dedicated kubernetes namespace (e.g. akv2k8s) * Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook * RBAC enabled -* Default [authentication](../security/authentication) requires Kubernetes cluster running in Azure - use [custom authentication](../security/authentication) if running outside Azure +* Default [authentication](../security/authentication) requires Azure AKS - use [custom authentication](../security/authentication) if running outside Azure AKS. ## Dedicated namespace for akv2k8s diff --git a/docs/source/content/installation/updating-with-helm.md b/docs/source/content/installation/updating-with-helm.md deleted file mode 100644 index 2742d114..00000000 --- a/docs/source/content/installation/updating-with-helm.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "Upgrading with Helm" -description: "How to update Azure Key Vault to Kubernetes with Helm" ---- - -Update Helm repository: - -```bash -helm repo update -``` - -Update both Controller and Env-Injector: - -```bash -helm upgrade azure-key-vault-controller \ - spv-charts/azure-key-vault-controller \ - --namespace akv2k8s - --set installCrd=false \ - - -helm install azure-key-vault-env-injector \ - spv-charts/azure-key-vault-env-injector \ - --namespace akv2k8s - --set installCrd=false \ - -``` - -> **Note: It's important that you set `--set installCrd=false`, because in a existing installation the CRD already exists.** - -For more details about installation options, see the -individual Helm charts: - -* [Controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller/README.md) -* [Env Injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/stable/azure-key-vault-env-injector/README.md) From 2bc3dc2c6ca6ea21b250c6e3674c8959a296a16e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 21 Sep 2020 00:33:10 +0200 Subject: [PATCH 095/251] #104 - pass on labels and annotations from AzureKeyVaultSecret to Kubernetes Secret --- cmd/azure-keyvault-controller/controller/handler.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 1eaf81b9..477e88b5 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -352,8 +352,10 @@ func createNewSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretVa return &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: secretName, - Namespace: azureKeyVaultSecret.Namespace, + Name: secretName, + Namespace: azureKeyVaultSecret.Namespace, + Labels: azureKeyVaultSecret.Labels, + Annotations: azureKeyVaultSecret.Annotations, OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(azureKeyVaultSecret, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, From 1a50806f47d16469265ab6bf62b348e86f976308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 21 Sep 2020 01:03:44 +0200 Subject: [PATCH 096/251] push tags after applied --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7080bcd5..123cfa8c 100644 --- a/Makefile +++ b/Makefile @@ -39,22 +39,27 @@ print-v-vaultenv: print-v-ca-bundle-controller: @echo $(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) -tag-all: tag-crd tag-webhook tag-controller tag-ca-bundle-controller tag-vaultenv +tag-all: tag-webhook tag-controller tag-ca-bundle-controller tag-vaultenv tag-crd: check-tag git tag -a crd-$(TAG) -m "CRD version $(TAG)" + git push --tags tag-webhook: check-tag git tag -a webhook-$(TAG) -m "Webhook version $(TAG)" + git push --tags tag-controller: check-tag git tag -a controller-$(TAG) -m "Controller version $(TAG)" + git push --tags tag-ca-bundle-controller: check-tag git tag -a ca-bundle-controller-$(TAG) -m "CA Bundle Controller version $(TAG)" + git push --tags tag-vaultenv: check-tag git tag -a vaultenv-$(TAG) -m "Vaultenv version $(TAG)" + git push --tags check-tag: ifndef TAG From c60754fdc81a77836a1e2fa71c00296a748ccec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 22 Sep 2020 11:32:58 +0200 Subject: [PATCH 097/251] More detailed logging trying to get acr credentials --- cmd/azure-keyvault-secrets-webhook/main.go | 2 -- cmd/azure-keyvault-secrets-webhook/registry.go | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index d80f07bc..77ea90a5 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -62,7 +62,6 @@ type azureKeyVaultConfig struct { httpPort string certFile string keyFile string - caFile string useAuthService bool dockerImageInspectionTimeout int useAksCredentialsWithAcs bool @@ -241,7 +240,6 @@ func main() { serveMetrics: viper.GetBool("metrics_enabled"), certFile: viper.GetString("tls_cert_file"), keyFile: viper.GetString("tls_private_key_file"), - caFile: viper.GetString("tls_ca_file"), useAuthService: viper.GetBool("use_auth_service"), authServiceName: viper.GetString("webhook_auth_service"), authServicePort: viper.GetString("webhook_auth_service_port"), diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index aacbed25..b08cfb1f 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -178,6 +178,7 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) isAcr, wildcardHost := hostIsAzureContainerRegistry(host) if !isAcr { + log.Debugf("docker container registry is not a azure container registry") return types.DockerAuthConfig{}, false } @@ -203,6 +204,7 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) dockerConfList, err := cloudCnfProvider.GetAcrCredentials(image) if err != nil { + log.Errorf("failed getting azure acr credentials, error: %+v", err) return types.DockerAuthConfig{}, false } @@ -211,6 +213,7 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) return dockerConf, true } + log.Warnf("no acr credentials found for %s", host) return types.DockerAuthConfig{}, false } From e296524f9f82ba8f8ef20eb34e0a772631bb2b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 22 Sep 2020 20:18:59 +0200 Subject: [PATCH 098/251] improved logging --- cmd/azure-keyvault-secrets-webhook/pod.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index dee350fc..f5f837fb 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -119,8 +119,11 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock if ok { log.Infof("found imagePullSecrets credentials to use with registry '%s'", registryName) - } else if config.runningInsideAzureAks { + } else if config.runningInsideAzureAks && config.useAksCredentialsWithAcs { + log.Info("we are running inside azure aks, trying to get acr credentials") regCred, ok = getAcrCredentials(registryName, container.Image) + } else { + log.Debugf("not trying to get acr credentials, as we are not on aks or configured to not use aks credentials with acr") } if !ok { From 2c724b223cb90bba0d607e52b807b3cc2096ad92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 22 Sep 2020 20:41:40 +0200 Subject: [PATCH 099/251] Improved logging when getting acr credentials --- cmd/azure-keyvault-secrets-webhook/registry.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index b08cfb1f..fecd61b0 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -209,6 +209,7 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) } if len(dockerConfList) > 0 { + log.Infof("found azure acr credentials for %s", host) dockerConf := dockerConfList[wildcardHost] return dockerConf, true } From 7997f64f653a7e3b7207686fe97e2d21d2df1316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 22 Sep 2020 20:55:36 +0200 Subject: [PATCH 100/251] Improved logging when getting acr credentials --- cmd/azure-keyvault-secrets-webhook/registry.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index fecd61b0..aa0c1279 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -209,8 +209,8 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) } if len(dockerConfList) > 0 { - log.Infof("found azure acr credentials for %s", host) dockerConf := dockerConfList[wildcardHost] + log.Debugf("found azure acr credentials for %s with userid %s", host, dockerConf.Username) return dockerConf, true } From ee9f1f0b8e89eb761ab51ca133beb99356393c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 22 Sep 2020 22:09:21 +0200 Subject: [PATCH 101/251] added missing close on docker image inspection --- cmd/azure-keyvault-secrets-webhook/registry.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index aa0c1279..b6313a7e 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -85,7 +85,7 @@ func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { ref, err := alltransports.ParseImageName(opts.image) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to parse docker image name: %+v", err) } sys := &types.SystemContext{ @@ -103,11 +103,13 @@ func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { abc, err := ref.NewImage(ctx, sys) if err != nil { - return nil, fmt.Errorf("error parsing image name %q: %v", opts.image, err) + return nil, fmt.Errorf("failed to get docker image %q: %+v", opts.image, err) } + defer abc.Close() + config, err := abc.OCIConfig(ctx) if err != nil { - return nil, fmt.Errorf("error reading OCI-formatted configuration data: %v", err) + return nil, fmt.Errorf("error reading OCI-formatted configuration data: %+v", err) } return config, nil From f08358e423db243188854db7badf7a205fe6c89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 22 Sep 2020 23:20:29 +0200 Subject: [PATCH 102/251] Added test for pulling docker image config with sha image notation --- .../registry_test.go | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/registry_test.go b/cmd/azure-keyvault-secrets-webhook/registry_test.go index 2478c2a1..4b380793 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry_test.go +++ b/cmd/azure-keyvault-secrets-webhook/registry_test.go @@ -1,12 +1,10 @@ package main import ( - "fmt" "testing" "github.com/containers/image/v5/types" "github.com/ghodss/yaml" - log "github.com/sirupsen/logrus" ) func TestDockerPull(t *testing.T) { @@ -32,8 +30,37 @@ func TestDockerPull(t *testing.T) { if len(cmd) == 0 { t.Errorf("no entrypoint nor cmd found there is something wrong.") - fmt.Print(yaml.Marshal(manifest.Config)) + t.Log(yaml.Marshal(manifest.Config)) } - log.Infof("cmd found: %v", cmd) + t.Logf("cmd found: %v", cmd) +} + +func TestDockerPullWithShaImageNotation(t *testing.T) { + config.dockerImageInspectionTimeout = 20 + + opts := imageOptions{ + image: "spvest/azure-keyvault-webhook@sha256:38a78fde88bd3bf023606ac3a2219b0803457734cb2e7bb80b55d36450cc71f1", + credentials: types.DockerAuthConfig{}, + architecture: "amd64", + osChoice: "linux", + } + + manifest, err := opts.getConfigFromManifest() + + if err != nil { + t.Errorf("failed somewhere in get manifest %+v", err) + return + } + + var cmd []string + cmd = append(cmd, manifest.Config.Entrypoint...) + cmd = append(cmd, manifest.Config.Cmd...) + + if len(cmd) == 0 { + t.Errorf("no entrypoint nor cmd found there is something wrong.") + t.Log(yaml.Marshal(manifest.Config)) + } + + t.Logf("cmd found: %v", cmd) } From 43963af1f55eb9631320a2eece5b9f2b98afdea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 12:32:17 +0200 Subject: [PATCH 103/251] add logging to auth --- pkg/azure/credential.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/pkg/azure/credential.go b/pkg/azure/credential.go index 8e593972..976408f9 100644 --- a/pkg/azure/credential.go +++ b/pkg/azure/credential.go @@ -36,6 +36,7 @@ import ( "github.com/spf13/pflag" azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" + log "github.com/sirupsen/logrus" "k8s.io/legacy-cloud-providers/azure/auth" "sigs.k8s.io/yaml" ) @@ -133,7 +134,9 @@ func (c CloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, erro cfg := DockerConfig{} if c.config.UseManagedIdentityExtension { + log.Debug("getting acr credentials using managed identity") if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { + log.Infof("image(%s) is not from ACR, skip MSI authentication", image) } else { if cred, err := getACRDockerEntryFromARMToken(c.config, c.servicePrincipalToken, loginServer); err == nil { cfg[loginServer] = *cred @@ -308,21 +311,21 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E } if config.UseManagedIdentityExtension { - // klog.V(2).Infoln("azure: using managed identity extension to retrieve access token") + log.Debug("azure: using managed identity extension to retrieve access token") msiEndpoint, err := adal.GetMSIVMEndpoint() if err != nil { return nil, nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) } if len(config.UserAssignedIdentityID) > 0 { - // klog.V(4).Info("azure: using User Assigned MSI ID to retrieve access token") + log.Debug("azure: using User Assigned MSI ID to retrieve access token") token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, env.ResourceIdentifiers.KeyVault, config.UserAssignedIdentityID) return token, config, err } - // klog.V(4).Info("azure: using System Assigned MSI to retrieve access token") + log.Debug("azure: using System Assigned MSI to retrieve access token") token, err := adal.NewServicePrincipalTokenFromMSI( msiEndpoint, env.ResourceIdentifiers.KeyVault) @@ -336,7 +339,7 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E } if len(config.AADClientSecret) > 0 { - // klog.V(2).Infoln("azure: using client_id+client_secret to retrieve access token") + log.Debug("azure: using client_id+client_secret to retrieve access token") token, err := adal.NewServicePrincipalToken( *oauthConfig, config.AADClientID, @@ -347,7 +350,7 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E } if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 { - // klog.V(2).Infoln("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") + log.Debug("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") certData, err := ioutil.ReadFile(config.AADClientCertPath) if err != nil { return nil, nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) @@ -412,17 +415,19 @@ func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.Ser } armAccessToken := token.OAuthToken() + log.Debugf("discovering auth redirects for: %s", loginServer) directive, err := receiveChallengeFromLoginServer(loginServer) if err != nil { return nil, fmt.Errorf("failed to receive challenge: %s", err) } - registryRefreshToken, err := performTokenExchange( - loginServer, directive, config.TenantID, armAccessToken) + log.Debug("exchanging an acr refresh_token") + registryRefreshToken, err := performTokenExchange(loginServer, directive, config.TenantID, armAccessToken) if err != nil { return nil, fmt.Errorf("failed to perform token exchange: %s", err) } + log.Debugf("adding ACR docker config entry for: %s", loginServer) return &docker.DockerAuthConfig{ Username: dockerTokenLoginUsernameGUID, Password: registryRefreshToken, From a7ae89f9494076b79bfdae6f35fab7bc9740c79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 16:56:46 +0200 Subject: [PATCH 104/251] log when auth token received --- cmd/azure-keyvault-env/authentication.go | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go index 402140c1..a825dd80 100644 --- a/cmd/azure-keyvault-env/authentication.go +++ b/cmd/azure-keyvault-env/authentication.go @@ -34,21 +34,6 @@ import ( ) func createHTTPClientWithTrustedCA(caCert []byte) (*http.Client, error) { - // caURL := fmt.Sprintf("http://%s/ca", host) - // client := &http.Client{ - // Timeout: time.Second * 10, - // } - - // res, err := client.Get(caURL) - // if err != nil { - // return nil, err - // } - - // defer res.Body.Close() - // caCert, err := ioutil.ReadAll(res.Body) - // if err != nil { - // return nil, err - // } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) @@ -93,6 +78,7 @@ func getCredentials(useAuthService bool, authServiceAddress, caCert string) (azu return nil, fmt.Errorf("failed to decode body, error %+v", err) } + logger.Info("successfully received oauth token") return creds, nil } From 70bb32df559661df3970fce7f7e80bc81fc303f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 16:58:49 +0200 Subject: [PATCH 105/251] fix example cmd for applying crd --- docs/source/content/installation/installing-with-helm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md index e463bf25..93dd8ce5 100644 --- a/docs/source/content/installation/installing-with-helm.md +++ b/docs/source/content/installation/installing-with-helm.md @@ -16,7 +16,7 @@ kubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vau For the latest version (`1.1.0`) run: ``` -https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/crd-1.1.0/crds/AzureKeyVaultSecret.yaml +ubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/crd-1.1.0/crds/AzureKeyVaultSecret.yaml ``` ## Create a dedicated namespace From 0de7c677474dbe6d49657f58c3adbdde4e5d9896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 17:00:07 +0200 Subject: [PATCH 106/251] update how we get acr credentials --- pkg/azure/credential.go | 99 ++++++++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 30 deletions(-) diff --git a/pkg/azure/credential.go b/pkg/azure/credential.go index 976408f9..c2c0e06e 100644 --- a/pkg/azure/credential.go +++ b/pkg/azure/credential.go @@ -14,9 +14,12 @@ // // Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go) +// Todo: Needs refactoring + package azure import ( + "context" "crypto/rsa" "crypto/x509" "encoding/json" @@ -29,6 +32,7 @@ import ( "golang.org/x/crypto/pkcs12" + "github.com/Azure/azure-sdk-for-go/services/containerregistry/mgmt/2017-10-01/containerregistry" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/adal" "github.com/Azure/go-autorest/autorest/azure" @@ -61,6 +65,7 @@ type CloudConfigProvider struct { config *auth.AzureAuthConfig environment *azure.Environment servicePrincipalToken *adal.ServicePrincipalToken + registryClient RegistriesClient } // Credentials has credentials needed to authenticate with azure key vault. @@ -87,6 +92,44 @@ type crendentialsToken struct { token string } +// RegistriesClient is a testable interface for the ACR client List operation. +type RegistriesClient interface { + List(ctx context.Context) ([]containerregistry.Registry, error) +} + +// azRegistriesClient implements RegistriesClient. +type azRegistriesClient struct { + client containerregistry.RegistriesClient +} + +func newAzRegistriesClient(subscriptionID, endpoint string, token *adal.ServicePrincipalToken) *azRegistriesClient { + registryClient := containerregistry.NewRegistriesClient(subscriptionID) + registryClient.BaseURI = endpoint + registryClient.Authorizer = autorest.NewBearerAuthorizer(token) + + return &azRegistriesClient{ + client: registryClient, + } +} + +func (az *azRegistriesClient) List(ctx context.Context) ([]containerregistry.Registry, error) { + iterator, err := az.client.ListComplete(ctx) + if err != nil { + return nil, err + } + + result := make([]containerregistry.Registry, 0) + for ; iterator.NotDone(); err = iterator.Next() { + if err != nil { + return nil, err + } + + result = append(result, iterator.Value()) + } + + return result, nil +} + // NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { authSettings, err := azureAuth.GetSettingsFromEnvironment() @@ -100,10 +143,13 @@ func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { return nil, err } + registryClient := newAzRegistriesClient(config.SubscriptionID, authSettings.Environment.ResourceManagerEndpoint, token) + return &CloudConfigProvider{ config: config, environment: &authSettings.Environment, servicePrincipalToken: token, + registryClient: registryClient, }, nil } @@ -129,18 +175,32 @@ func (c CloudConfigProvider) GetCredentials() (Credentials, error) { }, nil } +func getLoginServer(registry containerregistry.Registry) string { + return *(*registry.RegistryProperties).LoginServer +} + // GetAcrCredentials will get Docker credentials for Azure Container Registry func (c CloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, error) { cfg := DockerConfig{} + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() if c.config.UseManagedIdentityExtension { - log.Debug("getting acr credentials using managed identity") - if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { - log.Infof("image(%s) is not from ACR, skip MSI authentication", image) - } else { - if cred, err := getACRDockerEntryFromARMToken(c.config, c.servicePrincipalToken, loginServer); err == nil { - cfg[loginServer] = *cred + log.Debug("listing registries") + + result, err := c.registryClient.List(ctx) + if err != nil { + return nil, fmt.Errorf("Failed to list registries: %v", err) + } + + for ix := range result { + loginServer := getLoginServer(result[ix]) + log.Debugf("loginServer: %s", loginServer) + cred, err := getACRDockerEntryFromARMToken(c.config, c.servicePrincipalToken, loginServer) + if err != nil { + continue } + cfg[loginServer] = *cred } } else { // Add our entry for each of the supported container registry URLs @@ -151,27 +211,6 @@ func (c CloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, erro } cfg[url] = *cred } - - // Handle the custom cloud case - // In clouds where ACR is not yet deployed, the string will be empty - if c.environment != nil && strings.Contains(c.environment.ContainerRegistryDNSSuffix, ".azurecr.") { - customAcrSuffix := "*" + c.environment.ContainerRegistryDNSSuffix - hasBeenAdded := false - for _, url := range containerRegistryUrls { - if strings.EqualFold(url, customAcrSuffix) { - hasBeenAdded = true - break - } - } - - if !hasBeenAdded { - cred := &docker.DockerAuthConfig{ - Username: c.config.AADClientID, - Password: c.config.AADClientSecret, - } - cfg[customAcrSuffix] = *cred - } - } } // add ACR anonymous repo support: use empty username and password for anonymous access @@ -410,9 +449,9 @@ func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, error) { func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { // Run EnsureFresh to make sure the token is valid and does not expire - if err := token.EnsureFresh(); err != nil { - return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) - } + // if err := token.EnsureFresh(); err != nil { + // return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) + // } armAccessToken := token.OAuthToken() log.Debugf("discovering auth redirects for: %s", loginServer) From 3b2364c5078d3a4f9ccf9ea6045863b24f1cd17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 19:31:07 +0200 Subject: [PATCH 107/251] Refactored azure credentials --- cmd/azure-keyvault-controller/main.go | 8 +- cmd/azure-keyvault-env/authentication.go | 8 +- cmd/azure-keyvault-secrets-webhook/main.go | 8 +- .../registry.go | 8 +- .../token_test.go | 6 +- pkg/azure/credentialprovider/acr.go | 220 ++++++++++++++++++ .../akv.go} | 209 +++-------------- .../credential_helper.go | 2 +- .../credential_test.go | 2 +- .../keyvault/client/azure_keyvault_service.go | 7 +- .../client/azure_keyvault_service_test.go | 2 +- 11 files changed, 275 insertions(+), 205 deletions(-) create mode 100644 pkg/azure/credentialprovider/acr.go rename pkg/azure/{credential.go => credentialprovider/akv.go} (68%) rename pkg/azure/{ => credentialprovider}/credential_helper.go (99%) rename pkg/azure/{ => credentialprovider}/credential_test.go (99%) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 42fa8ce3..2f6d9a6a 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -36,7 +36,7 @@ import ( "k8s.io/client-go/tools/record" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/cmd/azure-keyvault-controller/controller" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" @@ -118,9 +118,9 @@ func main() { eventBroadcaster.StartLogging(log.Tracef) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) - var vaultAuth azure.Credentials + var vaultAuth credentialprovider.Credentials if customAuth { - if vaultAuth, err = azure.NewFromEnvironment(); err != nil { + if vaultAuth, err = credentialprovider.NewFromEnvironment(); err != nil { log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) } } else { @@ -130,7 +130,7 @@ func main() { } defer f.Close() - cloudCnfProvider, err := azure.NewFromCloudConfig(f) + cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) if err != nil { log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) } diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go index a825dd80..3b2d0740 100644 --- a/cmd/azure-keyvault-env/authentication.go +++ b/cmd/azure-keyvault-env/authentication.go @@ -30,7 +30,7 @@ import ( "net/http" "time" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" ) func createHTTPClientWithTrustedCA(caCert []byte) (*http.Client, error) { @@ -51,7 +51,7 @@ func createHTTPClientWithTrustedCA(caCert []byte) (*http.Client, error) { return tlsClient, nil } -func getCredentials(useAuthService bool, authServiceAddress, caCert string) (azure.Credentials, error) { +func getCredentials(useAuthService bool, authServiceAddress, caCert string) (credentialprovider.Credentials, error) { if useAuthService { client, err := createHTTPClientWithTrustedCA([]byte(caCert)) if err != nil { @@ -71,7 +71,7 @@ func getCredentials(useAuthService bool, authServiceAddress, caCert string) (azu return nil, fmt.Errorf("failed to get credentials, %s", res.Status) } - var creds azure.OAuthCredentials + var creds credentialprovider.OAuthCredentials err = json.NewDecoder(res.Body).Decode(&creds) if err != nil { @@ -82,7 +82,7 @@ func getCredentials(useAuthService bool, authServiceAddress, caCert string) (azu return creds, nil } - creds, err := azure.NewFromEnvironment() + creds, err := credentialprovider.NewFromEnvironment() if err != nil { return nil, fmt.Errorf("failed to get credentials for azure key vault, error %+v", err) } diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 77ea90a5..ce6b237c 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -24,7 +24,7 @@ import ( "net/http" "os" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" "github.com/gorilla/mux" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -69,7 +69,7 @@ type azureKeyVaultConfig struct { authServicePort string caBundleConfigMapName string kubeClient *kubernetes.Clientset - credentials azure.Credentials + credentials credentialprovider.Credentials } var config azureKeyVaultConfig @@ -278,7 +278,7 @@ func main() { var err error if !config.runningInsideAzureAks || config.customAuth { - config.credentials, err = azure.NewFromEnvironment() + config.credentials, err = credentialprovider.NewFromEnvironment() if err != nil { log.Fatal(err) } @@ -289,7 +289,7 @@ func main() { } defer f.Close() - cloudCnfProvider, err := azure.NewFromCloudConfig(f) + cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) if err != nil { log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index b6313a7e..fb9fd0c0 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -26,7 +26,7 @@ import ( "strings" "time" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" "github.com/containers/image/v5/transports/alltransports" "github.com/containers/image/v5/types" @@ -107,12 +107,12 @@ func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { } defer abc.Close() - config, err := abc.OCIConfig(ctx) + dockerConfig, err := abc.OCIConfig(ctx) if err != nil { return nil, fmt.Errorf("error reading OCI-formatted configuration data: %+v", err) } - return config, nil + return dockerConfig, nil } func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) (map[string]types.DockerAuthConfig, error) { @@ -198,7 +198,7 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) } defer f.Close() - cloudCnfProvider, err := azure.NewFromCloudConfig(f) + cloudCnfProvider, err := credentialprovider.NewAcrCredentialsFromCloudConfig(f) if err != nil { log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) return types.DockerAuthConfig{}, false diff --git a/cmd/azure-keyvault-secrets-webhook/token_test.go b/cmd/azure-keyvault-secrets-webhook/token_test.go index 2241c7a1..bb26db8b 100644 --- a/cmd/azure-keyvault-secrets-webhook/token_test.go +++ b/cmd/azure-keyvault-secrets-webhook/token_test.go @@ -5,7 +5,7 @@ import ( "os" "testing" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" ) func TestMarshallToken(t *testing.T) { @@ -17,7 +17,7 @@ func TestMarshallToken(t *testing.T) { os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET")) os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID")) - creds, err := azure.NewFromEnvironment() + creds, err := credentialprovider.NewFromEnvironment() if err != nil { t.Error(err) } @@ -27,7 +27,7 @@ func TestMarshallToken(t *testing.T) { t.Error(err) } - var creds2 azure.OAuthCredentials + var creds2 credentialprovider.OAuthCredentials err = json.Unmarshal(data, &creds2) if err != nil { t.Error(err) diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go new file mode 100644 index 00000000..f5619117 --- /dev/null +++ b/pkg/azure/credentialprovider/acr.go @@ -0,0 +1,220 @@ +// Copyright © 2019 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package credentialprovider + +import ( + "context" + "fmt" + "io" + "regexp" + "strings" + + "github.com/Azure/azure-sdk-for-go/services/containerregistry/mgmt/2017-10-01/containerregistry" + "github.com/Azure/go-autorest/autorest" + "github.com/Azure/go-autorest/autorest/adal" + "github.com/Azure/go-autorest/autorest/azure" + docker "github.com/containers/image/v5/types" + + azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" + log "github.com/sirupsen/logrus" + "k8s.io/legacy-cloud-providers/azure/auth" +) + +var ( + containerRegistryUrls = []string{"*.azurecr.io", "*.azurecr.cn", "*.azurecr.de", "*.azurecr.us"} + acrRE = regexp.MustCompile(`.*\.azurecr\.io|.*\.azurecr\.cn|.*\.azurecr\.de|.*\.azurecr\.us`) +) + +// DockerConfig contains credentials used to access Docker regestries +type DockerConfig map[string]docker.DockerAuthConfig + +// RegistriesClient is a testable interface for the ACR client List operation. +type RegistriesClient interface { + List(ctx context.Context) ([]containerregistry.Registry, error) +} + +// azRegistriesClient implements RegistriesClient. +type azRegistriesClient struct { + client containerregistry.RegistriesClient +} + +// AcrCloudConfigProvider provides credentials for Azure +type AcrCloudConfigProvider struct { + config *auth.AzureAuthConfig + environment *azure.Environment + servicePrincipalToken *adal.ServicePrincipalToken + registryClient RegistriesClient +} + +func newAzRegistriesClient(subscriptionID, endpoint string, token *adal.ServicePrincipalToken) *azRegistriesClient { + registryClient := containerregistry.NewRegistriesClient(subscriptionID) + registryClient.BaseURI = endpoint + registryClient.Authorizer = autorest.NewBearerAuthorizer(token) + + return &azRegistriesClient{ + client: registryClient, + } +} + +func (az *azRegistriesClient) List(ctx context.Context) ([]containerregistry.Registry, error) { + iterator, err := az.client.ListComplete(ctx) + if err != nil { + return nil, err + } + + result := make([]containerregistry.Registry, 0) + for ; iterator.NotDone(); err = iterator.Next() { + if err != nil { + return nil, err + } + + result = append(result, iterator.Value()) + } + + return result, nil +} + +// NewAcrCredentialsFromCloudConfig parses the specified configFile and returns a DockerConfigProvider +func NewAcrCredentialsFromCloudConfig(configReader io.Reader) (*AcrCloudConfigProvider, error) { + authSettings, err := azureAuth.GetSettingsFromEnvironment() + if err != nil { + return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) + } + + token, config, err := getServicePrincipalTokenFromCloudConfig(configReader, authSettings.Environment, authSettings.Environment.ServiceManagementEndpoint) + + if err != nil { + return nil, err + } + + registryClient := newAzRegistriesClient(config.SubscriptionID, authSettings.Environment.ResourceManagerEndpoint, token) + + return &AcrCloudConfigProvider{ + config: config, + environment: &authSettings.Environment, + servicePrincipalToken: token, + registryClient: registryClient, + }, nil +} + +func getLoginServer(registry containerregistry.Registry) string { + return *(*registry.RegistryProperties).LoginServer +} + +// GetAcrCredentials will get Docker credentials for Azure Container Registry +func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, error) { + cfg := DockerConfig{} + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + if c.config.UseManagedIdentityExtension { + log.Debug("listing registries") + + result, err := c.registryClient.List(ctx) + if err != nil { + return nil, fmt.Errorf("Failed to list registries: %v", err) + } + + for ix := range result { + loginServer := getLoginServer(result[ix]) + log.Debugf("loginServer: %s", loginServer) + cred, err := getACRDockerEntryFromARMToken(c.config, c.servicePrincipalToken, loginServer) + if err != nil { + continue + } + cfg[loginServer] = *cred + } + } else { + // Add our entry for each of the supported container registry URLs + for _, url := range containerRegistryUrls { + cred := &docker.DockerAuthConfig{ + Username: c.config.AADClientID, + Password: c.config.AADClientSecret, + } + cfg[url] = *cred + } + } + + // add ACR anonymous repo support: use empty username and password for anonymous access + cfg["*.azurecr.*"] = docker.DockerAuthConfig{ + Username: "", + Password: "", + } + return cfg, nil +} + +func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { + // Run EnsureFresh to make sure the token is valid and does not expire + // if err := token.EnsureFresh(); err != nil { + // return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) + // } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + authSettings, err := azureAuth.GetSettingsFromEnvironment() + if err != nil { + return nil, fmt.Errorf("failed to refresh token for %s, error: %+v", authSettings.Environment.ServiceManagementEndpoint, err) + } + + err = token.RefreshExchangeWithContext(ctx, authSettings.Environment.ServiceManagementEndpoint) + if err != nil { + return nil, fmt.Errorf("failed to refresh token for %s, error: %+v", authSettings.Environment.ServiceManagementEndpoint, err) + } + + armAccessToken := token.OAuthToken() + + log.Debugf("discovering auth redirects for: %s", loginServer) + directive, err := receiveChallengeFromLoginServer(loginServer) + if err != nil { + return nil, fmt.Errorf("failed to receive challenge: %s", err) + } + + log.Debug("exchanging an acr refresh_token") + registryRefreshToken, err := performTokenExchange(loginServer, directive, config.TenantID, armAccessToken) + if err != nil { + return nil, fmt.Errorf("failed to perform token exchange: %s", err) + } + + log.Debugf("adding ACR docker config entry for: %s", loginServer) + return &docker.DockerAuthConfig{ + Username: dockerTokenLoginUsernameGUID, + Password: registryRefreshToken, + }, nil +} + +// parseACRLoginServerFromImage takes image as parameter and returns login server of it. +// Parameter `image` is expected in following format: foo.azurecr.io/bar/imageName:version +// If the provided image is not an acr image, this function will return an empty string. +func parseACRLoginServerFromImage(image string, env *azure.Environment) string { + match := acrRE.FindAllString(image, -1) + if len(match) == 1 { + return match[0] + } + + // handle the custom cloud case + if env != nil { + cloudAcrSuffix := env.ContainerRegistryDNSSuffix + cloudAcrSuffixLength := len(cloudAcrSuffix) + if cloudAcrSuffixLength > 0 { + customAcrSuffixIndex := strings.Index(image, cloudAcrSuffix) + if customAcrSuffixIndex != -1 { + endIndex := customAcrSuffixIndex + cloudAcrSuffixLength + return image[0:endIndex] + } + } + } + + return "" +} diff --git a/pkg/azure/credential.go b/pkg/azure/credentialprovider/akv.go similarity index 68% rename from pkg/azure/credential.go rename to pkg/azure/credentialprovider/akv.go index c2c0e06e..bc03ad2f 100644 --- a/pkg/azure/credential.go +++ b/pkg/azure/credentialprovider/akv.go @@ -16,10 +16,9 @@ // Todo: Needs refactoring -package azure +package credentialprovider import ( - "context" "crypto/rsa" "crypto/x509" "encoding/json" @@ -27,16 +26,13 @@ import ( "fmt" "io" "io/ioutil" - "regexp" "strings" "golang.org/x/crypto/pkcs12" - "github.com/Azure/azure-sdk-for-go/services/containerregistry/mgmt/2017-10-01/containerregistry" "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/adal" "github.com/Azure/go-autorest/autorest/azure" - docker "github.com/containers/image/v5/types" "github.com/spf13/pflag" azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" @@ -52,20 +48,11 @@ const ( maxReadLength = 10 * 1 << 20 // 10MB ) -var ( - containerRegistryUrls = []string{"*.azurecr.io", "*.azurecr.cn", "*.azurecr.de", "*.azurecr.us"} - acrRE = regexp.MustCompile(`.*\.azurecr\.io|.*\.azurecr\.cn|.*\.azurecr\.de|.*\.azurecr\.us`) -) - -// DockerConfig contains credentials used to access Docker regestries -type DockerConfig map[string]docker.DockerAuthConfig - // CloudConfigProvider provides credentials for Azure type CloudConfigProvider struct { config *auth.AzureAuthConfig environment *azure.Environment servicePrincipalToken *adal.ServicePrincipalToken - registryClient RegistriesClient } // Credentials has credentials needed to authenticate with azure key vault. @@ -92,44 +79,6 @@ type crendentialsToken struct { token string } -// RegistriesClient is a testable interface for the ACR client List operation. -type RegistriesClient interface { - List(ctx context.Context) ([]containerregistry.Registry, error) -} - -// azRegistriesClient implements RegistriesClient. -type azRegistriesClient struct { - client containerregistry.RegistriesClient -} - -func newAzRegistriesClient(subscriptionID, endpoint string, token *adal.ServicePrincipalToken) *azRegistriesClient { - registryClient := containerregistry.NewRegistriesClient(subscriptionID) - registryClient.BaseURI = endpoint - registryClient.Authorizer = autorest.NewBearerAuthorizer(token) - - return &azRegistriesClient{ - client: registryClient, - } -} - -func (az *azRegistriesClient) List(ctx context.Context) ([]containerregistry.Registry, error) { - iterator, err := az.client.ListComplete(ctx) - if err != nil { - return nil, err - } - - result := make([]containerregistry.Registry, 0) - for ; iterator.NotDone(); err = iterator.Next() { - if err != nil { - return nil, err - } - - result = append(result, iterator.Value()) - } - - return result, nil -} - // NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { authSettings, err := azureAuth.GetSettingsFromEnvironment() @@ -137,90 +86,19 @@ func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) } - token, config, err := getServicePrincipalTokenFromCloudConfig(configReader, authSettings.Environment) + token, config, err := getServicePrincipalTokenFromCloudConfig(configReader, authSettings.Environment, authSettings.Environment.ResourceIdentifiers.KeyVault) if err != nil { return nil, err } - registryClient := newAzRegistriesClient(config.SubscriptionID, authSettings.Environment.ResourceManagerEndpoint, token) - return &CloudConfigProvider{ config: config, environment: &authSettings.Environment, servicePrincipalToken: token, - registryClient: registryClient, - }, nil -} - -// NewFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault -func NewFromServicePrincipalToken(token *adal.ServicePrincipalToken) (Credentials, error) { - resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2) - endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - - return &credentials{ - Token: token, - EndpointPartial: endpoint, }, nil } -// GetCredentials will get Azure credentials -func (c CloudConfigProvider) GetCredentials() (Credentials, error) { - resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) - endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - - return &credentials{ - Token: c.servicePrincipalToken, - EndpointPartial: endpoint, - }, nil -} - -func getLoginServer(registry containerregistry.Registry) string { - return *(*registry.RegistryProperties).LoginServer -} - -// GetAcrCredentials will get Docker credentials for Azure Container Registry -func (c CloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, error) { - cfg := DockerConfig{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - if c.config.UseManagedIdentityExtension { - log.Debug("listing registries") - - result, err := c.registryClient.List(ctx) - if err != nil { - return nil, fmt.Errorf("Failed to list registries: %v", err) - } - - for ix := range result { - loginServer := getLoginServer(result[ix]) - log.Debugf("loginServer: %s", loginServer) - cred, err := getACRDockerEntryFromARMToken(c.config, c.servicePrincipalToken, loginServer) - if err != nil { - continue - } - cfg[loginServer] = *cred - } - } else { - // Add our entry for each of the supported container registry URLs - for _, url := range containerRegistryUrls { - cred := &docker.DockerAuthConfig{ - Username: c.config.AADClientID, - Password: c.config.AADClientSecret, - } - cfg[url] = *cred - } - } - - // add ACR anonymous repo support: use empty username and password for anonymous access - cfg["*.azurecr.*"] = docker.DockerAuthConfig{ - Username: "", - Password: "", - } - return cfg, nil -} - // NewFromEnvironment creates a credentials object based on available environment settings to use with Azure Key Vault func NewFromEnvironment() (Credentials, error) { authSettings, err := azureAuth.GetSettingsFromEnvironment() @@ -300,6 +178,28 @@ func NewFromEnvironment() (Credentials, error) { return akvCreds, nil } +// NewFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault +func NewFromServicePrincipalToken(token *adal.ServicePrincipalToken) (Credentials, error) { + resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + + return &credentials{ + Token: token, + EndpointPartial: endpoint, + }, nil +} + +// GetCredentials will get Azure credentials +func (c CloudConfigProvider) GetCredentials() (Credentials, error) { + resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + + return &credentials{ + Token: c.servicePrincipalToken, + EndpointPartial: endpoint, + }, nil +} + // Authorizer gets an Authorizer from credentials func (c credentials) Authorizer() (autorest.Authorizer, error) { return createAuthorizerFromServicePrincipalToken(c.Token) @@ -343,7 +243,7 @@ func (c OAuthCredentials) Endpoint(keyVaultName string) string { return fmt.Sprintf(c.EndpointPartial, keyVaultName) } -func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.Environment) (*adal.ServicePrincipalToken, *auth.AzureAuthConfig, error) { +func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.Environment, resource string) (*adal.ServicePrincipalToken, *auth.AzureAuthConfig, error) { config, err := ParseConfig(configReader) if err != nil { return nil, nil, fmt.Errorf("failed reading cloud config, error: %+v", err) @@ -359,7 +259,7 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E if len(config.UserAssignedIdentityID) > 0 { log.Debug("azure: using User Assigned MSI ID to retrieve access token") token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, - env.ResourceIdentifiers.KeyVault, + resource, config.UserAssignedIdentityID) return token, config, err @@ -367,7 +267,7 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E log.Debug("azure: using System Assigned MSI to retrieve access token") token, err := adal.NewServicePrincipalTokenFromMSI( msiEndpoint, - env.ResourceIdentifiers.KeyVault) + resource) return token, config, err } @@ -383,7 +283,7 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E *oauthConfig, config.AADClientID, config.AADClientSecret, - env.ResourceIdentifiers.KeyVault) + resource) return token, config, err } @@ -403,7 +303,7 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E config.AADClientID, certificate, privateKey, - env.ResourceIdentifiers.KeyVault) + resource) return token, config, err } @@ -447,57 +347,6 @@ func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, error) { return &config, nil } -func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { - // Run EnsureFresh to make sure the token is valid and does not expire - // if err := token.EnsureFresh(); err != nil { - // return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) - // } - armAccessToken := token.OAuthToken() - - log.Debugf("discovering auth redirects for: %s", loginServer) - directive, err := receiveChallengeFromLoginServer(loginServer) - if err != nil { - return nil, fmt.Errorf("failed to receive challenge: %s", err) - } - - log.Debug("exchanging an acr refresh_token") - registryRefreshToken, err := performTokenExchange(loginServer, directive, config.TenantID, armAccessToken) - if err != nil { - return nil, fmt.Errorf("failed to perform token exchange: %s", err) - } - - log.Debugf("adding ACR docker config entry for: %s", loginServer) - return &docker.DockerAuthConfig{ - Username: dockerTokenLoginUsernameGUID, - Password: registryRefreshToken, - }, nil -} - -// parseACRLoginServerFromImage takes image as parameter and returns login server of it. -// Parameter `image` is expected in following format: foo.azurecr.io/bar/imageName:version -// If the provided image is not an acr image, this function will return an empty string. -func parseACRLoginServerFromImage(image string, env *azure.Environment) string { - match := acrRE.FindAllString(image, -1) - if len(match) == 1 { - return match[0] - } - - // handle the custom cloud case - if env != nil { - cloudAcrSuffix := env.ContainerRegistryDNSSuffix - cloudAcrSuffixLength := len(cloudAcrSuffix) - if cloudAcrSuffixLength > 0 { - customAcrSuffixIndex := strings.Index(image, cloudAcrSuffix) - if customAcrSuffixIndex != -1 { - endIndex := customAcrSuffixIndex + cloudAcrSuffixLength - return image[0:endIndex] - } - } - } - - return "" -} - func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) { privateKey, certificate, err := pkcs12.Decode(pkcs, password) if err != nil { diff --git a/pkg/azure/credential_helper.go b/pkg/azure/credentialprovider/credential_helper.go similarity index 99% rename from pkg/azure/credential_helper.go rename to pkg/azure/credentialprovider/credential_helper.go index 12a2ad3f..2838b517 100644 --- a/pkg/azure/credential_helper.go +++ b/pkg/azure/credentialprovider/credential_helper.go @@ -42,7 +42,7 @@ SOFTWARE // Source: https://github.com/Azure/acr-docker-credential-helper/blob/a79b541f3ee761f6cc4511863ed41fb038c19464/src/docker-credential-acr/acr_login.go -package azure +package credentialprovider import ( "bytes" diff --git a/pkg/azure/credential_test.go b/pkg/azure/credentialprovider/credential_test.go similarity index 99% rename from pkg/azure/credential_test.go rename to pkg/azure/credentialprovider/credential_test.go index 9204be99..e6e230df 100644 --- a/pkg/azure/credential_test.go +++ b/pkg/azure/credentialprovider/credential_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package azure +package credentialprovider import ( "fmt" diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index 58e80266..72e607b1 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -23,7 +23,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" ) @@ -40,16 +40,17 @@ type Service interface { } type azureKeyVaultService struct { - credentials azure.Credentials + credentials credentialprovider.Credentials } // NewService creates a new AzureKeyVaultService -func NewService(credentials azure.Credentials) Service { +func NewService(credentials credentialprovider.Credentials) Service { return &azureKeyVaultService{ credentials: credentials, } } +// CertificateOptions has options for exporting certificate type CertificateOptions struct { ExportPrivateKey bool EnsureServerFirst bool diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go index e03bc430..d58d6e39 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service_test.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go @@ -7,7 +7,7 @@ import ( "testing" akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing" - auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure" + auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) From 8a9a14cb2f96f917699224b5a41258d65e61061d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 20:02:00 +0200 Subject: [PATCH 108/251] removed usage of acr client to list registries, as this would require read rights on list registries --- pkg/azure/credentialprovider/acr.go | 102 ++++++++-------------------- 1 file changed, 30 insertions(+), 72 deletions(-) diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index f5619117..05ee3e7a 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -21,8 +21,6 @@ import ( "regexp" "strings" - "github.com/Azure/azure-sdk-for-go/services/containerregistry/mgmt/2017-10-01/containerregistry" - "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/adal" "github.com/Azure/go-autorest/autorest/azure" docker "github.com/containers/image/v5/types" @@ -40,50 +38,11 @@ var ( // DockerConfig contains credentials used to access Docker regestries type DockerConfig map[string]docker.DockerAuthConfig -// RegistriesClient is a testable interface for the ACR client List operation. -type RegistriesClient interface { - List(ctx context.Context) ([]containerregistry.Registry, error) -} - -// azRegistriesClient implements RegistriesClient. -type azRegistriesClient struct { - client containerregistry.RegistriesClient -} - // AcrCloudConfigProvider provides credentials for Azure type AcrCloudConfigProvider struct { config *auth.AzureAuthConfig environment *azure.Environment servicePrincipalToken *adal.ServicePrincipalToken - registryClient RegistriesClient -} - -func newAzRegistriesClient(subscriptionID, endpoint string, token *adal.ServicePrincipalToken) *azRegistriesClient { - registryClient := containerregistry.NewRegistriesClient(subscriptionID) - registryClient.BaseURI = endpoint - registryClient.Authorizer = autorest.NewBearerAuthorizer(token) - - return &azRegistriesClient{ - client: registryClient, - } -} - -func (az *azRegistriesClient) List(ctx context.Context) ([]containerregistry.Registry, error) { - iterator, err := az.client.ListComplete(ctx) - if err != nil { - return nil, err - } - - result := make([]containerregistry.Registry, 0) - for ; iterator.NotDone(); err = iterator.Next() { - if err != nil { - return nil, err - } - - result = append(result, iterator.Value()) - } - - return result, nil } // NewAcrCredentialsFromCloudConfig parses the specified configFile and returns a DockerConfigProvider @@ -99,42 +58,25 @@ func NewAcrCredentialsFromCloudConfig(configReader io.Reader) (*AcrCloudConfigPr return nil, err } - registryClient := newAzRegistriesClient(config.SubscriptionID, authSettings.Environment.ResourceManagerEndpoint, token) - return &AcrCloudConfigProvider{ config: config, environment: &authSettings.Environment, servicePrincipalToken: token, - registryClient: registryClient, }, nil } -func getLoginServer(registry containerregistry.Registry) string { - return *(*registry.RegistryProperties).LoginServer -} - // GetAcrCredentials will get Docker credentials for Azure Container Registry func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, error) { cfg := DockerConfig{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() if c.config.UseManagedIdentityExtension { - log.Debug("listing registries") - - result, err := c.registryClient.List(ctx) - if err != nil { - return nil, fmt.Errorf("Failed to list registries: %v", err) - } - - for ix := range result { - loginServer := getLoginServer(result[ix]) - log.Debugf("loginServer: %s", loginServer) - cred, err := getACRDockerEntryFromARMToken(c.config, c.servicePrincipalToken, loginServer) - if err != nil { - continue + log.Debug("using managed identity for acr credentials") + if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { + log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) + } else { + if cred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, c.servicePrincipalToken, loginServer); err == nil { + cfg[loginServer] = *cred } - cfg[loginServer] = *cred } } else { // Add our entry for each of the supported container registry URLs @@ -145,6 +87,27 @@ func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, e } cfg[url] = *cred } + + // Handle the custom cloud case + // In clouds where ACR is not yet deployed, the string will be empty + if c.environment != nil && strings.Contains(c.environment.ContainerRegistryDNSSuffix, ".azurecr.") { + customAcrSuffix := "*" + c.environment.ContainerRegistryDNSSuffix + hasBeenAdded := false + for _, url := range containerRegistryUrls { + if strings.EqualFold(url, customAcrSuffix) { + hasBeenAdded = true + break + } + } + + if !hasBeenAdded { + cred := &docker.DockerAuthConfig{ + Username: c.config.AADClientID, + Password: c.config.AADClientSecret, + } + cfg[customAcrSuffix] = *cred + } + } } // add ACR anonymous repo support: use empty username and password for anonymous access @@ -155,7 +118,7 @@ func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, e return cfg, nil } -func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { +func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, env azure.Environment, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { // Run EnsureFresh to make sure the token is valid and does not expire // if err := token.EnsureFresh(); err != nil { // return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) @@ -163,14 +126,9 @@ func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, token *adal.Ser ctx, cancel := context.WithCancel(context.Background()) defer cancel() - authSettings, err := azureAuth.GetSettingsFromEnvironment() - if err != nil { - return nil, fmt.Errorf("failed to refresh token for %s, error: %+v", authSettings.Environment.ServiceManagementEndpoint, err) - } - - err = token.RefreshExchangeWithContext(ctx, authSettings.Environment.ServiceManagementEndpoint) + err := token.RefreshExchangeWithContext(ctx, env.ServiceManagementEndpoint) if err != nil { - return nil, fmt.Errorf("failed to refresh token for %s, error: %+v", authSettings.Environment.ServiceManagementEndpoint, err) + return nil, fmt.Errorf("failed to refresh token using resource %s, error: %+v", env.ServiceManagementEndpoint, err) } armAccessToken := token.OAuthToken() From fa96089e1a69d0b158c0eb5fdda89596971765c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 20:16:15 +0200 Subject: [PATCH 109/251] log which acr registries we get credentials for and which we find --- pkg/azure/credentialprovider/acr.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index 05ee3e7a..8ca999af 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -74,7 +74,9 @@ func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, e if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) } else { + log.Debug("getting acr gredentials for %s", loginServer) if cred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, c.servicePrincipalToken, loginServer); err == nil { + log.Debug("found acr gredentials for %s", loginServer) cfg[loginServer] = *cred } } From 502b1eab7b212b63c4aab7e24129888d3ddc89e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 20:28:48 +0200 Subject: [PATCH 110/251] add missing log formatting directive --- pkg/azure/credentialprovider/acr.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index 8ca999af..492cb77d 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -74,9 +74,9 @@ func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, e if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) } else { - log.Debug("getting acr gredentials for %s", loginServer) + log.Debugf("getting acr gredentials for %s", loginServer) if cred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, c.servicePrincipalToken, loginServer); err == nil { - log.Debug("found acr gredentials for %s", loginServer) + log.Debugf("found acr gredentials for %s", loginServer) cfg[loginServer] = *cred } } From d22a5f9f8e6faa8a21d54ff988ccd69d1c21c4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 23 Sep 2020 21:21:13 +0200 Subject: [PATCH 111/251] remove duplicate logging entries --- cmd/azure-keyvault-secrets-webhook/registry.go | 1 - pkg/azure/credentialprovider/acr.go | 1 - 2 files changed, 2 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index fb9fd0c0..634f8f7e 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -212,7 +212,6 @@ func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) if len(dockerConfList) > 0 { dockerConf := dockerConfList[wildcardHost] - log.Debugf("found azure acr credentials for %s with userid %s", host, dockerConf.Username) return dockerConf, true } diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index 492cb77d..52f1ffbc 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -74,7 +74,6 @@ func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, e if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) } else { - log.Debugf("getting acr gredentials for %s", loginServer) if cred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, c.servicePrincipalToken, loginServer); err == nil { log.Debugf("found acr gredentials for %s", loginServer) cfg[loginServer] = *cred From 60eb0d8c450c4c9bd4f0f23ea4d8d7a29fc0f58f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 24 Sep 2020 11:33:54 +0200 Subject: [PATCH 112/251] simplified acr credential management --- cmd/azure-keyvault-secrets-webhook/pod.go | 8 +- .../registry.go | 61 +++++++-------- pkg/azure/credentialprovider/acr.go | 75 +++++++------------ pkg/azure/credentialprovider/akv.go | 38 +++++----- 4 files changed, 79 insertions(+), 103 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index f5f837fb..de4a9f9f 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -73,8 +73,7 @@ func getVolumes(useAuthService bool) []corev1.Volume { return volumes } -func mutateContainers(containers []corev1.Container, creds map[string]types.DockerAuthConfig) (bool, bool, error) { - +func mutateContainers(containers []corev1.Container, imagePullSecrets map[string]*types.DockerAuthConfig) (bool, bool, error) { mutated := false anyUseAuthService := config.useAuthService @@ -115,13 +114,14 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock registryName = imgParts[0] } - regCred, ok := creds[registryName] + var regCred *types.DockerAuthConfig + regCred, ok := imagePullSecrets[registryName] if ok { log.Infof("found imagePullSecrets credentials to use with registry '%s'", registryName) } else if config.runningInsideAzureAks && config.useAksCredentialsWithAcs { log.Info("we are running inside azure aks, trying to get acr credentials") - regCred, ok = getAcrCredentials(registryName, container.Image) + regCred = getAcrCredentials(registryName, container.Image) } else { log.Debugf("not trying to get acr credentials, as we are not on aks or configured to not use aks credentials with acr") } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 634f8f7e..aaf86135 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -27,7 +27,6 @@ import ( "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - "github.com/containers/image/v5/transports/alltransports" "github.com/containers/image/v5/types" v1 "github.com/opencontainers/image-spec/specs-go/v1" @@ -37,15 +36,19 @@ import ( "k8s.io/client-go/kubernetes" ) -func getContainerCmd(container corev1.Container, creds types.DockerAuthConfig) ([]string, error) { +func getContainerCmd(container corev1.Container, creds *types.DockerAuthConfig) ([]string, error) { cmd := container.Command // If container.Command is set it will override both image.Entrypoint AND image.Cmd // https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes if len(cmd) == 0 { + log.Debugf("no cmd override in kubernetes for container %s, checking docker image configuration for entrypoint and cmd for %s", container.Name, container.Image) + if creds == nil { + log.Warnf("no credentials provided/found to access remote docker image configuration for %s - going anonymous", container.Image) + } opts := imageOptions{ image: container.Image, - credentials: creds, + credentials: *creds, } config, err := opts.getConfigFromManifest() @@ -58,6 +61,8 @@ func getContainerCmd(container corev1.Container, creds types.DockerAuthConfig) ( if len(container.Args) == 0 { cmd = append(cmd, config.Config.Cmd...) } + } else { + log.Debugf("found cmd override in kubernetes for container %s, no need to inspect docker image configuration for %s", container.Name, container.Image) } cmd = append(cmd, container.Args...) @@ -115,8 +120,8 @@ func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { return dockerConfig, nil } -func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) (map[string]types.DockerAuthConfig, error) { - creds := make(map[string]types.DockerAuthConfig) +func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) (map[string]*types.DockerAuthConfig, error) { + creds := make(map[string]*types.DockerAuthConfig) var conf struct { Auths map[string]struct { @@ -166,7 +171,7 @@ func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpe return creds, fmt.Errorf("decoded credential has wrong number of fields (expected 2, got %d)", len(authParts)) } - creds[host] = types.DockerAuthConfig{ + creds[host] = &types.DockerAuthConfig{ Username: authParts[0], Password: authParts[1], } @@ -176,54 +181,44 @@ func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpe return creds, nil } -func getAcrCredentials(host string, image string) (types.DockerAuthConfig, bool) { - isAcr, wildcardHost := hostIsAzureContainerRegistry(host) +func getAcrCredentials(host string, image string) *types.DockerAuthConfig { + // isAcr, wildcardHost := hostIsAzureContainerRegistry(host) - if !isAcr { - log.Debugf("docker container registry is not a azure container registry") - return types.DockerAuthConfig{}, false - } + // if !isAcr { + // log.Debugf("docker container registry is not a azure container registry") + // return types.DockerAuthConfig{}, false + // } //Check if cloud config file exists _, err := os.Stat(config.cloudConfigHostPath) if err != nil { log.Debugf("did not find cloud config - most likely because we're not in Azure/AKS") - return types.DockerAuthConfig{}, false + return &types.DockerAuthConfig{} } f, err := os.Open(config.cloudConfigHostPath) if err != nil { log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) - return types.DockerAuthConfig{}, false + return &types.DockerAuthConfig{} } defer f.Close() cloudCnfProvider, err := credentialprovider.NewAcrCredentialsFromCloudConfig(f) if err != nil { log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) - return types.DockerAuthConfig{}, false + return &types.DockerAuthConfig{} } - dockerConfList, err := cloudCnfProvider.GetAcrCredentials(image) - if err != nil { - log.Errorf("failed getting azure acr credentials, error: %+v", err) - return types.DockerAuthConfig{}, false - } + if cloudCnfProvider.IsAcrRegistry(image) { + cred, err := cloudCnfProvider.GetAcrCredentials(image) + if err != nil { + log.Errorf("failed getting azure acr credentials, error: %+v", err) + return &types.DockerAuthConfig{} + } - if len(dockerConfList) > 0 { - dockerConf := dockerConfList[wildcardHost] - return dockerConf, true + return cred } log.Warnf("no acr credentials found for %s", host) - return types.DockerAuthConfig{}, false -} - -func hostIsAzureContainerRegistry(host string) (bool, string) { - for _, v := range []string{".azurecr.io", ".azurecr.cn", ".azurecr.de", ".azurecr.us"} { - if strings.HasSuffix(host, v) { - return true, fmt.Sprintf("*%s", v) - } - } - return false, "" + return &types.DockerAuthConfig{} } diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index 52f1ffbc..94df222b 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -25,7 +25,6 @@ import ( "github.com/Azure/go-autorest/autorest/azure" docker "github.com/containers/image/v5/types" - azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" log "github.com/sirupsen/logrus" "k8s.io/legacy-cloud-providers/azure/auth" ) @@ -35,9 +34,6 @@ var ( acrRE = regexp.MustCompile(`.*\.azurecr\.io|.*\.azurecr\.cn|.*\.azurecr\.de|.*\.azurecr\.us`) ) -// DockerConfig contains credentials used to access Docker regestries -type DockerConfig map[string]docker.DockerAuthConfig - // AcrCloudConfigProvider provides credentials for Azure type AcrCloudConfigProvider struct { config *auth.AzureAuthConfig @@ -47,12 +43,17 @@ type AcrCloudConfigProvider struct { // NewAcrCredentialsFromCloudConfig parses the specified configFile and returns a DockerConfigProvider func NewAcrCredentialsFromCloudConfig(configReader io.Reader) (*AcrCloudConfigProvider, error) { - authSettings, err := azureAuth.GetSettingsFromEnvironment() + config, err := ParseConfig(configReader) if err != nil { - return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) + return nil, fmt.Errorf("failed reading cloud config, error: %+v", err) } - token, config, err := getServicePrincipalTokenFromCloudConfig(configReader, authSettings.Environment, authSettings.Environment.ServiceManagementEndpoint) + env, err := auth.ParseAzureEnvironment(config.Cloud) + if err != nil { + return nil, fmt.Errorf("failed to parse environment from cloud config, error: %+v", err) + } + + token, err := getServicePrincipalTokenFromCloudConfig(config, env, env.ServiceManagementEndpoint) if err != nil { return nil, err @@ -60,63 +61,43 @@ func NewAcrCredentialsFromCloudConfig(configReader io.Reader) (*AcrCloudConfigPr return &AcrCloudConfigProvider{ config: config, - environment: &authSettings.Environment, + environment: env, servicePrincipalToken: token, }, nil } // GetAcrCredentials will get Docker credentials for Azure Container Registry -func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (DockerConfig, error) { - cfg := DockerConfig{} +// It will either get a exact match to the login server for the image (eg xxx.azureacr.io) or +// get credentials for a wildcard match (eg *.azureacr.io* or *.azureacr.cn*) +func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (*docker.DockerAuthConfig, error) { + cred := &docker.DockerAuthConfig{ + Username: "", + Password: "", + } if c.config.UseManagedIdentityExtension { log.Debug("using managed identity for acr credentials") if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) } else { - if cred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, c.servicePrincipalToken, loginServer); err == nil { + if managedCred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, c.servicePrincipalToken, loginServer); err == nil { log.Debugf("found acr gredentials for %s", loginServer) - cfg[loginServer] = *cred + return managedCred, nil } } } else { - // Add our entry for each of the supported container registry URLs - for _, url := range containerRegistryUrls { - cred := &docker.DockerAuthConfig{ - Username: c.config.AADClientID, - Password: c.config.AADClientSecret, - } - cfg[url] = *cred - } - - // Handle the custom cloud case - // In clouds where ACR is not yet deployed, the string will be empty - if c.environment != nil && strings.Contains(c.environment.ContainerRegistryDNSSuffix, ".azurecr.") { - customAcrSuffix := "*" + c.environment.ContainerRegistryDNSSuffix - hasBeenAdded := false - for _, url := range containerRegistryUrls { - if strings.EqualFold(url, customAcrSuffix) { - hasBeenAdded = true - break - } - } - - if !hasBeenAdded { - cred := &docker.DockerAuthConfig{ - Username: c.config.AADClientID, - Password: c.config.AADClientSecret, - } - cfg[customAcrSuffix] = *cred - } - } + return &docker.DockerAuthConfig{ + Username: c.config.AADClientID, + Password: c.config.AADClientSecret, + }, nil } - // add ACR anonymous repo support: use empty username and password for anonymous access - cfg["*.azurecr.*"] = docker.DockerAuthConfig{ - Username: "", - Password: "", - } - return cfg, nil + return cred, nil +} + +// IsAcrRegistry checks if an image blongs to a ACR registry +func (c AcrCloudConfigProvider) IsAcrRegistry(image string) bool { + return parseACRLoginServerFromImage(image, c.environment) != "" } func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, env azure.Environment, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { diff --git a/pkg/azure/credentialprovider/akv.go b/pkg/azure/credentialprovider/akv.go index bc03ad2f..aed75d70 100644 --- a/pkg/azure/credentialprovider/akv.go +++ b/pkg/azure/credentialprovider/akv.go @@ -81,12 +81,17 @@ type crendentialsToken struct { // NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { - authSettings, err := azureAuth.GetSettingsFromEnvironment() + config, err := ParseConfig(configReader) if err != nil { - return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) + return nil, fmt.Errorf("failed reading cloud config, error: %+v", err) + } + + env, err := auth.ParseAzureEnvironment(config.Cloud) + if err != nil { + return nil, fmt.Errorf("failed to parse environment from cloud config, error: %+v", err) } - token, config, err := getServicePrincipalTokenFromCloudConfig(configReader, authSettings.Environment, authSettings.Environment.ResourceIdentifiers.KeyVault) + token, err := getServicePrincipalTokenFromCloudConfig(config, env, env.ResourceIdentifiers.KeyVault) if err != nil { return nil, err @@ -94,7 +99,7 @@ func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { return &CloudConfigProvider{ config: config, - environment: &authSettings.Environment, + environment: env, servicePrincipalToken: token, }, nil } @@ -243,17 +248,12 @@ func (c OAuthCredentials) Endpoint(keyVaultName string) string { return fmt.Sprintf(c.EndpointPartial, keyVaultName) } -func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.Environment, resource string) (*adal.ServicePrincipalToken, *auth.AzureAuthConfig, error) { - config, err := ParseConfig(configReader) - if err != nil { - return nil, nil, fmt.Errorf("failed reading cloud config, error: %+v", err) - } - +func getServicePrincipalTokenFromCloudConfig(config *auth.AzureAuthConfig, env *azure.Environment, resource string) (*adal.ServicePrincipalToken, error) { if config.UseManagedIdentityExtension { log.Debug("azure: using managed identity extension to retrieve access token") msiEndpoint, err := adal.GetMSIVMEndpoint() if err != nil { - return nil, nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) + return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) } if len(config.UserAssignedIdentityID) > 0 { @@ -262,19 +262,19 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E resource, config.UserAssignedIdentityID) - return token, config, err + return token, err } log.Debug("azure: using System Assigned MSI to retrieve access token") token, err := adal.NewServicePrincipalTokenFromMSI( msiEndpoint, resource) - return token, config, err + return token, err } oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) if err != nil { - return nil, nil, fmt.Errorf("creating the OAuth config: %v", err) + return nil, fmt.Errorf("creating the OAuth config: %v", err) } if len(config.AADClientSecret) > 0 { @@ -285,18 +285,18 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E config.AADClientSecret, resource) - return token, config, err + return token, err } if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 { log.Debug("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") certData, err := ioutil.ReadFile(config.AADClientCertPath) if err != nil { - return nil, nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) + return nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) } certificate, privateKey, err := decodePkcs12(certData, config.AADClientCertPassword) if err != nil { - return nil, nil, fmt.Errorf("decoding the client certificate: %v", err) + return nil, fmt.Errorf("decoding the client certificate: %v", err) } token, err := adal.NewServicePrincipalTokenFromCertificate( *oauthConfig, @@ -304,10 +304,10 @@ func getServicePrincipalTokenFromCloudConfig(configReader io.Reader, env azure.E certificate, privateKey, resource) - return token, config, err + return token, err } - return nil, nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID) + return nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID) } func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) { From fda5df76ed31d62100e10e7791762a991893e8af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Aase?= Date: Thu, 24 Sep 2020 09:47:38 +0200 Subject: [PATCH 113/251] Typo in example --- docs/source/content/installation/installing-with-helm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md index 93dd8ce5..4004519a 100644 --- a/docs/source/content/installation/installing-with-helm.md +++ b/docs/source/content/installation/installing-with-helm.md @@ -16,7 +16,7 @@ kubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vau For the latest version (`1.1.0`) run: ``` -ubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/crd-1.1.0/crds/AzureKeyVaultSecret.yaml +kubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/crd-1.1.0/crds/AzureKeyVaultSecret.yaml ``` ## Create a dedicated namespace @@ -83,4 +83,4 @@ helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-inje --set env.AZURE_TENANT_ID= \ --set env.AZURE_CLIENT_ID= \ --set env.AZURE_CLIENT_SECRET= -``` \ No newline at end of file +``` From 3bf8cd7f54733ed411b33f623c4576b4eda6c54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 24 Sep 2020 23:49:57 +0200 Subject: [PATCH 114/251] Fix #69 - handle containers with no explicit cmd --- .../authorization.go | 4 +- .../authorization_test.go | 107 ++++++++++++++++++ 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/authorization.go b/cmd/azure-keyvault-secrets-webhook/authorization.go index 10b3ebd4..4bc30d4b 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization.go @@ -15,7 +15,7 @@ type podData struct { token string } -func authorize(clientset *kubernetes.Clientset, podData podData) error { +func authorize(clientset kubernetes.Interface, podData podData) error { ns, err := clientset.CoreV1().Namespaces().Get(podData.namespace, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get namespace '%s', error: %+v", podData.namespace, err) @@ -37,7 +37,7 @@ func authorize(clientset *kubernetes.Clientset, podData podData) error { containerHasInjectorCmd := false for _, container := range pod.Spec.Containers { - if container.Command[0] == "/azure-keyvault/azure-keyvault-env" { + if len(container.Command) > 0 && container.Command[0] == "/azure-keyvault/azure-keyvault-env" { containerHasInjectorCmd = true break } diff --git a/cmd/azure-keyvault-secrets-webhook/authorization_test.go b/cmd/azure-keyvault-secrets-webhook/authorization_test.go index 2e75b8b1..98f40cc6 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization_test.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization_test.go @@ -3,18 +3,57 @@ package main import ( "os" "testing" + "time" authenticationapi "k8s.io/api/authentication/v1" authorizatonapi "k8s.io/api/authorization/v1" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" + k8sfake "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/clientcmd" ) +var ( + alwaysReady = func() bool { return true } + noResyncPeriodFunc = func() time.Duration { return 0 } +) + type kubeConfig struct { master string config string } +type fixture struct { + t *testing.T + + kubeclient *k8sfake.Clientset + // Objects from here preloaded into NewSimpleFake. + kubeobjects []runtime.Object + // objects []runtime.Object + namespaceLister []*corev1.Namespace +} + +func (f *fixture) initAuthorization() { + f.kubeclient = k8sfake.NewSimpleClientset(f.kubeobjects...) + k8sInformerNamespaces := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) + + for _, d := range f.namespaceLister { + k8sInformerNamespaces.Core().V1().Namespaces().Informer().GetIndexer().Add(d) + } +} + +func newFixture(t *testing.T) *fixture { + f := &fixture{} + f.t = t + // f.objects = []runtime.Object{} + f.kubeobjects = []runtime.Object{} + return f +} + func ensureIntegrationEnvironment(t *testing.T) kubeConfig { if os.Getenv("AKV2K8S_K8S_MASTER_URL") == "" || os.Getenv("AKV2K8S_K8S_CONFIG") == "" { t.Skip("Skipping integration test - no k8s cluster defined") @@ -26,6 +65,74 @@ func ensureIntegrationEnvironment(t *testing.T) kubeConfig { } } +func createNewNamespace(name string, addLabel bool) *corev1.Namespace { + ns := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + } + + if addLabel { + ns.Labels = map[string]string{ + "azure-key-vault-env-injection": "enabled", + } + } + return ns +} + +func createPod(name string, namespace string, multipleContainers bool) *corev1.Pod { + pod := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } + + pod.Status.PodIP = "127.0.0.1" + + podSpec := corev1.PodSpec{ + InitContainers: []corev1.Container{ + corev1.Container{ + Name: "copy-azurekeyvault-env", + }, + }, + } + + if multipleContainers { + podSpec.Containers = append(podSpec.Containers, corev1.Container{}) + } + + podSpec.Containers = append(podSpec.Containers, corev1.Container{ + Command: []string{"/azure-keyvault/azure-keyvault-env"}, + }) + + pod.Spec = podSpec + return pod +} + +func TestMultipleContainersInPod(t *testing.T) { + f := newFixture(t) + + ns := createNewNamespace("test", true) + pod := createPod("test", ns.Name, true) + f.kubeobjects = append(f.kubeobjects, ns) + f.kubeobjects = append(f.kubeobjects, pod) + + podData := podData{ + remoteAddress: "127.0.0.1", + name: "test", + namespace: "test", + token: "asfasdasf", + } + + f.initAuthorization() + err := authorize(f.kubeclient, podData) + + if err != nil { + t.Error(err) + } +} + func TestTokenReview(t *testing.T) { config := ensureIntegrationEnvironment(t) From 521b1473ae7b72194a2865d6a28d519fdc473713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 24 Sep 2020 23:53:18 +0200 Subject: [PATCH 115/251] split credentials provider into seperate credential types --- pkg/azure/credentialprovider/acr.go | 45 +-- pkg/azure/credentialprovider/akv.go | 291 ++---------------- .../credentialprovider/credential_test.go | 21 +- pkg/azure/credentialprovider/oauth.go | 51 +++ pkg/azure/credentialprovider/provider.go | 243 +++++++++++++++ .../keyvault/client/azure_keyvault_service.go | 4 +- .../client/azure_keyvault_service_test.go | 9 +- 7 files changed, 356 insertions(+), 308 deletions(-) create mode 100644 pkg/azure/credentialprovider/oauth.go create mode 100644 pkg/azure/credentialprovider/provider.go diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index 94df222b..73826e55 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -17,14 +17,12 @@ package credentialprovider import ( "context" "fmt" - "io" "regexp" "strings" "github.com/Azure/go-autorest/autorest/adal" "github.com/Azure/go-autorest/autorest/azure" docker "github.com/containers/image/v5/types" - log "github.com/sirupsen/logrus" "k8s.io/legacy-cloud-providers/azure/auth" ) @@ -34,42 +32,10 @@ var ( acrRE = regexp.MustCompile(`.*\.azurecr\.io|.*\.azurecr\.cn|.*\.azurecr\.de|.*\.azurecr\.us`) ) -// AcrCloudConfigProvider provides credentials for Azure -type AcrCloudConfigProvider struct { - config *auth.AzureAuthConfig - environment *azure.Environment - servicePrincipalToken *adal.ServicePrincipalToken -} - -// NewAcrCredentialsFromCloudConfig parses the specified configFile and returns a DockerConfigProvider -func NewAcrCredentialsFromCloudConfig(configReader io.Reader) (*AcrCloudConfigProvider, error) { - config, err := ParseConfig(configReader) - if err != nil { - return nil, fmt.Errorf("failed reading cloud config, error: %+v", err) - } - - env, err := auth.ParseAzureEnvironment(config.Cloud) - if err != nil { - return nil, fmt.Errorf("failed to parse environment from cloud config, error: %+v", err) - } - - token, err := getServicePrincipalTokenFromCloudConfig(config, env, env.ServiceManagementEndpoint) - - if err != nil { - return nil, err - } - - return &AcrCloudConfigProvider{ - config: config, - environment: env, - servicePrincipalToken: token, - }, nil -} - // GetAcrCredentials will get Docker credentials for Azure Container Registry // It will either get a exact match to the login server for the image (eg xxx.azureacr.io) or // get credentials for a wildcard match (eg *.azureacr.io* or *.azureacr.cn*) -func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (*docker.DockerAuthConfig, error) { +func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*docker.DockerAuthConfig, error) { cred := &docker.DockerAuthConfig{ Username: "", Password: "", @@ -80,7 +46,12 @@ func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (*docker.DockerA if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) } else { - if managedCred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, c.servicePrincipalToken, loginServer); err == nil { + token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ServiceManagementEndpoint) + + if err != nil { + return nil, err + } + if managedCred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, token, loginServer); err == nil { log.Debugf("found acr gredentials for %s", loginServer) return managedCred, nil } @@ -96,7 +67,7 @@ func (c AcrCloudConfigProvider) GetAcrCredentials(image string) (*docker.DockerA } // IsAcrRegistry checks if an image blongs to a ACR registry -func (c AcrCloudConfigProvider) IsAcrRegistry(image string) bool { +func (c CloudConfigCredentialProvider) IsAcrRegistry(image string) bool { return parseACRLoginServerFromImage(image, c.environment) != "" } diff --git a/pkg/azure/credentialprovider/akv.go b/pkg/azure/credentialprovider/akv.go index aed75d70..88d35711 100644 --- a/pkg/azure/credentialprovider/akv.go +++ b/pkg/azure/credentialprovider/akv.go @@ -19,109 +19,59 @@ package credentialprovider import ( - "crypto/rsa" - "crypto/x509" - "encoding/json" - "errors" "fmt" - "io" - "io/ioutil" "strings" - "golang.org/x/crypto/pkcs12" - "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/adal" - "github.com/Azure/go-autorest/autorest/azure" - "github.com/spf13/pflag" - - azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" - log "github.com/sirupsen/logrus" - "k8s.io/legacy-cloud-providers/azure/auth" - "sigs.k8s.io/yaml" -) - -var flagConfigFile = pflag.String("azure-container-registry-config", "", - "Path to the file containing Azure container registry configuration information.") - -const ( - maxReadLength = 10 * 1 << 20 // 10MB ) -// CloudConfigProvider provides credentials for Azure -type CloudConfigProvider struct { - config *auth.AzureAuthConfig - environment *azure.Environment - servicePrincipalToken *adal.ServicePrincipalToken -} - -// Credentials has credentials needed to authenticate with azure key vault. +// AzureKeyVaultCredentials has credentials needed to authenticate with azure key vault. // These credentials will never expire -type Credentials interface { - Endpoint(name string) string - Authorizer() (autorest.Authorizer, error) -} - -type credentials struct { +type AzureKeyVaultCredentials struct { Token *adal.ServicePrincipalToken EndpointPartial string } -// OAuthCredentials has credentials need to authenticate with azure. -// These credentials expires when the oauth token expire (default one our in Azure). Use the -// Credentials interface if you want tokens to refresh. -type OAuthCredentials struct { - OAuthToken string `json:"oauth_token"` - EndpointPartial string `json:"endpoint_partial"` +// Authorizer gets an Authorizer from credentials +func (c AzureKeyVaultCredentials) Authorizer() (autorest.Authorizer, error) { + return createAuthorizerFromServicePrincipalToken(c.Token) } -type crendentialsToken struct { - token string +// Endpoint takes the name of the keyvault and creates a correct andpoint url +func (c AzureKeyVaultCredentials) Endpoint(keyVaultName string) string { + return fmt.Sprintf(c.EndpointPartial, keyVaultName) } -// NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider -func NewFromCloudConfig(configReader io.Reader) (*CloudConfigProvider, error) { - config, err := ParseConfig(configReader) - if err != nil { - return nil, fmt.Errorf("failed reading cloud config, error: %+v", err) - } - - env, err := auth.ParseAzureEnvironment(config.Cloud) - if err != nil { - return nil, fmt.Errorf("failed to parse environment from cloud config, error: %+v", err) - } - - token, err := getServicePrincipalTokenFromCloudConfig(config, env, env.ResourceIdentifiers.KeyVault) +// GetAzureKeyVaultCredentials will get Azure credentials +func (c CloudConfigCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyVaultCredentials, error) { + resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ResourceIdentifiers.KeyVault) if err != nil { return nil, err } - return &CloudConfigProvider{ - config: config, - environment: env, - servicePrincipalToken: token, + return &AzureKeyVaultCredentials{ + Token: token, + EndpointPartial: endpoint, }, nil } -// NewFromEnvironment creates a credentials object based on available environment settings to use with Azure Key Vault -func NewFromEnvironment() (Credentials, error) { - authSettings, err := azureAuth.GetSettingsFromEnvironment() - if err != nil { - return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) - } - - resourceSplit := strings.SplitAfterN(authSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2) +// GetAzureKeyVaultCredentials will get Azure credentials +func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyVaultCredentials, error) { + resourceSplit := strings.SplitAfterN(c.envSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2) endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - akvCreds := &credentials{ + akvCreds := &AzureKeyVaultCredentials{ EndpointPartial: endpoint, } // ClientID / Secret - if creds, err := authSettings.GetClientCredentials(); err == nil { - creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint - creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault + if creds, err := c.envSettings.GetClientCredentials(); err == nil { + creds.AADEndpoint = c.envSettings.Environment.ActiveDirectoryEndpoint + creds.Resource = c.envSettings.Environment.ResourceIdentifiers.KeyVault token, err := creds.ServicePrincipalToken() if err != nil { @@ -133,9 +83,9 @@ func NewFromEnvironment() (Credentials, error) { } // Certificate - if creds, err := authSettings.GetClientCertificate(); err == nil { - creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint - creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault + if creds, err := c.envSettings.GetClientCertificate(); err == nil { + creds.AADEndpoint = c.envSettings.Environment.ActiveDirectoryEndpoint + creds.Resource = c.envSettings.Environment.ResourceIdentifiers.KeyVault token, err := creds.ServicePrincipalToken() if err != nil { @@ -146,9 +96,9 @@ func NewFromEnvironment() (Credentials, error) { } // Username / Password - if creds, err := authSettings.GetUsernamePassword(); err == nil { - creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint - creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault + if creds, err := c.envSettings.GetUsernamePassword(); err == nil { + creds.AADEndpoint = c.envSettings.Environment.ActiveDirectoryEndpoint + creds.Resource = c.envSettings.Environment.ResourceIdentifiers.KeyVault token, err := creds.ServicePrincipalToken() if err != nil { @@ -158,7 +108,7 @@ func NewFromEnvironment() (Credentials, error) { return akvCreds, nil } - msi := authSettings.GetMSI() + msi := c.envSettings.GetMSI() msiEndpoint, err := adal.GetMSIVMEndpoint() if err != nil { return nil, err @@ -166,7 +116,7 @@ func NewFromEnvironment() (Credentials, error) { // User-Assigned Managed Identity if msi.ClientID != "" { - token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, authSettings.Environment.ResourceIdentifiers.KeyVault, msi.ClientID) + token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, c.envSettings.Environment.ResourceIdentifiers.KeyVault, msi.ClientID) if err != nil { return nil, err } @@ -175,187 +125,10 @@ func NewFromEnvironment() (Credentials, error) { } // System-Assigned Managed Identity - token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, authSettings.Environment.ResourceIdentifiers.KeyVault) + token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, c.envSettings.Environment.ResourceIdentifiers.KeyVault) if err != nil { return nil, err } akvCreds.Token = token return akvCreds, nil } - -// NewFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault -func NewFromServicePrincipalToken(token *adal.ServicePrincipalToken) (Credentials, error) { - resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2) - endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - - return &credentials{ - Token: token, - EndpointPartial: endpoint, - }, nil -} - -// GetCredentials will get Azure credentials -func (c CloudConfigProvider) GetCredentials() (Credentials, error) { - resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) - endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - - return &credentials{ - Token: c.servicePrincipalToken, - EndpointPartial: endpoint, - }, nil -} - -// Authorizer gets an Authorizer from credentials -func (c credentials) Authorizer() (autorest.Authorizer, error) { - return createAuthorizerFromServicePrincipalToken(c.Token) -} - -// Endpoint takes the name of the keyvault and creates a correct andpoint url -func (c credentials) Endpoint(keyVaultName string) string { - return fmt.Sprintf(c.EndpointPartial, keyVaultName) -} - -// Endpoint takes the name of the keyvault and creates a correct andpoint url -func (c credentials) KeyVaultEndpoint(keyVaultName string) string { - return fmt.Sprintf(c.EndpointPartial, keyVaultName) -} - -func (t crendentialsToken) OAuthToken() string { - return t.token -} - -// MarshalJSON will get a fresh oauth token from the service principal token and serialize. -// This token will expire after the default oauth token lifetime for the service principal. -func (c credentials) MarshalJSON() ([]byte, error) { - err := c.Token.Refresh() - if err != nil { - return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err) - } - - return json.Marshal(&OAuthCredentials{ - OAuthToken: c.Token.OAuthToken(), - EndpointPartial: c.EndpointPartial, - }) -} - -// Authorizer gets an Authorizer from credentials -func (c OAuthCredentials) Authorizer() (autorest.Authorizer, error) { - return createAuthorizerFromOAuthToken(c.OAuthToken) -} - -// Endpoint takes the name of the keyvault and creates a correct andpoint url -func (c OAuthCredentials) Endpoint(keyVaultName string) string { - return fmt.Sprintf(c.EndpointPartial, keyVaultName) -} - -func getServicePrincipalTokenFromCloudConfig(config *auth.AzureAuthConfig, env *azure.Environment, resource string) (*adal.ServicePrincipalToken, error) { - if config.UseManagedIdentityExtension { - log.Debug("azure: using managed identity extension to retrieve access token") - msiEndpoint, err := adal.GetMSIVMEndpoint() - if err != nil { - return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) - } - - if len(config.UserAssignedIdentityID) > 0 { - log.Debug("azure: using User Assigned MSI ID to retrieve access token") - token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, - resource, - config.UserAssignedIdentityID) - - return token, err - } - log.Debug("azure: using System Assigned MSI to retrieve access token") - token, err := adal.NewServicePrincipalTokenFromMSI( - msiEndpoint, - resource) - - return token, err - } - - oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) - if err != nil { - return nil, fmt.Errorf("creating the OAuth config: %v", err) - } - - if len(config.AADClientSecret) > 0 { - log.Debug("azure: using client_id+client_secret to retrieve access token") - token, err := adal.NewServicePrincipalToken( - *oauthConfig, - config.AADClientID, - config.AADClientSecret, - resource) - - return token, err - } - - if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 { - log.Debug("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") - certData, err := ioutil.ReadFile(config.AADClientCertPath) - if err != nil { - return nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) - } - certificate, privateKey, err := decodePkcs12(certData, config.AADClientCertPassword) - if err != nil { - return nil, fmt.Errorf("decoding the client certificate: %v", err) - } - token, err := adal.NewServicePrincipalTokenFromCertificate( - *oauthConfig, - config.AADClientID, - certificate, - privateKey, - resource) - return token, err - } - - return nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID) -} - -func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) { - err := token.Refresh() - if err != nil { - return nil, err - } - return createAuthorizerFromOAuthToken(token.OAuthToken()) -} - -func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) { - tokenProvider := crendentialsToken{token: token} - return autorest.NewBearerAuthorizer(tokenProvider), nil -} - -// ParseConfig returns a parsed configuration for an Azure cloudprovider config file -func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, error) { - var config auth.AzureAuthConfig - - if configReader == nil { - return &config, nil - } - - limitedReader := &io.LimitedReader{R: configReader, N: maxReadLength} - configContents, err := ioutil.ReadAll(limitedReader) - if err != nil { - return nil, err - } - if limitedReader.N <= 0 { - return nil, errors.New("the read limit is reached") - } - err = yaml.Unmarshal(configContents, &config) - if err != nil { - return nil, err - } - - return &config, nil -} - -func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) { - privateKey, certificate, err := pkcs12.Decode(pkcs, password) - if err != nil { - return nil, nil, fmt.Errorf("decoding the PKCS#12 client certificate: %v", err) - } - rsaPrivateKey, isRsaKey := privateKey.(*rsa.PrivateKey) - if !isRsaKey { - return nil, nil, fmt.Errorf("PKCS#12 certificate must contain a RSA private key") - } - - return certificate, rsaPrivateKey, nil -} diff --git a/pkg/azure/credentialprovider/credential_test.go b/pkg/azure/credentialprovider/credential_test.go index e6e230df..4a29ffea 100644 --- a/pkg/azure/credentialprovider/credential_test.go +++ b/pkg/azure/credentialprovider/credential_test.go @@ -62,12 +62,17 @@ import ( func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { akv2k8sTesting.EnsureIntegrationEnvironment(t) - creds, err := NewFromEnvironment() + provider, err := NewFromEnvironment() if err != nil { t.Error(err) } - token := creds.(*credentials).Token + creds, err := provider.GetAzureKeyVaultCredentials() + if err != nil { + t.Error(err) + } + + token := creds.Token err = token.Refresh() if err != nil { t.Error(err) @@ -81,9 +86,9 @@ func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { func TestIntegrationAuthFromConfigAudience(t *testing.T) { akv2k8sTesting.EnsureIntegrationEnvironment(t) - tenantId := os.Getenv("AZURE_TENANT_ID") - subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID") - clientId := os.Getenv("AZURE_CLIENT_ID") + tenantID := os.Getenv("AZURE_TENANT_ID") + subscriptionID := os.Getenv("AZURE_SUBSCRIPTION_ID") + clientID := os.Getenv("AZURE_CLIENT_ID") clientSecret := os.Getenv("AZURE_CLIENT_SECRET") config := fmt.Sprintf(`{ @@ -121,7 +126,7 @@ func TestIntegrationAuthFromConfigAudience(t *testing.T) { "maximumLoadBalancerRuleCount": 250, "providerKeyName": "k8s", "providerKeyVersion": "" -}`, tenantId, subscriptionId, clientId, clientSecret) +}`, tenantID, subscriptionID, clientID, clientSecret) r := strings.NewReader(config) @@ -130,12 +135,12 @@ func TestIntegrationAuthFromConfigAudience(t *testing.T) { t.Error(err) } - creds, err := conf.GetCredentials() + creds, err := conf.GetAzureKeyVaultCredentials() if err != nil { t.Error(err) } - token := creds.(*credentials).Token + token := creds.Token err = token.Refresh() if err != nil { t.Error(err) diff --git a/pkg/azure/credentialprovider/oauth.go b/pkg/azure/credentialprovider/oauth.go new file mode 100644 index 00000000..7ab3069d --- /dev/null +++ b/pkg/azure/credentialprovider/oauth.go @@ -0,0 +1,51 @@ +// Copyright © 2019 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go) + +// Todo: Needs refactoring + +package credentialprovider + +import ( + "fmt" + + "github.com/Azure/go-autorest/autorest" +) + +// OAuthCredentials has credentials need to authenticate with azure. +// These credentials expires when the oauth token expire (default one our in Azure). Use the +// Credentials interface if you want tokens to refresh. +type OAuthCredentials struct { + OAuthToken string `json:"oauth_token"` + EndpointPartial string `json:"endpoint_partial"` +} + +type crendentialsToken struct { + token string +} + +func (t crendentialsToken) OAuthToken() string { + return t.token +} + +// AzureKeyVaultEndpoint takes the name of the keyvault and creates a correct andpoint url +func (c OAuthCredentials) AzureKeyVaultEndpoint(keyVaultName string) string { + return fmt.Sprintf(c.EndpointPartial, keyVaultName) +} + +// Authorizer gets an Authorizer from credentials +func (c OAuthCredentials) Authorizer() (autorest.Authorizer, error) { + return createAuthorizerFromOAuthToken(c.OAuthToken) +} diff --git a/pkg/azure/credentialprovider/provider.go b/pkg/azure/credentialprovider/provider.go new file mode 100644 index 00000000..17856dfb --- /dev/null +++ b/pkg/azure/credentialprovider/provider.go @@ -0,0 +1,243 @@ +// Copyright © 2019 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go) + +// Todo: Needs refactoring + +package credentialprovider + +import ( + "crypto/rsa" + "crypto/x509" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "strings" + + "golang.org/x/crypto/pkcs12" + + "github.com/Azure/go-autorest/autorest" + "github.com/Azure/go-autorest/autorest/adal" + "github.com/Azure/go-autorest/autorest/azure" + "github.com/spf13/pflag" + + azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" + log "github.com/sirupsen/logrus" + "k8s.io/legacy-cloud-providers/azure/auth" + "sigs.k8s.io/yaml" +) + +var flagConfigFile = pflag.String("azure-container-registry-config", "", + "Path to the file containing Azure container registry configuration information.") + +const ( + maxReadLength = 10 * 1 << 20 // 10MB +) + +// CloudConfigCredentialProvider provides credentials for Azure using the cloud config file +type CloudConfigCredentialProvider struct { + config *auth.AzureAuthConfig + environment *azure.Environment +} + +// EnvironmentCredentialProvider provides credentials for Azure using environment vars +type EnvironmentCredentialProvider struct { + envSettings *azureAuth.EnvironmentSettings +} + +// Credentials has credentials needed to authenticate with azure key vault. +// These credentials will never expire +type Credentials interface { + Authorizer() (autorest.Authorizer, error) +} + +type credentials struct { + Token *adal.ServicePrincipalToken + EndpointPartial string +} + +// NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider +func NewFromCloudConfig(configReader io.Reader) (*CloudConfigCredentialProvider, error) { + config, err := ParseConfig(configReader) + if err != nil { + return nil, fmt.Errorf("failed reading cloud config, error: %+v", err) + } + + env, err := auth.ParseAzureEnvironment(config.Cloud) + if err != nil { + return nil, fmt.Errorf("failed to parse environment from cloud config, error: %+v", err) + } + + return &CloudConfigCredentialProvider{ + config: config, + environment: env, + }, nil +} + +// NewFromEnvironment creates a credentials object based on available environment settings to use with Azure Key Vault +func NewFromEnvironment() (*EnvironmentCredentialProvider, error) { + envSettings, err := azureAuth.GetSettingsFromEnvironment() + if err != nil { + return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err) + } + + return &EnvironmentCredentialProvider{ + envSettings: &envSettings, + }, nil +} + +// NewFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault +func NewFromServicePrincipalToken(token *adal.ServicePrincipalToken) (Credentials, error) { + resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + + return &credentials{ + Token: token, + EndpointPartial: endpoint, + }, nil +} + +// Authorizer gets an Authorizer from credentials +func (c credentials) Authorizer() (autorest.Authorizer, error) { + return createAuthorizerFromServicePrincipalToken(c.Token) +} + +// MarshalJSON will get a fresh oauth token from the service principal token and serialize. +// This token will expire after the default oauth token lifetime for the service principal. +func (c credentials) MarshalJSON() ([]byte, error) { + err := c.Token.Refresh() + if err != nil { + return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err) + } + + return json.Marshal(&OAuthCredentials{ + OAuthToken: c.Token.OAuthToken(), + EndpointPartial: c.EndpointPartial, + }) +} + +func getServicePrincipalTokenFromCloudConfig(config *auth.AzureAuthConfig, env *azure.Environment, resource string) (*adal.ServicePrincipalToken, error) { + if config.UseManagedIdentityExtension { + log.Debug("azure: using managed identity extension to retrieve access token") + msiEndpoint, err := adal.GetMSIVMEndpoint() + if err != nil { + return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) + } + + if len(config.UserAssignedIdentityID) > 0 { + log.Debug("azure: using User Assigned MSI ID to retrieve access token") + token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, + resource, + config.UserAssignedIdentityID) + + return token, err + } + log.Debug("azure: using System Assigned MSI to retrieve access token") + token, err := adal.NewServicePrincipalTokenFromMSI( + msiEndpoint, + resource) + + return token, err + } + + oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) + if err != nil { + return nil, fmt.Errorf("creating the OAuth config: %v", err) + } + + if len(config.AADClientSecret) > 0 { + log.Debug("azure: using client_id+client_secret to retrieve access token") + token, err := adal.NewServicePrincipalToken( + *oauthConfig, + config.AADClientID, + config.AADClientSecret, + resource) + + return token, err + } + + if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 { + log.Debug("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") + certData, err := ioutil.ReadFile(config.AADClientCertPath) + if err != nil { + return nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) + } + certificate, privateKey, err := decodePkcs12(certData, config.AADClientCertPassword) + if err != nil { + return nil, fmt.Errorf("decoding the client certificate: %v", err) + } + token, err := adal.NewServicePrincipalTokenFromCertificate( + *oauthConfig, + config.AADClientID, + certificate, + privateKey, + resource) + return token, err + } + + return nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID) +} + +func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) { + err := token.Refresh() + if err != nil { + return nil, err + } + return createAuthorizerFromOAuthToken(token.OAuthToken()) +} + +func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) { + tokenProvider := crendentialsToken{token: token} + return autorest.NewBearerAuthorizer(tokenProvider), nil +} + +// ParseConfig returns a parsed configuration for an Azure cloudprovider config file +func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, error) { + var config auth.AzureAuthConfig + + if configReader == nil { + return &config, nil + } + + limitedReader := &io.LimitedReader{R: configReader, N: maxReadLength} + configContents, err := ioutil.ReadAll(limitedReader) + if err != nil { + return nil, err + } + if limitedReader.N <= 0 { + return nil, errors.New("the read limit is reached") + } + err = yaml.Unmarshal(configContents, &config) + if err != nil { + return nil, err + } + + return &config, nil +} + +func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) { + privateKey, certificate, err := pkcs12.Decode(pkcs, password) + if err != nil { + return nil, nil, fmt.Errorf("decoding the PKCS#12 client certificate: %v", err) + } + rsaPrivateKey, isRsaKey := privateKey.(*rsa.PrivateKey) + if !isRsaKey { + return nil, nil, fmt.Errorf("PKCS#12 certificate must contain a RSA private key") + } + + return certificate, rsaPrivateKey, nil +} diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index 72e607b1..7fb15148 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -40,11 +40,11 @@ type Service interface { } type azureKeyVaultService struct { - credentials credentialprovider.Credentials + credentials *credentialprovider.AzureKeyVaultCredentials } // NewService creates a new AzureKeyVaultService -func NewService(credentials credentialprovider.Credentials) Service { +func NewService(credentials *credentialprovider.AzureKeyVaultCredentials) Service { return &azureKeyVaultService{ credentials: credentials, } diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go index d58d6e39..78a4fd4f 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service_test.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go @@ -83,7 +83,7 @@ func TestIntegrationGetSecret(t *testing.T) { t.Error(err) } - creds, err := provider.GetCredentials() + creds, err := provider.GetAzureKeyVaultCredentials() if err != nil { t.Error(err) } @@ -105,7 +105,12 @@ func TestIntegrationGetSecret(t *testing.T) { func TestIntegrationEnvironmentGetSecret(t *testing.T) { akv2k8sTesting.EnsureIntegrationEnvironment(t) - creds, err := auth.NewFromEnvironment() + provider, err := auth.NewFromEnvironment() + if err != nil { + t.Error(err) + } + + creds, err := provider.GetAzureKeyVaultCredentials() if err != nil { t.Error(err) } From e7204ce550b41196cd05e1070312d0bd7cf5ecf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 24 Sep 2020 23:53:49 +0200 Subject: [PATCH 116/251] a --- cmd/azure-keyvault-controller/main.go | 13 +++++++++---- cmd/azure-keyvault-env/authentication.go | 11 ++++++++--- cmd/azure-keyvault-secrets-webhook/main.go | 11 ++++++++--- cmd/azure-keyvault-secrets-webhook/pod.go | 4 ---- cmd/azure-keyvault-secrets-webhook/registry.go | 9 +-------- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 2f6d9a6a..ca3d92fc 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -118,10 +118,15 @@ func main() { eventBroadcaster.StartLogging(log.Tracef) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) - var vaultAuth credentialprovider.Credentials + var vaultAuth *credentialprovider.AzureKeyVaultCredentials if customAuth { - if vaultAuth, err = credentialprovider.NewFromEnvironment(); err != nil { - log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) + provider, err := credentialprovider.NewFromEnvironment() + if err != nil { + log.Fatalf("failed to create azure credentials provider, error: %+v", err.Error()) + } + + if vaultAuth, err = provider.GetAzureKeyVaultCredentials(); err != nil { + log.Fatalf("failed to get azure key vault credentials, error: %+v", err.Error()) } } else { f, err := os.Open(cloudconfig) @@ -135,7 +140,7 @@ func main() { log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) } - if vaultAuth, err = cloudCnfProvider.GetCredentials(); err != nil { + if vaultAuth, err = cloudCnfProvider.GetAzureKeyVaultCredentials(); err != nil { log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) } } diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go index 3b2d0740..2ff2a3ed 100644 --- a/cmd/azure-keyvault-env/authentication.go +++ b/cmd/azure-keyvault-env/authentication.go @@ -51,7 +51,7 @@ func createHTTPClientWithTrustedCA(caCert []byte) (*http.Client, error) { return tlsClient, nil } -func getCredentials(useAuthService bool, authServiceAddress, caCert string) (credentialprovider.Credentials, error) { +func getCredentials(useAuthService bool, authServiceAddress, caCert string) (*credentialprovider.AzureKeyVaultCredentials, error) { if useAuthService { client, err := createHTTPClientWithTrustedCA([]byte(caCert)) if err != nil { @@ -71,7 +71,7 @@ func getCredentials(useAuthService bool, authServiceAddress, caCert string) (cre return nil, fmt.Errorf("failed to get credentials, %s", res.Status) } - var creds credentialprovider.OAuthCredentials + var creds *credentialprovider.AzureKeyVaultCredentials err = json.NewDecoder(res.Body).Decode(&creds) if err != nil { @@ -82,7 +82,12 @@ func getCredentials(useAuthService bool, authServiceAddress, caCert string) (cre return creds, nil } - creds, err := credentialprovider.NewFromEnvironment() + provider, err := credentialprovider.NewFromEnvironment() + if err != nil { + return nil, fmt.Errorf("failed to create credentials provider for azure key vault, error %+v", err) + } + + creds, err := provider.GetAzureKeyVaultCredentials() if err != nil { return nil, fmt.Errorf("failed to get credentials for azure key vault, error %+v", err) } diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index ce6b237c..805c9ead 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -278,9 +278,14 @@ func main() { var err error if !config.runningInsideAzureAks || config.customAuth { - config.credentials, err = credentialprovider.NewFromEnvironment() + cProvider, err := credentialprovider.NewFromEnvironment() if err != nil { - log.Fatal(err) + log.Fatal(fmt.Errorf("failed to create credentials provider for azure key vault, error %+v", err)) + } + + config.credentials, err = cProvider.GetAzureKeyVaultCredentials() + if err != nil { + log.Fatal(fmt.Errorf("failed to get credentials for azure key vault, error %+v", err)) } } else { f, err := os.Open(config.cloudConfigHostPath) @@ -294,7 +299,7 @@ func main() { log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) } - config.credentials, err = cloudCnfProvider.GetCredentials() + config.credentials, err = cloudCnfProvider.GetAzureKeyVaultCredentials() if err != nil { log.Fatal(err) } diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index de4a9f9f..311579ff 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -126,10 +126,6 @@ func mutateContainers(containers []corev1.Container, imagePullSecrets map[string log.Debugf("not trying to get acr credentials, as we are not on aks or configured to not use aks credentials with acr") } - if !ok { - log.Debugf("did not find credentials to use with registry during docker image inspection '%s' - skipping credentials", registryName) - } - autoArgs, err := getContainerCmd(container, regCred) if err != nil { return false, false, fmt.Errorf("failed to get auto cmd, error: %+v", err) diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index aaf86135..43782966 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -182,13 +182,6 @@ func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpe } func getAcrCredentials(host string, image string) *types.DockerAuthConfig { - // isAcr, wildcardHost := hostIsAzureContainerRegistry(host) - - // if !isAcr { - // log.Debugf("docker container registry is not a azure container registry") - // return types.DockerAuthConfig{}, false - // } - //Check if cloud config file exists _, err := os.Stat(config.cloudConfigHostPath) if err != nil { @@ -203,7 +196,7 @@ func getAcrCredentials(host string, image string) *types.DockerAuthConfig { } defer f.Close() - cloudCnfProvider, err := credentialprovider.NewAcrCredentialsFromCloudConfig(f) + cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) if err != nil { log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) return &types.DockerAuthConfig{} From 20462a2663116f8a2017d223bf1321cf515812ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 25 Sep 2020 00:08:49 +0200 Subject: [PATCH 117/251] Support marshalling on AzureKeyVaultCredentials --- pkg/azure/credentialprovider/akv.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pkg/azure/credentialprovider/akv.go b/pkg/azure/credentialprovider/akv.go index 88d35711..c075c923 100644 --- a/pkg/azure/credentialprovider/akv.go +++ b/pkg/azure/credentialprovider/akv.go @@ -19,6 +19,7 @@ package credentialprovider import ( + "encoding/json" "fmt" "strings" @@ -43,6 +44,20 @@ func (c AzureKeyVaultCredentials) Endpoint(keyVaultName string) string { return fmt.Sprintf(c.EndpointPartial, keyVaultName) } +// MarshalJSON will get a fresh oauth token from the service principal token and serialize. +// This token will expire after the default oauth token lifetime for the service principal. +func (c AzureKeyVaultCredentials) MarshalJSON() ([]byte, error) { + err := c.Token.Refresh() + if err != nil { + return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err) + } + + return json.Marshal(&OAuthCredentials{ + OAuthToken: c.Token.OAuthToken(), + EndpointPartial: c.EndpointPartial, + }) +} + // GetAzureKeyVaultCredentials will get Azure credentials func (c CloudConfigCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyVaultCredentials, error) { resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) From 774f892c3517c68ce52d4712484208c5db1e5827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 28 Sep 2020 18:57:47 +0200 Subject: [PATCH 118/251] new crds for AzureManagedIdentity AzureKeyVaultIdentity --- crds/AzureKeyVaultIdentity.yaml | 33 ++++++++ crds/AzureKeyVaultSecret_v2alpha1.yaml | 108 +++++++++++++++++++++++++ crds/AzureManagedIdentity.yaml | 33 ++++++++ 3 files changed, 174 insertions(+) create mode 100644 crds/AzureKeyVaultIdentity.yaml create mode 100644 crds/AzureKeyVaultSecret_v2alpha1.yaml create mode 100644 crds/AzureManagedIdentity.yaml diff --git a/crds/AzureKeyVaultIdentity.yaml b/crds/AzureKeyVaultIdentity.yaml new file mode 100644 index 00000000..d880b1b5 --- /dev/null +++ b/crds/AzureKeyVaultIdentity.yaml @@ -0,0 +1,33 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: azurekeyvaultidentities.spv.no + labels: + app.kubernetes.io/name: akv2k8s + annotations: + "helm.sh/resource-policy": keep +spec: + group: spv.no + names: + kind: AzureKeyVaultIdentity + listKind: AzureKeyVaultIdentityList + plural: azurekeyvaultidentities + singular: azurekeyvaultidentity + shortNames: + - akvi + categories: + - all + scope: Namespaced + versions: + - name: v1alpha1 + served: true + storage: true + validation: + openAPIV3Schema: + properties: + spec: + required: ['identity'] + properties: + name: + type: string + description: Name of the Azure Managed Identity to diff --git a/crds/AzureKeyVaultSecret_v2alpha1.yaml b/crds/AzureKeyVaultSecret_v2alpha1.yaml new file mode 100644 index 00000000..5c56e38c --- /dev/null +++ b/crds/AzureKeyVaultSecret_v2alpha1.yaml @@ -0,0 +1,108 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: azurekeyvaultsecrets.spv.no + labels: + app.kubernetes.io/name: akv2k8s + annotations: + "helm.sh/resource-policy": keep +spec: + group: spv.no + names: + kind: AzureKeyVaultSecret + listKind: AzureKeyVaultSecretList + plural: azurekeyvaultsecrets + singular: azurekeyvaultsecret + shortNames: + - akvs + categories: + - all + additionalPrinterColumns: + - name: Vault + type: string + description: Which Azure Key Vault this resource is asosiated with + JSONPath: .spec.vault.name + - name: Vault Object + type: string + description: Which Azure Key Vault object this resource is asosiated with + JSONPath: .spec.vault.object.name + - name: Secret Name + type: string + description: Which Kubernetes Secret this resource is synched with, if any + JSONPath: .status.secretName + - name: Synched + type: string + description: When this resource was last synched with Azure Key Vault + JSONPath: .status.lastAzureUpdate + scope: Namespaced + versions: + - name: v1alpha1 + served: true + storage: false + - name: v1 + served: true + storage: false + - name: v2alpha1 + served: true + storage: true + + subresources: + status: {} + validation: + openAPIV3Schema: + properties: + spec: + required: ['vault'] + properties: + vault: + required: ['name', 'object'] + properties: + name: + type: string + description: Name of the Azure Key Vault + object: + required: ['name', 'type'] + properties: + name: + type: string + description: The object name in Azure Key Vault + type: + type: string + description: The type of object in Azure Key Vault + enum: + - secret + - certificate + - key + - multi-key-value-secret + version: + type: string + description: The object version in Azure Key Vault + contentType: + type: string + description: Only used when type is multi-key-value-secret. + enum: + - application/x-json + - application/x-yaml + identity: + properties: + name: + type: string + description: Name of the AzureKeyVaultSecretIdentity to use for Azure Key Vault authentication + output: + properties: + transform: + type: array + items: + type: string + secret: + required: ['name'] + properties: + name: + type: string + description: Name for Kubernetes secret + type: + type: string + description: Type of Secret in Kubernetes + dataKey: + type: string + description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data diff --git a/crds/AzureManagedIdentity.yaml b/crds/AzureManagedIdentity.yaml new file mode 100644 index 00000000..0e5842ef --- /dev/null +++ b/crds/AzureManagedIdentity.yaml @@ -0,0 +1,33 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: azuremanagedidentities.spv.no + labels: + app.kubernetes.io/name: akv2k8s + annotations: + "helm.sh/resource-policy": keep +spec: + group: spv.no + names: + kind: AzureManagedIdentity + listKind: AzureManagedIdentityList + plural: azuremanagedidentities + singular: azuremanagedidentity + shortNames: + - ami + categories: + - all + scope: Namespaced + versions: + - name: v1alpha1 + served: true + storage: true + validation: + openAPIV3Schema: + properties: + spec: + required: ['name'] + properties: + name: + type: string + description: Name of the Azure Managed Identity to From f6e16478183eb0708052d872abe3dcce28498d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 28 Sep 2020 19:01:16 +0200 Subject: [PATCH 119/251] refactor all dockerfiles into one and use distroless image as base --- .../workflows/ca-bundle-controller-build.yaml | 2 +- .github/workflows/controller-build.yaml | 2 +- .github/workflows/vaultenv-build.yaml | 2 +- .github/workflows/webhook-build.yaml | 2 +- .gitignore | 5 +- Dockerfile | 97 +++ Makefile | 226 ++++++- tools/go.mod | 8 + tools/go.sum | 606 ++++++++++++++++++ tools/tools.go | 8 + 10 files changed, 919 insertions(+), 39 deletions(-) create mode 100644 Dockerfile create mode 100644 tools/go.mod create mode 100644 tools/go.sum create mode 100644 tools/tools.go diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index d8ab11ce..5e1984d8 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -35,7 +35,7 @@ jobs: AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: - build-make-action: build-ca-bundle-controller + build-make-action: image-ca-bundle-controller - name: Push uses: ./.github/actions/push diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index 5f50406f..12a04d42 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -34,7 +34,7 @@ jobs: AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: - build-make-action: build-controller + build-make-action: image-controller - name: Push uses: ./.github/actions/push diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index 5f084b76..1c4b3a8f 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -34,7 +34,7 @@ jobs: AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: - build-make-action: build-vaultenv + build-make-action: image-vaultenv - name: Push uses: ./.github/actions/push diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index b2d3303e..88b0bbc8 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -34,7 +34,7 @@ jobs: AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} with: - build-make-action: build-webhook + build-make-action: image-webhook - name: Push uses: ./.github/actions/push diff --git a/.gitignore b/.gitignore index 927e4d19..f37fe8b7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,8 @@ bin debug.test .vscode /vendor/ +/tmp/ +/.tools/ *.tmp -test.yaml \ No newline at end of file +test.yaml +coverage.txt \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..938778f8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,97 @@ +ARG BASEIMAGE=gcr.io/distroless/static:nonroot +ARG BASE_ALPINE=alpine:3.8 +ARG GO_VERSION=1.13.0 + +# ------- +# Builder +# ------- +FROM golang:${GO_VERSION} AS builder +ARG PACKAGE +ARG BUILD_SUB_TARGET +WORKDIR /go/src/${PACKAGE} +ADD . . +RUN go mod download +RUN make build${BUILD_SUB_TARGET} + +# ------------ +# Env Injector +# ------------ +FROM $BASEIMAGE AS webhook +ARG VCS_REF +ARG BUILD_DATE +ARG VCS_URL +LABEL org.label-schema.schema-version="1.0" +LABEL org.label-schema.build-date=$BUILD_DATE +LABEL org.label-schema.vcs-ref=$VCS_REF +LABEL org.label-schema.vcs-url=$VCS_URL +LABEL org.label-schema.url=$VCS_URL +LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault" +LABEL org.label-schema.vendor="Sparebanken Vest" +LABEL org.label-schema.author="Jon Arild Tørresdal" + +COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-secrets-webhook /usr/local/bin/ +ENV DEBUG false +USER 65534 +ENTRYPOINT ["/usr/local/bin/azure-keyvault-secrets-webhook"] + +# ---------- +# Controller +# ---------- +FROM $BASEIMAGE AS controller +ARG VCS_REF +ARG BUILD_DATE +ARG VCS_URL +LABEL org.label-schema.schema-version="1.0" +LABEL org.label-schema.build-date=$BUILD_DATE +LABEL org.label-schema.vcs-ref=$VCS_REF +LABEL org.label-schema.vcs-url=$VCS_URL +LABEL org.label-schema.url=$VCS_URL +LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault" +LABEL org.label-schema.vendor="Sparebanken Vest" +LABEL org.label-schema.author="Jon Arild Tørresdal" + +COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-controller /usr/local/bin/ +ENV DEBUG false +USER 65534 +ENTRYPOINT ["/usr/local/bin/azure-keyvault-controller"] + +# -------------------- +# CA Bundle Controller +# -------------------- +FROM $BASEIMAGE AS ca-bundle-controller +ARG VCS_REF +ARG BUILD_DATE +ARG VCS_URL +LABEL org.label-schema.schema-version="1.0" +LABEL org.label-schema.build-date=$BUILD_DATE +LABEL org.label-schema.vcs-ref=$VCS_REF +LABEL org.label-schema.vcs-url=$VCS_URL +LABEL org.label-schema.url=$VCS_URL +LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault" +LABEL org.label-schema.vendor="Sparebanken Vest" +LABEL org.label-schema.author="Jon Arild Tørresdal" + +COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/ca-bundle-controller /usr/local/bin/ +ENV DEBUG false +USER 65534 +ENTRYPOINT ["/usr/local/bin/azure-keyvault-secrets-webhook"] + +# -------- +# vaultenv +# -------- +FROM $BASEIMAGE AS vaultenv +ARG VCS_REF +ARG BUILD_DATE +ARG VCS_URL +LABEL org.label-schema.schema-version="1.0" +LABEL org.label-schema.build-date=$BUILD_DATE +LABEL org.label-schema.vcs-ref=$VCS_REF +LABEL org.label-schema.vcs-url=$VCS_URL +LABEL org.label-schema.url=$VCS_URL +LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault" +LABEL org.label-schema.vendor="Sparebanken Vest" +LABEL org.label-schema.author="Jon Arild Tørresdal" + +COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-env /usr/local/bin/ +ENV DEBUG false +USER 65534 diff --git a/Makefile b/Makefile index 123cfa8c..6c8f7892 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,19 @@ -PACKAGE=github.com/SparebankenVest/azure-key-vault-to-kubernetes +ORG_PATH=github.com/SparebankenVest +PROJECT_NAME := azure-key-vault-to-kubernetes +PACKAGE=$(ORG_PATH)/$(PROJECT_NAME) + +COMPONENT_VAR=$(PACKAGE)/pkg/akv2k8s.Component +GIT_VAR=$(PACKAGE)/pkg/akv2k8s.GitCommit +BUILD_DATE_VAR := $(PACKAGE)/pkg/akv2k8s.BuildDate KUBERNETES_VERSION=v1.15.11 KUBERNETES_DEP_VERSION=v0.15.11 +WEBHOOK_BINARY_NAME=azure-keyvault-secrets-webhook +CONTROLLER_BINARY_NAME=azure-keyvault-controller +CA_BUNDLE_CONTROLLER_BINARY_NAME=ca-bundle-controller +KEYVAULT_ENV_BINARY_NAME=azure-keyvault-env + DOCKER_INTERNAL_REG=dokken.azurecr.io DOCKER_RELEASE_REG=spvest @@ -21,65 +32,123 @@ DOCKER_RELEASE_TAG_VAULTENV := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"vault DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"ca-bundle-controller-"/""/g) TAG= +GOOS ?= linux +TEST_GOOS ?= linux BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") VCS_URL := https://$(PACKAGE) -.PHONY: int-test-init int-test-local check-tag run-docs-dev build build-controller build-webhook build-auth-service build-vaultenv build-akv2k8s-env-test test push push-controller push-webhook push-auth-service push-vaultenv push-akv2k8s-env-test pull-release release release-controller release-webhook release-auth-service release-vaultenv +TOOLS_MOD_DIR := ./tools +TOOLS_DIR := $(abspath ./.tools) + +ifeq ($(OS),Windows_NT) + GO_BUILD_MODE = default +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S), Linux) + GO_BUILD_MODE = pie + endif + ifeq ($(UNAME_S), Darwin) + GO_BUILD_MODE = default + endif +endif + +GO_BUILD_OPTIONS := --tags "netgo osusergo" -ldflags "-s -X $(COMPONENT_VAR)=$(COMPONENT) -X $(GIT_VAR)=$(DOCKER_INTERNAL_TAG) -X $(BUILD_DATE_VAR)=$(BUILD_DATE) -extldflags '-static'" + +$(TOOLS_DIR)/golangci-lint: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go + cd $(TOOLS_MOD_DIR) && \ + go build -o $(TOOLS_DIR)/golangci-lint github.com/golangci/golangci-lint/cmd/golangci-lint + +$(TOOLS_DIR)/misspell: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go + cd $(TOOLS_MOD_DIR) && \ + go build -o $(TOOLS_DIR)/misspell github.com/client9/misspell/cmd/misspell + +.PHONY: precommit +precommit: build test lint + +.PHONY: mod +mod: + @go mod tidy + +.PHONY: check-vendor +check-mod: mod + @git diff --exit-code go.mod go.sum + +.PHONY: lint +lint: $(TOOLS_DIR)/golangci-lint $(TOOLS_DIR)/misspell + $(TOOLS_DIR)/golangci-lint run --timeout=5m + $(TOOLS_DIR)/misspell -w $(ALL_DOCS) && \ + go mod tidy +.PHONY: print-v-webhook print-v-webhook: @echo $(DOCKER_RELEASE_TAG_WEBHOOK) +.PHONY: print-v-controller print-v-controller: @echo $(DOCKER_RELEASE_TAG_CONTROLLER) +.PHONY: print-v-vaultenv print-v-vaultenv: @echo $(DOCKER_RELEASE_TAG_VAULTENV) +.PHONY: print-v-ca-bundle-controller print-v-ca-bundle-controller: @echo $(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) +.PHONY: tag-all tag-all: tag-webhook tag-controller tag-ca-bundle-controller tag-vaultenv +.PHONY: tag-crd tag-crd: check-tag git tag -a crd-$(TAG) -m "CRD version $(TAG)" git push --tags +.PHONY: tag-webhook tag-webhook: check-tag git tag -a webhook-$(TAG) -m "Webhook version $(TAG)" git push --tags +.PHONY: tag-controller tag-controller: check-tag git tag -a controller-$(TAG) -m "Controller version $(TAG)" git push --tags +.PHONY: tag-ca-bundle-controller tag-ca-bundle-controller: check-tag git tag -a ca-bundle-controller-$(TAG) -m "CA Bundle Controller version $(TAG)" git push --tags +.PHONY: tag-vaultenv tag-vaultenv: check-tag git tag -a vaultenv-$(TAG) -m "Vaultenv version $(TAG)" git push --tags +.PHONY: check-tag check-tag: ifndef TAG $(error TAG is undefined) endif +.PHONY: docs-install-dev docs-install-dev: cd ./docs && npm install +.PHONY: docs-run-dev docs-run-dev: cd ./docs && GATSBY_ALGOLIA_ENABLED=false npm run start +.PHONY: fmt fmt: @echo "==> Fixing source code with gofmt..." # This logic should match the search logic in scripts/gofmtcheck.sh find . -name '*.go' | grep -v /pkg/k8s/ | xargs gofmt -s -w +.PHONY: fmtcheck fmtcheck: $(CURDIR)/scripts/gofmtcheck.sh +.PHONY: codegen codegen: @echo "Making sure code-generator has correct version of Kubernetes ($(KUBERNETES_DEP_VERSION))" @echo "" @@ -87,73 +156,167 @@ codegen: git clone --depth 1 --branch $(KUBERNETES_DEP_VERSION) git@github.com:kubernetes/code-generator.git ${GOPATH}/src/k8s.io/code-generator ./hack/update-codegen.sh +.PHONY: test test: fmtcheck - @CGO_ENABLED=0 AKV2K8S_CLIENT_ID=$(AKV2K8S_CLIENT_ID) AKV2K8S_CLIENT_SECRET=$(AKV2K8S_CLIENT_SECRET) AKV2K8S_CLIENT_TENANT_ID=$(AKV2K8S_CLIENT_TENANT_ID) AKV2K8S_AZURE_SUBSCRIPTION_ID=$(AKV2K8S_AZURE_SUBSCRIPTION_ID) go test -count=1 -v $(shell go list ./... | grep -v /pkg/k8s/) - + GOOS=$(TEST_GOOS) \ + CGO_ENABLED=1 \ + AKV2K8S_CLIENT_ID=$(AKV2K8S_CLIENT_ID) \ + AKV2K8S_CLIENT_SECRET=$(AKV2K8S_CLIENT_SECRET) \ + AKV2K8S_CLIENT_TENANT_ID=$(AKV2K8S_CLIENT_TENANT_ID) \ + AKV2K8S_AZURE_SUBSCRIPTION_ID=$(AKV2K8S_AZURE_SUBSCRIPTION_ID) \ + go test -race -coverprofile=coverage.txt -covermode=atomic -count=1 -v $(shell go list ./... | grep -v /pkg/k8s/) + +.PHONY: init-int-test-local init-int-test-local: $(eval AKV2K8S_CLIENT_ID ?= $(shell az keyvault secret show --name int-test-azure-client-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value')) $(eval AKV2K8S_CLIENT_SECRET ?= $(shell az keyvault secret show --name int-test-azure-client-secret --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value')) $(eval AKV2K8S_CLIENT_TENANT_ID ?= $(shell az keyvault secret show --name int-test-azure-tenant-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value')) +.PHONY: int-test-local int-test-local: init-int-test-local test - -build-local: fmtcheck - CGO_ENABLED=0 go build -v $(shell go list ./...) - -build: build-controller build-ca-bundle-controller build-webhook build-vaultenv - -build-controller: - docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/controller/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) - -build-ca-bundle-controller: - docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/ca-bundle-controller/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/ca-bundle-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) - -build-webhook: - docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/env-injector/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-secrets-webhook" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) - -build-vaultenv: - docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/vault-env/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-env" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) - -build-akv2k8s-env-test: +bin/%: + GOOS=$(GOOS) GOARCH=amd64 go build $(GO_BUILD_OPTIONS) -o "$(@)" "$(PKG_NAME)" + +.PHONY: clean +clean: + rm -rf bin/$(PROJECT_NAME) + +.PHONY: clean-webhook +clean-webhook: + rm -rf bin/$(PROJECT_NAME)/$(WEBHOOK_BINARY_NAME) + +.PHONY: clean-controller +clean-controller: + rm -rf bin/$(PROJECT_NAME)/$(CONTROLLER_BINARY_NAME) + +.PHONY: ca-bundle-controller +clean-ca-bundle-controller: + rm -rf bin/$(PROJECT_NAME)/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) + +.PHONY: clean-vaultenv +clean-vaultenv: + rm -rf bin/$(PROJECT_NAME)/$(KEYVAULT_ENV_BINARY_NAME) + +# build: build-controller build-ca-bundle-controller build-webhook build-vaultenv +.PHONY: build +build: clean build-webhook build-controller build-vaultenv build-ca-bundle-controller + +.PHONY: build-webhook +build-webhook: clean-webhook + CGO_ENABLED=0 COMPONENT=webhook PKG_NAME=$(PACKAGE)/cmd/$(WEBHOOK_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(WEBHOOK_BINARY_NAME) + +.PHONY: build-controller +build-controller: clean-controller + CGO_ENABLED=0 COMPONENT=controller PKG_NAME=$(PACKAGE)/cmd/$(CONTROLLER_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(CONTROLLER_BINARY_NAME) + +.PHONY: build-ca-bundle-controller +build-ca-bundle-controller: clean-ca-bundle-controller + CGO_ENABLED=0 COMPONENT=ca-bundle-controller PKG_NAME=$(PACKAGE)/cmd/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) + +.PHONY: build-vaultenv +build-vaultenv: clean-ca-bundle-controller + CGO_ENABLED=0 COMPONENT=vaultenv PKG_NAME=$(PACKAGE)/cmd/$(KEYVAULT_ENV_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(KEYVAULT_ENV_BINARY_NAME) + +images: image-webhook image-controller image-ca-bundle-controller image-vaultenv + +.PHONY: image-webhook +image-webhook: + docker build \ + --target webhook \ + --build-arg BUILD_SUB_TARGET=-webhook \ + --build-arg PACKAGE=$(PACKAGE) \ + --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ + --build-arg BUILD_DATE=$(BUILD_DATE) \ + --build-arg VCS_URL=$(VCS_URL) \ + -t $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) . + +.PHONY: image-controller +image-controller: + # docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/controller/Dockerfile --build-arg BUILD_OPTIONS="$(GO_BUILD_OPTIONS)" --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) + docker build \ + --target controller \ + --build-arg BUILD_SUB_TARGET=-controller \ + --build-arg PACKAGE=$(PACKAGE) \ + --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ + --build-arg BUILD_DATE=$(BUILD_DATE) \ + --build-arg VCS_URL=$(VCS_URL) \ + -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) . + +.PHONY: image-ca-bundle-controller +image-ca-bundle-controller: + # docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/ca-bundle-controller/Dockerfile --build-arg BUILD_OPTIONS="$(GO_BUILD_OPTIONS)" --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/ca-bundle-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) + docker build \ + --target ca-bundle-controller \ + --build-arg BUILD_SUB_TARGET=-ca-bundle-controller \ + --build-arg PACKAGE=$(PACKAGE) \ + --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ + --build-arg BUILD_DATE=$(BUILD_DATE) \ + --build-arg VCS_URL=$(VCS_URL) \ + -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) . + +.PHONY: image-vaultenv +image-vaultenv: + # docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/vault-env/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg BUILD_OPTIONS="$(GO_BUILD_OPTIONS)" --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-env" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) + docker build \ + --target vaultenv \ + --build-arg BUILD_SUB_TARGET=-vaultenv \ + --build-arg PACKAGE=$(PACKAGE) \ + --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ + --build-arg BUILD_DATE=$(BUILD_DATE) \ + --build-arg VCS_URL=$(VCS_URL) \ + -t $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) . + +.PHONY: image-akv2k8s-env-test +image-akv2k8s-env-test: docker build . -t $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) -f images/akv2k8s-test/Dockerfile +.PHONY: push push: push-controller push-ca-bundle-controller push-webhook push-vaultenv +.PHONY: push-controller push-controller: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) +.PHONY: push-ca-bundle-controller push-ca-bundle-controller: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) +.PHONY: push-webhook push-webhook: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) -push-auth-service: - docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) - +.PHONY: push-vaultenv push-vaultenv: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) +.PHONY: push-akv2k8s-env-test push-akv2k8s-env-test: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) +.PHONY: pull-all pull-all: pull-webhook pull-controller pull-ca-bundle-controller pull-vaultenv +.PHONY: pull-webhook pull-webhook: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) +.PHONY: pull-controller pull-controller: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) +.PHONY: pull-ca-bundle-controller pull-ca-bundle-controller: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) +.PHONY: pull-vaultenv pull-vaultenv: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) +.PHONY: release release: release-controller release-ca-bundle-controller release-webhook release-vaultenv +.PHONY: release-controller release-controller: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CONTROLLER) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest @@ -161,6 +324,7 @@ release-controller: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CONTROLLER) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest +.PHONY: release-ca-bundle-controller release-ca-bundle-controller: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest @@ -168,6 +332,7 @@ release-ca-bundle-controller: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest +.PHONY: release-webhook release-webhook: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest @@ -175,17 +340,10 @@ release-webhook: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest +.PHONY: release-vaultenv release-vaultenv: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG_VAULTENV) docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):latest docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG_VAULTENV) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):latest - -# define release_image -# docker pull $(DOCKER_INTERNAL_REG)/$(1):$(DOCKER_INTERNAL_TAG) -# docker tag $(DOCKER_INTERNAL_REG)/$(1):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(1):$(DOCKER_RELEASE_TAG) -# docker tag $(DOCKER_INTERNAL_REG)/$(1):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(1):latest -# docker push $(DOCKER_RELEASE_REG)/$(1):$(DOCKER_RELEASE_TAG) -# docker push $(DOCKER_RELEASE_REG)/$(1):latest -# endef \ No newline at end of file diff --git a/tools/go.mod b/tools/go.mod new file mode 100644 index 00000000..6804956a --- /dev/null +++ b/tools/go.mod @@ -0,0 +1,8 @@ +module github.com/SparebankenVest/azure-key-vault-to-kubernetesl/tools + +go 1.14 + +require ( + github.com/client9/misspell v0.3.4 + github.com/golangci/golangci-lint v1.30.0 +) diff --git a/tools/go.sum b/tools/go.sum new file mode 100644 index 00000000..0e729143 --- /dev/null +++ b/tools/go.sum @@ -0,0 +1,606 @@ +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.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.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +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/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 h1:XTrzB+F8+SpRmbhAH8HLxhiiG6nYNwaBZjrFps1oWEk= +github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +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/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/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/bombsimon/wsl/v3 v3.1.0 h1:E5SRssoBgtVFPcYWUOFJEcgaySgdtTNYzsSKDOY7ss8= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +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-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/daixiang0/gci v0.0.0-20200727065011-66f1df783cb2 h1:3Lhhps85OdA8ezsEKu+IA1hE+DBTjt/fjd7xNCrHbVA= +github.com/daixiang0/gci v0.0.0-20200727065011-66f1df783cb2/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUsNa8F+hHc6w= +github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0= +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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-critic/go-critic v0.5.0 h1:Ic2p5UCl5fX/2WX2w8nroPpPhxRNsNTMlJzsu/uqwnM= +github.com/go-critic/go-critic v0.5.0/go.mod h1:4jeRh3ZAVnRYhuWdOEvwzVqLUpxMSoAT0xZ74JsTPlo= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +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-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc= +github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/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/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.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.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.30.0 h1:UhdK5WbO0GBd7W+k2lOD7BEJH4Wsa7zKfw8m3/aEJGQ= +github.com/golangci/golangci-lint v1.30.0/go.mod h1:5t0i3wHlqQc9deBBvZsP+a/4xz7cfjV+zhp5U0Mzp14= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +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/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 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +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/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3 h1:iwp+5/UAyzQSFgQ4uR2sni99sJ8Eo9DEacKWM5pekIg= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/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-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-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.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 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +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/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.10.5/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +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 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +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/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kyoh86/exportloopref v0.1.7 h1:u+iHuTbkbTS2D/JP7fCuZDo/t3rBVGo3Hf58Rc+lQVY= +github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +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-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +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 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.0.0-20200708172631-8866003e3856 h1:W3KBC2LFyfgd+wNudlfgCCsTo4q97MeNWrfz8/wSdSc= +github.com/nishanths/exhaustive v0.0.0-20200708172631-8866003e3856/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +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-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +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 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +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/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8 h1:DvnesvLtRPQOvaUbfXfh0tpMHg29by0H7F2U+QIkSu8= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.4.0 h1:ivAoWcY5DMs9n04Abc1VkqZBO0FL0h4ShTcVsC53lCE= +github.com/securego/gosec/v2 v2.4.0/go.mod h1:0/Q4cjmlFDfDUj1+Fib61sc+U5IQb2w+Iv9/C3wPVko= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +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.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +github.com/sourcegraph/go-diff v0.5.3 h1:lhIKJ2nXLZZ+AfbHpYxTn0pXpNTTui0DX7DO3xeb1Zs= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/ssgreg/nlreturn/v2 v2.0.1 h1:+lm6xFjVuNw/9t/Fh5sIwfNWefiD5bddzc6vwJ1TvRI= +github.com/ssgreg/nlreturn/v2 v2.0.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v0.4.8 h1:h61+hQraWhdI6WYqMwAwZYCE5yxL6a9/Orw4REbabSU= +github.com/tetafro/godot v0.4.8/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.12.0/go.mod h1:229t1eWu9UXTPmoUkbpN/fctKPBY4IJoFXQnxHGXy6E= +github.com/valyala/quicktemplate v1.5.1/go.mod h1:v7yYWpBEiutDyNfVaph6oC/yKwejzVyTX/2cwwHxyok= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +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= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +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/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/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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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-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-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-20190620200207-3b0461eec859/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-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45/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-20190227155943-e225da77a7e6/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-20200625203802-6e8e738ad208/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-20190215142949-d0b11bdaac8a/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-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/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-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/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-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +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-20190311215038-5c2858a9cfe5/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-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/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-20190521203540-521d6ed310dd/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-20190719005602-e377ae9d6386/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-20190910044552-dd2b5c81c578/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-20191012152004-8de300cfc20a/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-20191119224855-298f0cb1881e/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-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200321224714-0d839f3cf2ed/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200519015757-0d0afa43d58a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200701041122-1837592efa10/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305 h1:yaM5S0KcY0lIoZo7Fl+oi91b/DdlU2zuWpfHrpWbCS0= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +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.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +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/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/genproto v0.0.0-20180817151627-c66870c02cf8/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-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/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +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/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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +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 h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +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.4/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 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +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-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.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f h1:gi7cb8HTDZ6q8VqsUpkdoFi3vxwHMneQ6+Q5Ap5hjPE= +mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/tools/tools.go b/tools/tools.go new file mode 100644 index 00000000..0e4e2518 --- /dev/null +++ b/tools/tools.go @@ -0,0 +1,8 @@ +// +build tools + +package tools + +import ( + _ "github.com/client9/misspell/cmd/misspell" + _ "github.com/golangci/golangci-lint/cmd/golangci-lint" +) From 1c672a396d96938c2d3e39fa6ef9f396334f96a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 28 Sep 2020 19:13:22 +0200 Subject: [PATCH 120/251] new API version v2alpha1 --- .../controller/controller.go | 4 +- .../controller/handler.go | 8 +- .../controller/secret_handler.go | 2 +- .../controller/secret_handler_test.go | 2 +- cmd/azure-keyvault-controller/main.go | 10 +- cmd/azure-keyvault-env/main.go | 10 +- cmd/azure-keyvault-env/secret_handler.go | 2 +- cmd/azure-keyvault-secrets-webhook/main.go | 14 +- cmd/azure-keyvault-secrets-webhook/pod.go | 59 +- .../registry.go | 3 + cmd/ca-bundle-controller/main.go | 116 ++- go.mod | 17 +- go.sum | 691 +++++++++++------- hack/update-codegen.sh | 2 +- .../controller/cabundleinjector/controller.go | 41 +- .../cabundleinjector/controller_test.go | 20 +- pkg/akv2k8s/transformers/handler_test.go | 2 +- pkg/akv2k8s/transformers/transformator.go | 2 +- pkg/akv2k8s/version.go | 37 + pkg/akv2k8s/version_test.go | 21 + pkg/azure/credentialprovider/acr.go | 7 +- pkg/azure/credentialprovider/akv.go | 57 +- .../credentialprovider/credential_test.go | 6 + pkg/azure/credentialprovider/provider.go | 114 ++- .../keyvault/client/azure_keyvault_service.go | 2 +- .../client/azure_keyvault_service_test.go | 2 +- pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go | 21 + .../apis/azurekeyvault/v2alpha1/register.go | 54 ++ pkg/k8s/apis/azurekeyvault/v2alpha1/types.go | 150 ++++ .../v2alpha1/zz_generated.deepcopy.go | 271 +++++++ .../client/clientset/versioned/clientset.go | 14 + .../versioned/fake/clientset_generated.go | 7 + .../clientset/versioned/fake/register.go | 2 + .../clientset/versioned/scheme/register.go | 2 + .../v2alpha1/azurekeyvault_client.go | 97 +++ .../v2alpha1/azurekeyvaultsecret.go | 194 +++++ .../v2alpha1/azurekeyvaultsecretidentity.go | 177 +++++ .../typed/azurekeyvault/v2alpha1/doc.go | 23 + .../typed/azurekeyvault/v2alpha1/fake/doc.go | 23 + .../fake/fake_azurekeyvault_client.go | 47 ++ .../v2alpha1/fake/fake_azurekeyvaultsecret.go | 143 ++++ .../fake/fake_azurekeyvaultsecretidentity.go | 131 ++++ .../v2alpha1/generated_expansion.go | 26 + .../azurekeyvault/interface.go | 8 + .../v2alpha1/azurekeyvaultsecret.go | 92 +++ .../v2alpha1/azurekeyvaultsecretidentity.go | 92 +++ .../azurekeyvault/v2alpha1/interface.go | 55 ++ .../informers/externalversions/generic.go | 7 + .../v2alpha1/azurekeyvaultsecret.go | 97 +++ .../v2alpha1/azurekeyvaultsecretidentity.go | 97 +++ .../v2alpha1/expansion_generated.go | 38 + 51 files changed, 2667 insertions(+), 452 deletions(-) create mode 100644 pkg/akv2k8s/version.go create mode 100644 pkg/akv2k8s/version_test.go create mode 100644 pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go create mode 100644 pkg/k8s/apis/azurekeyvault/v2alpha1/register.go create mode 100644 pkg/k8s/apis/azurekeyvault/v2alpha1/types.go create mode 100644 pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go create mode 100644 pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go create mode 100644 pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go create mode 100644 pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go create mode 100644 pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go create mode 100644 pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go create mode 100644 pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 7f2e7c1c..9e5269ed 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -33,9 +33,9 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" - informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1" + informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" ) const ( diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 477e88b5..3c1d8c15 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -41,9 +41,9 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v1" + listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" ) // Handler process work on workqueues @@ -77,7 +77,7 @@ type AzurePollFrequency struct { } //NewHandler returns a new Handler -func NewHandler(kubeclientset kubernetes.Interface, azureKeyvaultClientset clientset.Interface, secretLister corelisters.SecretLister, azureKeyVaultSecretsLister listers.AzureKeyVaultSecretLister, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency) *Handler { +func NewHandler(kubeclientset kubernetes.Interface, azureKeyvaultClientset clientset.Interface, secretLister corelisters.SecretLister, azureKeyVaultSecretsLister listers.AzureKeyVaultSecretLister, azureKeyVaultSecretIdentitiesLister listers.AzureKeyVaultSecretIdentityLister, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency) *Handler { return &Handler{ kubeclientset: kubeclientset, azureKeyvaultClientset: azureKeyvaultClientset, @@ -285,7 +285,7 @@ func (h *Handler) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.Azure // we must use Update instead of UpdateStatus to update the Status block of the AzureKeyVaultSecret resource. // UpdateStatus will not allow changes to the Spec of the resource, // which is ideal for ensuring nothing other than resource status has been updated. - _, err := h.azureKeyvaultClientset.AzurekeyvaultV1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy) + _, err := h.azureKeyvaultClientset.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy) return err } diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index d1b4d2a9..8f370995 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go index 2a7b2ccd..bb9ee362 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go @@ -22,7 +22,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index ca3d92fc..d350a075 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -36,6 +36,7 @@ import ( "k8s.io/client-go/tools/record" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/cmd/azure-keyvault-controller/controller" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" @@ -48,6 +49,7 @@ var ( kubeconfig string cloudconfig string logLevel string + version string azureVaultFastRate time.Duration azureVaultSlowRate time.Duration @@ -59,11 +61,13 @@ const controllerAgentName = "azurekeyvaultcontroller" func main() { flag.Parse() + akv2k8s.Version = version logFormat := "fmt" logFormat, _ = os.LookupEnv("LOG_FORMAT") setLogFormat(logFormat) + akv2k8s.LogVersion() // set up signals so we handle the first shutdown signal gracefully stopCh := signals.SetupSignalHandler() @@ -107,6 +111,7 @@ func main() { kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30) azureKeyVaultSecretInformerFactory := informers.NewSharedInformerFactory(azureKeyVaultSecretClient, time.Second*30) + azurePollFrequency := controller.AzurePollFrequency{ Normal: azureVaultFastRate, Slow: azureVaultSlowRate, @@ -147,11 +152,11 @@ func main() { vaultService := vault.NewService(vaultAuth) recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) - handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V1().AzureKeyVaultSecrets().Lister(), recorder, vaultService, azurePollFrequency) + handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecretIdentities().Lister(), recorder, vaultService, azurePollFrequency) controller := controller.NewController(handler, kubeInformerFactory.Core().V1().Secrets(), - azureKeyVaultSecretInformerFactory.Azurekeyvault().V1().AzureKeyVaultSecrets(), + azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets(), azurePollFrequency) // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) @@ -165,6 +170,7 @@ func main() { } func init() { + flag.StringVar(&version, "version", "", "Version of this component.") flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") flag.StringVar(&logLevel, "log-level", "", "log level") diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 8273d00d..94f70d02 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -25,9 +25,10 @@ import ( "syscall" "time" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" log "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -153,6 +154,8 @@ func validateConfig(requiredEnvVars map[string]string) error { func main() { initConfig() + akv2k8s.Version = viper.GetString("version") + var origCommand string var origArgs []string var err error @@ -161,6 +164,7 @@ func main() { setLogLevel(logLevel) logFormat := viper.GetString("env_injector_log_format") formatLogger(logFormat) + akv2k8s.LogVersion() logger.Debugf("azure key vault env injector initializing") @@ -262,13 +266,13 @@ func main() { } logger.Debugf("getting azurekeyvaultsecret resource '%s' from kubernetes", secretName) - keyVaultSecretSpec, err := azureKeyVaultSecretClient.AzurekeyvaultV1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + keyVaultSecretSpec, err := azureKeyVaultSecretClient.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error()) logger.Infof("will retry getting azurekeyvaultsecret resource up to %d times, waiting %d seconds between retries", config.retryTimes, config.waitTimeBetweenRetries) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { - keyVaultSecretSpec, err = azureKeyVaultSecretClient.AzurekeyvaultV1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + keyVaultSecretSpec, err = azureKeyVaultSecretClient.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %+v", secretName, err) return err diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go index a83966a2..fec73294 100644 --- a/cmd/azure-keyvault-env/secret_handler.go +++ b/cmd/azure-keyvault-env/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 805c9ead..8d0331a3 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -24,6 +24,7 @@ import ( "net/http" "os" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" "github.com/gorilla/mux" "github.com/prometheus/client_golang/prometheus" @@ -185,12 +186,13 @@ func authHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) - log.Infof("served oauth token to '%s/%s' at address '%s'", pod.namespace, pod.name, r.RemoteAddr) - if err := json.NewEncoder(w).Encode(config.credentials); err != nil { log.Errorf("failed to json encode token, error: %+v", err) http.Error(w, err.Error(), http.StatusInternalServerError) + } else { + log.Infof("served oauth token to '%s/%s' at address '%s'", pod.namespace, pod.name, r.RemoteAddr) } + } else { log.Error("invalid request method") http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) @@ -222,9 +224,8 @@ func initConfig() { } func main() { - fmt.Fprintln(os.Stdout, "initializing config...") initConfig() - fmt.Fprintln(os.Stdout, "config initialized") + akv2k8s.Version = viper.GetString("version") logLevel := viper.GetString("log_level") setLogLevel(logLevel) @@ -232,6 +233,8 @@ func main() { logFormat := viper.GetString("log_format") setLogFormat(logFormat) + akv2k8s.LogVersion() + config = azureKeyVaultConfig{ port: viper.GetString("port"), httpPort: viper.GetString("port_http"), @@ -278,6 +281,7 @@ func main() { var err error if !config.runningInsideAzureAks || config.customAuth { + log.Debug("using custom auth - looking for azure key vault credentials in envrionment") cProvider, err := credentialprovider.NewFromEnvironment() if err != nil { log.Fatal(fmt.Errorf("failed to create credentials provider for azure key vault, error %+v", err)) @@ -287,6 +291,8 @@ func main() { if err != nil { log.Fatal(fmt.Errorf("failed to get credentials for azure key vault, error %+v", err)) } + + log.Debugf("using custom auth") } else { f, err := os.Open(config.cloudConfigHostPath) if err != nil { diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index 311579ff..9aed0685 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -58,7 +58,7 @@ func getInitContainers() []corev1.Container { return []corev1.Container{container} } -func getVolumes(useAuthService bool) []corev1.Volume { +func getVolumes() []corev1.Volume { volumes := []corev1.Volume{ { Name: "azure-keyvault-env", @@ -73,14 +73,11 @@ func getVolumes(useAuthService bool) []corev1.Volume { return volumes } -func mutateContainers(containers []corev1.Container, imagePullSecrets map[string]*types.DockerAuthConfig) (bool, bool, error) { +func mutateContainers(containers []corev1.Container, imagePullSecrets map[string]*types.DockerAuthConfig) (bool, error) { mutated := false - anyUseAuthService := config.useAuthService for i, container := range containers { - containerOverrideAuthService := false - containerUseAuthService := config.useAuthService - + useAuthService := config.useAuthService log.Infof("found container '%s' to mutate", container.Name) var envVars []corev1.EnvVar @@ -91,14 +88,14 @@ func mutateContainers(containers []corev1.Container, imagePullSecrets map[string envVars = append(envVars, env) } - if strings.ToUpper(env.Name) == "ENV_INJECTOR_USE_AUTH_SERVICE" { - containerOverrideAuthService = true - containerUseAuthService, err := strconv.ParseBool(env.Value) + if strings.ToUpper(env.Name) == "ENV_INJECTOR_DISABLE_AUTH_SERVICE" { + containerDisabledAuthService, err := strconv.ParseBool(env.Value) if err != nil { - return false, false, fmt.Errorf("failed to parse container env var override for auth service, error: %+v", err) + return false, fmt.Errorf("failed to parse container env var override for auth service, error: %+v", err) } - if containerUseAuthService { - anyUseAuthService = true + if containerDisabledAuthService { + log.Infof("container %s has disabled auth service", container.Name) + useAuthService = false } } } @@ -128,7 +125,7 @@ func mutateContainers(containers []corev1.Container, imagePullSecrets map[string autoArgs, err := getContainerCmd(container, regCred) if err != nil { - return false, false, fmt.Errorf("failed to get auto cmd, error: %+v", err) + return false, fmt.Errorf("failed to get auto cmd, error: %+v", err) } autoArgsStr := strings.Join(autoArgs, " ") @@ -136,18 +133,18 @@ func mutateContainers(containers []corev1.Container, imagePullSecrets map[string privKey, pubKey, err := newKeyPair() if err != nil { - return false, false, fmt.Errorf("failed to create signing key pair, error: %+v", err) + return false, fmt.Errorf("failed to create signing key pair, error: %+v", err) } signature, err := signPKCS(autoArgsStr, *privKey) if err != nil { - return false, false, fmt.Errorf("failed to sign command args, error: %+v", err) + return false, fmt.Errorf("failed to sign command args, error: %+v", err) } log.Debug("signed arguments to prevent override") publicSigningKey, err := exportRsaPublicKey(pubKey) if err != nil { - return false, false, fmt.Errorf("failed to export public rsa key to pem, error: %+v", err) + return false, fmt.Errorf("failed to export public rsa key to pem, error: %+v", err) } log.Debugf("public signing key for argument verification: \n%s", publicSigningKey) @@ -188,18 +185,15 @@ func mutateContainers(containers []corev1.Container, imagePullSecrets map[string }, }...) - // Do not add env var for using auth service if already exists - if config.useAuthService && !containerOverrideAuthService { - log.Debug("configure init-container to use auth service") - container.Env = append(container.Env, []corev1.EnvVar{ - { - Name: "ENV_INJECTOR_USE_AUTH_SERVICE", - Value: "true", - }, - }...) - } + log.Debugf("setting ENV_INJECTOR_USE_AUTH_SERVICE=%t for container %s", useAuthService, container.Name) + container.Env = append(container.Env, []corev1.EnvVar{ + { + Name: "ENV_INJECTOR_USE_AUTH_SERVICE", + Value: strconv.FormatBool(useAuthService), + }, + }...) - if containerUseAuthService { + if useAuthService { container.Env = append(container.Env, []corev1.EnvVar{ { Name: "ENV_INJECTOR_AUTH_SERVICE", @@ -222,7 +216,7 @@ func mutateContainers(containers []corev1.Container, imagePullSecrets map[string containers[i] = container } - return mutated, anyUseAuthService, nil + return mutated, nil } func mutatePodSpec(pod *corev1.Pod) error { @@ -243,22 +237,19 @@ func mutatePodSpec(pod *corev1.Pod) error { return err } - var initContainersUseAuthService bool - var containersUseAuthService bool - - initContainersMutated, initContainersUseAuthService, err := mutateContainers(podSpec.InitContainers, regCred) + initContainersMutated, err := mutateContainers(podSpec.InitContainers, regCred) if err != nil { return err } - containersMutated, containersUseAuthService, err := mutateContainers(podSpec.Containers, regCred) + containersMutated, err := mutateContainers(podSpec.Containers, regCred) if err != nil { return err } if initContainersMutated || containersMutated { podSpec.InitContainers = append(getInitContainers(), podSpec.InitContainers...) - podSpec.Volumes = append(podSpec.Volumes, getVolumes(initContainersUseAuthService || containersUseAuthService)...) + podSpec.Volumes = append(podSpec.Volumes, getVolumes()...) log.Info("containers mutated and pod updated with init-container and volumes") podsMutatedCounter.Inc() } else { diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 43782966..956329f6 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -37,6 +37,7 @@ import ( ) func getContainerCmd(container corev1.Container, creds *types.DockerAuthConfig) ([]string, error) { + log.Debugf("getting container command for container '%s'", container.Name) cmd := container.Command // If container.Command is set it will override both image.Entrypoint AND image.Cmd @@ -46,6 +47,7 @@ func getContainerCmd(container corev1.Container, creds *types.DockerAuthConfig) if creds == nil { log.Warnf("no credentials provided/found to access remote docker image configuration for %s - going anonymous", container.Image) } + opts := imageOptions{ image: container.Image, credentials: *creds, @@ -209,6 +211,7 @@ func getAcrCredentials(host string, image string) *types.DockerAuthConfig { return &types.DockerAuthConfig{} } + log.Debugf("found acr credentials to use in cloud config for '%s'", host) return cred } diff --git a/cmd/ca-bundle-controller/main.go b/cmd/ca-bundle-controller/main.go index d3c61e65..fb7aab93 100644 --- a/cmd/ca-bundle-controller/main.go +++ b/cmd/ca-bundle-controller/main.go @@ -20,21 +20,24 @@ limitations under the License. package main import ( - "flag" "os" "strconv" "time" log "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/scheme" typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/record" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/controller/cabundleinjector" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals" + "github.com/spf13/viper" ) var ( @@ -52,38 +55,70 @@ var ( const controllerAgentName = "ca-bundle-controller" +func setLogLevel(logLevel string) { + if logLevel == "" { + logLevel = log.InfoLevel.String() + } + + logrusLevel, err := log.ParseLevel(logLevel) + if err != nil { + log.Fatalf("error setting log level: %s", err.Error()) + } + log.SetLevel(logrusLevel) +} + +func setLogFormat(logFormat string) { + switch logFormat { + case "fmt": + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) + case "json": + log.SetFormatter(&log.JSONFormatter{}) + default: + log.Warnf("Log format %s not supported - using default fmt", logFormat) + } +} + +func initConfig() { + viper.SetDefault("akv_label_name", "azure-key-vault-env-injection") + viper.SetDefault("ca_config_map_name", "akv2k8s-ca") + viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") + viper.AutomaticEnv() +} + func main() { - flag.Parse() + initConfig() + + logLevel := viper.GetString("log_level") + setLogLevel(logLevel) + + logFormat := viper.GetString("log_format") + setLogFormat(logFormat) + + akv2k8s.Version = viper.GetString("version") // set up signals so we handle the first shutdown signal gracefully stopCh := signals.SetupSignalHandler() - initLog() - akvLabelName, err := getEnvStr("AKV_LABEL_NAME", "azure-key-vault-env-injection") - if err != nil { - log.Fatalf("Error parsing env var AKV_LABEL_NAME: %s", err.Error()) - } + akvLabelName := viper.GetString("akv_label_name") + akvNamespace := viper.GetString("akv_namespace") - akvNamespace, err := getEnvStr("AKV_NAMESPACE", "") - if err != nil { - log.Fatalf("Error parsing env var AKV_NAMESPACE: %s", err.Error()) - } if akvNamespace == "" { log.Fatal("Env var AKV_NAMESPACE is required") } - akvSecretName, err := getEnvStr("AKV_SECRET_NAME", "") - if err != nil { - log.Fatalf("Error parsing env var AKV_SECRET_NAME: %s", err.Error()) - } + akvSecretName := viper.GetString("akv_secret_name") if akvSecretName == "" { log.Fatal("Env var AKV_SECRET_NAME is required") } - caConfigMapName, err := getEnvStr("CA_CONFIG_MAP_NAME", "akv2k8s-ca") - if err != nil { - log.Fatalf("Error parsing env var AZURE_VAULT_NORMAL_POLL_INTERVALS: %s", err.Error()) - } + kubeconfig = viper.GetString("kubeconfig") + masterURL = viper.GetString("master") + cloudconfig = viper.GetString("cloudconfig") + + caConfigMapName := viper.GetString("ca_config_map_name") cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) if err != nil { @@ -103,9 +138,9 @@ func main() { eventBroadcaster.StartLogging(log.Tracef) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) - // recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) - controller := cabundleinjector.NewController(kubeClient, kubeNsInformerFactory.Core().V1().Secrets(), kubeInformerFactory.Core().V1().Namespaces(), kubeInformerFactory.Core().V1().ConfigMaps(), akvLabelName, akvNamespace, akvSecretName, caConfigMapName) + controller := cabundleinjector.NewController(kubeClient, recorder, kubeNsInformerFactory.Core().V1().Secrets(), kubeInformerFactory.Core().V1().Namespaces(), kubeInformerFactory.Core().V1().ConfigMaps(), akvLabelName, akvNamespace, akvSecretName, caConfigMapName) // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) // Start method is non-blocking and runs all registered informers in a dedicated goroutine. @@ -117,45 +152,6 @@ func main() { } } -func init() { - flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") - flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") - flag.StringVar(&logLevel, "log-level", "", "log level") - flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") -} - -func initLog() { - if logLevel == "" { - var ok bool - if logLevel, ok = os.LookupEnv("LOG_LEVEL"); !ok { - logLevel = log.InfoLevel.String() - } - } - - logrusLevel, err := log.ParseLevel(logLevel) - if err != nil { - log.Fatalf("Error setting log level: %s", err.Error()) - } - log.SetLevel(logrusLevel) - log.Printf("Log level set to '%s'", logrusLevel.String()) - - logFormat := "fmt" - logFormat, _ = os.LookupEnv("LOG_FORMAT") - - switch logFormat { - case "fmt": - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) - case "json": - log.SetFormatter(&log.JSONFormatter{}) - default: - log.Warnf("Log format %s not supported - using default fmt", logFormat) - } - -} - func getEnvDuration(key string, fallback time.Duration) (time.Duration, error) { if value, ok := os.LookupEnv(key); ok { duration, err := time.ParseDuration(value) diff --git a/go.mod b/go.mod index 038a204b..caf8407b 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/SparebankenVest/azure-key-vault-to-kubernetes go 1.13 require ( + github.com/Azure/aad-pod-identity v1.6.3 github.com/Azure/azure-sdk-for-go v40.5.0+incompatible github.com/Azure/go-autorest/autorest v0.11.4 github.com/Azure/go-autorest/autorest/adal v0.9.0 @@ -11,20 +12,18 @@ require ( github.com/Azure/go-autorest/autorest/validation v0.2.0 // indirect github.com/containers/image/v5 v5.3.0 github.com/ghodss/yaml v1.0.0 + github.com/golangci/golangci-lint v1.31.0 // indirect github.com/gorilla/mux v1.7.4 - github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 github.com/prometheus/client_golang v1.1.0 - github.com/sirupsen/logrus v1.4.2 + github.com/sirupsen/logrus v1.6.0 github.com/slok/kubewebhook v0.4.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.4.0 + github.com/spf13/viper v1.7.1 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - gonum.org/v1/gonum v0.8.1 // indirect - gopkg.in/yaml.v2 v2.2.8 - k8s.io/api v0.15.11 - k8s.io/apimachinery v0.15.11 - k8s.io/client-go v0.15.11 - k8s.io/legacy-cloud-providers v0.15.11 + gopkg.in/yaml.v2 v2.3.0 + k8s.io/api v0.17.2 + k8s.io/apimachinery v0.17.2 + k8s.io/client-go v0.17.2 sigs.k8s.io/yaml v1.2.0 ) diff --git a/go.sum b/go.sum index fe5c201a..9cdcd663 100644 --- a/go.sum +++ b/go.sum @@ -1,24 +1,36 @@ 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.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.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= +contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= +contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= -github.com/Azure/azure-sdk-for-go v21.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/aad-pod-identity v1.6.3 h1:S9ucEc0Fjlj3nLJhEItjxhHySgYzU5i+mer9fo+Fu4M= +github.com/Azure/aad-pod-identity v1.6.3/go.mod h1:wFUg5YGthk9OLfwg0vImAf6i4vsw17xMgQ8j3MbyvrM= +github.com/Azure/azure-sdk-for-go v40.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible h1:CVQNKuUepSFBo6BW6gM1J9slPHLRcjn6vaw+j+causw= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v11.1.2+incompatible h1:viZ3tV5l4gE2Sw0xrasFHytCGtzYCrT+um/rrSQ1BfA= -github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.4 h1:iWJqGEvip7mjibEqC/srXNdo+4wLEPiwlP/7dZLtoPc= github.com/Azure/go-autorest/autorest v0.11.4/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= @@ -26,8 +38,10 @@ github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8H github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0 h1:SigMbuFNuKgc1xcGhaeapbh+8fgsu+GxgDRFyg7f5lM= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/azure/auth v0.1.0/go.mod h1:Gf7/i2FUpyb/sGBLIFxTBzrNzBo7aPXXE3ZVeDRwdpM= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.1.0/go.mod h1:Dk8CUAt/b/PzkfeRsWzVG9Yj3ps8mS8ECztu43rdU8U= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= @@ -51,6 +65,7 @@ github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1Gn github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= @@ -58,45 +73,51 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/k8s-cloud-provider v0.0.0-20181220005116-f8e995905100/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= -github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 h1:XTrzB+F8+SpRmbhAH8HLxhiiG6nYNwaBZjrFps1oWEk= +github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2 h1:JCHLVE3B+kJde7bIEo5N4J+ZbLhp0J1Fs+ulyRws4gE= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +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/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8 h1:UPvo0sEDBWGIb/nxKyC07j8r3ZH0Qtd0V3aDDM9VpjI= github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8/go.mod h1:4AJxUpXUhv4N+ziTvIcWWXgeorXpxPZOfk9HdEVr96M= +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/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +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/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/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/bombsimon/wsl/v3 v3.1.0 h1:E5SRssoBgtVFPcYWUOFJEcgaySgdtTNYzsSKDOY7ss8= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= @@ -119,32 +140,32 @@ github.com/containers/storage v1.16.5 h1:eHeWEhUEWX3VMIG1Vn1rEjfRoLHUQev3cwtA5zd github.com/containers/storage v1.16.5/go.mod h1:SdysZeLKJOvfHYysUWg9OZUC3gdZWi5b2b7NC18VpPE= 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/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.3.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 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/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/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/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/daixiang0/gci v0.2.4 h1:BUCKk5nlK2m+kRIsoj+wb/5hazHvHeZieBKWd9Afa8Q= +github.com/daixiang0/gci v0.2.4/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUsNa8F+hHc6w= +github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= 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 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65 h1:4zlOyrJUbYnrvlzChJ+jP2J3i77Jbhm336NEuCv7kZo= github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bPlG8QMY64VeXtVfjmjIlzaQok5Q= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969 h1:p2WzwcFof6KwsloLgCiAKkU5DJSVgOKGdevswAmskvY= @@ -154,28 +175,20 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -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/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= @@ -185,49 +198,60 @@ github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2H github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-critic/go-critic v0.5.2 h1:3RJdgf6u4NZUumoP8nzbqiiNT8e1tC2Oc7jlgqre/IA= +github.com/go-critic/go-critic v0.5.2/go.mod h1:cc0+HvdE3lFpqLecgqMaJcvWWH77sLdBp+wLGPM1Yyo= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1 h1:wSt/4CYxs70xbATrGXhokKF1i0tZjENLOo1ioIO13zk= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9 h1:tF+augKRWlWx0J0B7ZyyKSiTyV6E1zZe+7b3qQlcEf8= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501 h1:C1JKChikHGpXwT5UQDFaryIpDtyyGL/CR6C2kB7F1oc= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87 h1:zP3nY8Tk2E6RTkqGYrarZXuzh+ffyLDljLxCy1iJw80= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= 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 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/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= @@ -236,16 +260,44 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= 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 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.31.0 h1:+m9I3LEmxXLpymkXRPkDQGzOVBmBYm16UtDiXqZxWek= +github.com/golangci/golangci-lint v1.31.0/go.mod h1:aMQuNCA+NDU5+4jLL5pEuFHoue0IznKE2+/GsFvvs8A= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -255,52 +307,75 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= +github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285 h1:pBGAMRKP7Tpv4mOq+RgzKz+jAj+ylo9O8PiNoMmCuu8= github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/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/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3 h1:iwp+5/UAyzQSFgQ4uR2sni99sJ8Eo9DEacKWM5pekIg= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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-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.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +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-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 v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +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.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 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -309,88 +384,130 @@ github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 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/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I= +github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/pgzip v1.2.2 h1:8d4I0LDiieuGngsqlqOih9ker/NS0LX4V0i+EhiFWg0= github.com/klauspost/pgzip v1.2.2/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 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.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kyoh86/exportloopref v0.1.7 h1:u+iHuTbkbTS2D/JP7fCuZDo/t3rBVGo3Hf58Rc+lQVY= +github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a h1:TpvdAwDAt1K4ANVOfcihouRdvP+MgAfDWwBuct4l6ZY= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +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-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8= github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +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 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 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-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0 h1:eMV1t2NQRc3r1k3guWiv/zEeqZZP6kPvpUfy6byfL1g= +github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 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/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7FrlLismspbPc1teNRUVH7wLQ8= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 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.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -407,45 +524,52 @@ github.com/opencontainers/selinux v1.4.0 h1:cpiX/2wWIju/6My60T6/z9CxNG7c8xTQyEmA github.com/opencontainers/selinux v1.4.0/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= +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-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9 h1:kyf9snWXHvQc+yxE9imhdI8YAm4oKeZISlaAR+x73zs= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +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.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= 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 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/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.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/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.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= @@ -453,19 +577,49 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.2.0 h1:UOVMyH2EKkxIfzrULvA9n/tO+HtEhqD9mrLSWMr5FwU= +github.com/quasilyte/go-ruleguard v0.2.0/go.mod h1:2RT/tf0Ce0UDj5y243iWKosQogJd8+1G3Rs2fxmlYnw= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.4.0 h1:ivAoWcY5DMs9n04Abc1VkqZBO0FL0h4ShTcVsC53lCE= +github.com/securego/gosec/v2 v2.4.0/go.mod h1:0/Q4cjmlFDfDUj1+Fib61sc+U5IQb2w+Iv9/C3wPVko= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= 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.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/slok/kubewebhook v0.4.0 h1:USgcA77rvKMOf688LtY1RDTKwKbnLgXS4jRKzcjLF9Q= github.com/slok/kubewebhook v0.4.0/go.mod h1:LXfv4ixuCK4UVPvFFag1Sf/ZeidXugVB2fJpc5udPo8= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +github.com/sourcegraph/go-diff v0.6.0 h1:WbN9e/jD8ujU+o0vd9IFN5AEwtfB0rn/zM/AANaClqQ= +github.com/sourcegraph/go-diff v0.6.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -473,49 +627,69 @@ github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= 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.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA= +github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v0.4.8 h1:h61+hQraWhdI6WYqMwAwZYCE5yxL6a9/Orw4REbabSU= +github.com/tetafro/godot v0.4.8/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -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/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.15.1/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= +github.com/valyala/quicktemplate v1.6.2/go.mod h1:mtEJpQtUiBV0SHhMX6RtiJtqxncgrfmjcUy5T68X8TM= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE= -github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= -github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= @@ -523,75 +697,88 @@ github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf github.com/xeipuuv/gojsonschema v0.0.0-20190816131739-be0936907f66/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= 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= 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/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +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 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2 h1:y102fOLFqhV41b+4GPiJoa0k/x+pJcEi2/HB1Y5T6fU= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +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/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/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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-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 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/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 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc h1:gkKoSkUmnU6bpS/VhkuO27bzQeSA51uaEfbOW5dNb68= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -600,264 +787,216 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/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-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20190209173611-3b5209105503/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-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-20190403152447-81d4e9dc473e/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-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867 h1:JoRuNIf+rpHl+VhScRQQvzbHed86tKkqwPMV34T8myw= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-20180525024113-a5b4c53f6e8b/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-20181011042414-1f849cf54d09/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-20190110163146-51295c7ec13a/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-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/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-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +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-20190719005602-e377ae9d6386/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-20190910044552-dd2b5c81c578/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-20191012152004-8de300cfc20a/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-20191119224855-298f0cb1881e/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-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200321224714-0d839f3cf2ed/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200519015757-0d0afa43d58a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200701041122-1837592efa10/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0 h1:SQvH+DjrwqD1hyyQU+K7JegHz1KEZgEwt17p9d6R2eg= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485 h1:OB/uP/Puiu5vS5QMRPrXCDWUPb+kt8f1KW8oQzFejQw= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= -gonum.org/v1/gonum v0.8.1 h1:wGtP3yGpc5mCLOLeTeBdjeui9oZSz5De0eOjMLC/QuQ= -gonum.org/v1/gonum v0.8.1/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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.6.1-0.20190607001116-5213b8090861/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.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/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 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -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-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +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.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 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 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= 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 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.1/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 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/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.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +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.5 h1:nI5egYTGJakVyOryqLs1cQO5dO0ksin5XXs2pspk75k= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b h1:38Nx0U83WjBqn1hUWxlgKc7mvH7WhyHfypxeW3zWwCQ= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.15.11 h1:aw1gBdi7fq5LODyqKtJLE+2Gg5arV0UZp684GyB+6Ak= -k8s.io/api v0.15.11/go.mod h1:DI3kWWWBG0byhZ4druNYQvleDRhbocPrm+Glq4xVpkM= -k8s.io/api v0.17.9 h1:BA/U8qtSNzx7BbmQy3lODbCxVMKGNUpBJ2fjsKt6OOY= -k8s.io/api v0.17.9/go.mod h1:avJJAA1fSV6tnbCGW2K+S+ilDFW7WpNr5BScoiZ1M1U= -k8s.io/api v0.18.0 h1:lwYk8Vt7rsVTwjRU6pzEsa9YNhThbmbocQlKvNBB4EQ= -k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= -k8s.io/api v0.18.3 h1:2AJaUQdgUZLoDZHrun21PW2Nx9+ll6cUzvn3IKhSIn0= -k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= -k8s.io/api v0.18.8 h1:aIKUzJPb96f3fKec2lxtY7acZC9gQNDLVhfSGpxBAC4= -k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= -k8s.io/api v0.19.0 h1:XyrFIJqTYZJ2DU7FBE/bSPz7b1HvbVBuBf07oeo6eTc= -k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= +k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= +k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a h1:lDydUqHrbL/1l5ZQrqD1RIlabhmX8aiZEtxVUb+30iU= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.15.11 h1:CMtikEzqbN2dgCHcn1fAAJ4INE8DgIuzN8EC60nUHjM= -k8s.io/apimachinery v0.15.11/go.mod h1:ZRw+v83FjgEqlzqaBkxL3XB21MSLYdzjsY9Bgxclhdw= -k8s.io/apimachinery v0.17.9 h1:knQxNgMu57Oxlm12J6DS375kmGMeuWV0VNzRRUBB2Yk= -k8s.io/apimachinery v0.17.9/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= -k8s.io/apimachinery v0.18.0 h1:fuPfYpk3cs1Okp/515pAf0dNhL66+8zk8RLbSX+EgAE= -k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.18.3 h1:pOGcbVAhxADgUYnjS08EFXs9QMl8qaH5U4fr5LGUrSk= -k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.18.8 h1:jimPrycCqgx2QPearX3to1JePz7wSbVLq+7PdBTTwQ0= -k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= -k8s.io/apimachinery v0.19.0 h1:gjKnAda/HZp5k4xQYjL0K/Yb66IvNqjthCb03QlKpaQ= -k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apiserver v0.17.9/go.mod h1:Qaxd3EbeoPRBHVMtFyuKNAObqP6VAkzIMyWYz8KuE2k= -k8s.io/apiserver v0.18.0 h1:ELAWpGWC6XdbRLi5lwAbEbvksD7hkXxPdxaJsdpist4= -k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= -k8s.io/apiserver v0.18.8/go.mod h1:12u5FuGql8Cc497ORNj79rhPdiXQC4bf53X/skR/1YM= +k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4= +k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/client-go v0.0.0-20170217214107-bcde30fb7eae/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/client-go v0.0.0-20190817222206-ee6c071a42cf/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7 h1:WyPHgjjXvF4zVVwKGZKKiJGBUW45AuN44uSOuH8euuE= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/client-go v0.15.11 h1:yujXordVnH33fhe1bddPnFWsGfl0Gq6FyZ335TC3qk4= -k8s.io/client-go v0.15.11/go.mod h1:gkprEfouvgHvzeCvwwz2T8MTlfNuZn8vluW8orojRKI= -k8s.io/client-go v0.17.9 h1:qUPhohX4bUBx0L7pfye02aPnu3PQ0t+B8dqHfGvt++k= -k8s.io/client-go v0.17.9/go.mod h1:3cM92qAd1XknA5IRkRfpJhl9OQjkYy97ZEUio70wVnI= -k8s.io/client-go v0.18.0 h1:yqKw4cTUQraZK3fcVCMeSa+lqKwcjZ5wtcOIPnxQno4= -k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= -k8s.io/client-go v0.18.3 h1:QaJzz92tsN67oorwzmoB0a9r9ZVHuD5ryjbCKP0U22k= -k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= -k8s.io/client-go v0.18.8 h1:SdbLpIxk5j5YbFr1b7fq8S7mDgDjYmUxSbszyoesoDM= -k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= -k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= -k8s.io/cloud-provider v0.15.11/go.mod h1:ZmKzHyUA3/7CoogzbGwVHPEKvHKmcCyNv5t3XsR2Ju8= -k8s.io/cloud-provider v0.17.9/go.mod h1:yjQQgdWmd3sYNMzraq49mbABlegaptBBB9OEnRXHRbY= -k8s.io/cloud-provider v0.18.8/go.mod h1:cn9AlzMPVIXA4HHLVbgGUigaQlZyHSZ7WAwDEFNrQSs= -k8s.io/code-generator v0.17.9 h1:gJ/y22bRtF0pTzdAaEgfnrzUDJi19SdD8wock9TP4Ik= -k8s.io/code-generator v0.17.9/go.mod h1:iiHz51+oTx+Z9D0vB3CH3O4HDDPWrvZyUgUYaIE9h9M= -k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.18.8 h1:lgO1P1wjikEtzNvj7ia+x1VC4svJ28a/r0wnOLhhOTU= -k8s.io/code-generator v0.18.8/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/component-base v0.17.9/go.mod h1:Wg22ePDK0mfTa+bEFgZHGwr0h40lXnYy6D7D+f7itFk= -k8s.io/component-base v0.18.0 h1:I+lP0fNfsEdTDpHaL61bCAqTZLoiWjEEP304Mo5ZQgE= -k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= -k8s.io/component-base v0.18.8/go.mod h1:00frPRDas29rx58pPCxNkhUfPbwajlyyvu8ruNgSErU= -k8s.io/csi-translation-lib v0.15.11/go.mod h1:3GXSymXac3TVZgJlWXDdStD1xbiIi8m9rGrW7TNV0a8= -k8s.io/csi-translation-lib v0.17.9/go.mod h1:wDkbibpo06FClp/OWvaMFpUWf/ogmUYBLSzGqnaTZ3w= -k8s.io/csi-translation-lib v0.18.8/go.mod h1:6cA6Btlzxy9s3QrS4BCZzQqclIWnTLr6Jx3H2ctAzY4= +k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc= +k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190822140433-26a664648505 h1:ZY6yclUKVbZ+SdWnkfY+Je5vrMpKOxmGeKRbsXVmqYM= -k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 h1:RPscN6KhmG54S33L+lr3GS+oD1jmchIU0ll519K6FA4= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30 h1:TRb4wNWoBVrH9plmkp2q86FIDppkbrEXdXlxU3a3BMI= -k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe h1:GOfbcWvX5wW2vcfNch83xYp9SDZjRgAJk+t373yaHKk= -k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= -k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.13.11 h1:PuVgT0kD6Aah8XnJpcG4ngzJ/pjbJNam15MflwUn5Lc= -k8s.io/kubernetes v1.13.11/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/legacy-cloud-providers v0.15.11 h1:k9NXQK1LCGq7O1Gqu0Yzj+MkYN/SK1qg/L4VkDEsbFg= -k8s.io/legacy-cloud-providers v0.15.11/go.mod h1:UVtftPy4w6uuEPl1jvT5G4zASTgv/UKu4LQgxT913EI= -k8s.io/legacy-cloud-providers v0.17.9 h1:UjJfTJYmT7z+WzJ6EHwbZFfwNuqKxMvcZ+R7pq95AQM= -k8s.io/legacy-cloud-providers v0.17.9/go.mod h1:6FdEAYK7AlGetm4ulIQ8uZMqkcu02Mv8Z0Z3theL9Rc= -k8s.io/legacy-cloud-providers v0.18.8 h1:IGASZSYJjkMk5d1HU9+zskZqoRG3zccVzvA3hV7hCL0= -k8s.io/legacy-cloud-providers v0.18.8/go.mod h1:tgp4xYf6lvjrWnjQwTOPvWQE9IVqSBGPF4on0IyICQE= -k8s.io/sample-controller v0.18.3 h1:SQZ5w15wmZ2gSGxHnMj9n4OQyHjzTkSMtRfOAxvBMLU= -k8s.io/sample-controller v0.18.3/go.mod h1:jH/zaO86WF7aGg0KzqxcAJ133tmBU9X5s2C6W3yU+4Y= -k8s.io/utils v0.0.0-20190221042446-c2654d5206da h1:ElyM7RPonbKnQqOcw7dG2IK5uvQQn3b/WPHqD5mBvP4= -k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f h1:gi7cb8HTDZ6q8VqsUpkdoFi3vxwHMneQ6+Q5Ap5hjPE= +mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 4cceca37..74793e4d 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -27,7 +27,7 @@ CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ${GOPATH}/src/k8s.io/co # instead of the $GOPATH directly. For normal projects this can be dropped. ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis \ - azurekeyvault:v1alpha1,v1 \ + azurekeyvault:v1alpha1,v1,v2alpha1 \ --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt # Generate both v1alpha1 and v1 diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index acb2251a..9fd3435f 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -42,6 +42,7 @@ import ( "k8s.io/client-go/kubernetes" corelisters "k8s.io/client-go/listers/core/v1" "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/record" "k8s.io/client-go/util/workqueue" ) @@ -55,6 +56,9 @@ const ( // to sync due to a Secret of the same name already existing. ErrResourceExists = "ErrResourceExists" + // ErrConfigMap is used as part of the Event 'reason' when a Secret sync fails + ErrConfigMap = "ErrConfigMap" + // MessageResourceExists is the message used for Events when a resource // fails to sync due to a Deployment already existing MessageResourceExists = "Resource '%s' already exists and is not managed by CA Bundle Injector" @@ -80,6 +84,9 @@ type Controller struct { // time, and makes it easy to ensure we are never processing the same item // simultaneously in two different workers. kubeclientset kubernetes.Interface + // recorder is an event recorder for recording Event resources to the + // Kubernetes API. + recorder record.EventRecorder secretWorkqueue workqueue.RateLimitingInterface newNamespaceWorkqueue workqueue.RateLimitingInterface @@ -99,7 +106,7 @@ type Controller struct { } // NewController returns a new AzureKeyVaultSecret controller -func NewController(kubeclientset kubernetes.Interface, secretInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer, labelName string, caBundleSecretNamespaceName string, caBundleSecretName string, caBundleConfigMapName string) *Controller { +func NewController(kubeclientset kubernetes.Interface, recorder record.EventRecorder, secretInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer, labelName string, caBundleSecretNamespaceName string, caBundleSecretName string, caBundleConfigMapName string) *Controller { // // Create event broadcaster // // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // // logged for azure-keyvault-controller types. @@ -107,6 +114,7 @@ func NewController(kubeclientset kubernetes.Interface, secretInformer coreinform controller := &Controller{ kubeclientset: kubeclientset, + recorder: recorder, secretsSynced: secretInformer.Informer().HasSynced, namespacesSynced: namespaceInformer.Informer().HasSynced, secretWorkqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CABundles"), @@ -161,7 +169,11 @@ func NewController(kubeclientset kubernetes.Interface, secretInformer coreinform controller.enqueueSecret(new) }, DeleteFunc: func(obj interface{}) { // When CA Bundle gets deleted in akv2k8s - secret := obj.(*corev1.Secret) + secret, ok := obj.(*corev1.Secret) + if !ok { + log.Warningf("received deletion alert of secret, but was not a proper secret") + return + } if secret.Name != caBundleSecretName { return @@ -393,7 +405,9 @@ func (c *Controller) syncHandlerSecret(key string) error { newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { - log.Errorf("failed to create configmap '%s' in namespace '%s', error: %+v", newConfigMap.Name, ns.Name, err) + msg := fmt.Sprintf("failed to create configmap %s in namespace %s", newConfigMap.Name, ns.Name) + c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) + log.Errorf("%s, error: %+v", msg, err) return err } return nil @@ -410,16 +424,23 @@ func (c *Controller) syncHandlerSecret(key string) error { // a warning to the event recorder and return error msg. if !metav1.IsControlledBy(configMap, secret) { msg := fmt.Sprintf(MessageResourceExists, configMap.Name) - // c.recorder.Event(foo, corev1.EventTypeWarning, ErrResourceExists, msg) + c.recorder.Event(secret, corev1.EventTypeWarning, ErrResourceExists, msg) return fmt.Errorf(msg) } // If CA cert in ConfigMap resource is not the same as in Secret resource, we // should update the ConfigMap resource. if configMap.Data["caCert"] != secret.StringData["caCert"] { - // klog.V(4).Infof("Foo %s replicas: %d, deployment replicas: %d", name, *foo.Spec.Replicas, *deployment.Spec.Replicas) + log.Infof("secret %s updated: updating config map: %s", secret.Name, configMap.Name) newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) + + if err != nil { + msg := fmt.Sprintf("failed to update configmap %s in namespace %s", newConfigMap.Name, ns.Name) + c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) + log.Errorf("%s, error: %+v", msg, err) + return err + } } // If an error occurs during Update, we'll requeue the item so we can @@ -428,16 +449,9 @@ func (c *Controller) syncHandlerSecret(key string) error { if err != nil { return err } - - // Finally, we update the status block of the Foo resource to reflect the - // current state of the world - // err = c.updateSecretStatus(secret, configMap) - // if err != nil { - // return err - // } } - // c.recorder.Event(foo, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) + c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) return nil } @@ -485,6 +499,7 @@ func (c *Controller) syncHandlerNewNamespace(key string) error { } } + c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) return nil } diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller_test.go b/pkg/akv2k8s/controller/cabundleinjector/controller_test.go index 476b984b..754a1ce0 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller_test.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller_test.go @@ -14,6 +14,7 @@ import ( k8sfake "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/record" ) var ( @@ -55,7 +56,7 @@ func (f *fixture) newController() (*Controller, []kubeinformers.SharedInformerFa k8sInformerConfigMaps := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) // NewController(secretCABundleInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer) - c := NewController(f.kubeclient, k8sInformerSecrets.Core().V1().Secrets(), k8sInformerNamespaces.Core().V1().Namespaces(), k8sInformerConfigMaps.Core().V1().ConfigMaps(), "azure-key-vault-env-injection", "akv2k8s", "azure-key-vault-env-injector", "akv2k8s-ca") + c := NewController(f.kubeclient, record.NewFakeRecorder(100), k8sInformerSecrets.Core().V1().Secrets(), k8sInformerNamespaces.Core().V1().Namespaces(), k8sInformerConfigMaps.Core().V1().ConfigMaps(), "azure-key-vault-env-injection", "akv2k8s", "azure-key-vault-env-injector", "akv2k8s-ca") // c.foosSynced = alwaysReady // c.deploymentsSynced = alwaysReady @@ -248,6 +249,10 @@ func filterInformerActions(actions []core.Action) []core.Action { return ret } +func (f *fixture) expectCreateNamespaceAction(namespace *corev1.Namespace) { + f.kubeactions = append(f.kubeactions, core.NewCreateAction(schema.GroupVersionResource{Resource: "namespaces"}, namespace.Name, namespace)) +} + func (f *fixture) expectCreateConfigMapAction(cm *corev1.ConfigMap) { f.kubeactions = append(f.kubeactions, core.NewCreateAction(schema.GroupVersionResource{Resource: "configmaps"}, cm.Namespace, cm)) } @@ -263,11 +268,13 @@ func TestCreatesConfigMap(t *testing.T) { "caCert": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRSmFUeUxENnVPM0lYOERKZlZhZ1NtekFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwemRtTXRZMkYwTFdOaE1CNFhEVEl3TURNeE9URTBOREV5T1ZvWERUTXdNRE14TnpFMApOREV5T1Zvd0ZURVRNQkVHQTFVRUF4TUtjM1pqTFdOaGRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVFFdFRZUG5FSnFoMXc4NFI5MWV0Nng1MFB3NEVZNFpjOUhHRW5KRW1UdEVSOVUKTG44MGg3MUwwdnJUOXpUcTVhZFlsOWRhaDB5T2JJUU1aMU5VYmdPanQvczJnUHNRaFU5QVZPbmNqWG1OK0x2eQo5Q0I4NEFiY1A0U0NLV1pSQWd1NVhQdGlsUlNYbG9NTGxLUU52TWZ2QkpDWlhvcS9pVWZXcmxQOWp1dHQ2V0luCjdKUWxXUmRhdENYby9sWDZ0cFgydy8vMU1XZTN1R1lKcWNyUFlVN2c5N1NjdWJEZCtBanE4RSs2S0FqU3AzVnQKUTU5enpKenRFczNJaVBUU0szbXlrSVNXUWdlSEVUZ3F0cFJiaVdHOW0xdDBDc3FVRVBmMjhIayt4VHVVOWFBeQpZclVhbFkrSmxxc2hybUVLdUsxL2NMMU8zZU95aHRXT2R2SndYNThDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUF0eHp1alVIa3c1VmJyczFNcWl6Vkd2dk9sdVZSQgpzb1NPb3BuakZVdHkyYjV6OUltcHdDeEMwWmppNFVVdVdrMTJHZGxldlE0dTdvbmV5VytZR25qeDNRY1FGQ2plCmpTeU1uM2xsWnpFcVFyLzNpWDVBRUp4NFZDZ3lmNmtiVmdmbnp2aXVrWm83NjUwTCt0V0xiK2JNWllDZ0h1a3YKVi9SNlBxSGdzZDZiSlV4U1lMWElFamtCK0x5cXlSM2RvZDRDNUhpK2dRd0dsK0EyWVd4R0p0SDZVOExYVldYLwpKSDIvUXVIU09uUm9QeVV4MVduUDV6M1NHYWZyR1ZrbVJwTW56UWk3YjFFeTJMQVlENGhCRlJXZSt0bWR3NjRRCmJMbUYwRU85cVVKQjg2bE1LN2pvVUk2TFc5ajF6SWVUREZRN0ZZOUY2VEJiNmZoNVFNak1YdVhYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", } + akvNamespace := createNewNamespace("akv2k8s", false) + namespace := createNewNamespace("akv2k8s-test", true) fakeSecret := createNewSecret("azure-key-vault-env-injector", "akv2k8s", secretValue) - namespace := createNewNamespace("akv2k8s-test", true) - f.secretLister = append(f.secretLister, fakeSecret) + f.namespaceLister = append(f.namespaceLister, akvNamespace) f.namespaceLister = append(f.namespaceLister, namespace) + f.secretLister = append(f.secretLister, fakeSecret) cm := newConfigMap("akv2k8s-ca", namespace.Name, fakeSecret) f.expectCreateConfigMapAction(cm) @@ -292,12 +299,13 @@ func TestCreatesConfigMapInNewNamespace(t *testing.T) { f.configMapLister = append(f.configMapLister, existingConfigMap) newNamespace := createNewNamespace("akv2k8s-test2", true) - f.namespaceLister = append(f.namespaceLister, newNamespace) + f.kubeobjects = append(f.kubeobjects, newNamespace) cm := newConfigMap("akv2k8s-ca", newNamespace.Name, fakeSecret) + // f.expectCreateNamespaceAction(newNamespace) f.expectCreateConfigMapAction(cm) - f.run(getKey(fakeSecret, t), "") + f.run(getKey(fakeSecret, t), getKey(namespace, t)) } func TestRemovesConfigMapInNamespaceWithoutLabel(t *testing.T) { @@ -320,5 +328,5 @@ func TestRemovesConfigMapInNamespaceWithoutLabel(t *testing.T) { f.expectRemoveConfigMapAction(existingConfigMap) - f.run("", getKey(namespace, t)) + f.run(getKey(fakeSecret, t), getKey(namespace, t)) } diff --git a/pkg/akv2k8s/transformers/handler_test.go b/pkg/akv2k8s/transformers/handler_test.go index 07290cd8..da8749bc 100644 --- a/pkg/akv2k8s/transformers/handler_test.go +++ b/pkg/akv2k8s/transformers/handler_test.go @@ -19,7 +19,7 @@ package transformers import ( "testing" - akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" ) const ( diff --git a/pkg/akv2k8s/transformers/transformator.go b/pkg/akv2k8s/transformers/transformator.go index d86231f6..b2ac9716 100644 --- a/pkg/akv2k8s/transformers/transformator.go +++ b/pkg/akv2k8s/transformers/transformator.go @@ -19,7 +19,7 @@ package transformers import ( "fmt" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" ) // CreateTransformator creates a new Transformator ready to run transformation handlers diff --git a/pkg/akv2k8s/version.go b/pkg/akv2k8s/version.go new file mode 100644 index 00000000..e4324223 --- /dev/null +++ b/pkg/akv2k8s/version.go @@ -0,0 +1,37 @@ +package akv2k8s + +import ( + "fmt" + + log "github.com/sirupsen/logrus" +) + +// Version is the version of the component +var Version string + +// BuildDate is the date when the binary was built +var BuildDate string + +// GitCommit is the commit hash when the binary was built +var GitCommit string + +// Component is the versioned component +var Component string + +// GetUserAgent is used to get the user agent string which is then provided to adal +// to use as the extended user agent header. +// The format is: akv2k8s//// +func GetUserAgent() string { + return fmt.Sprintf("akv2k8s/%s/%s/%s/%s", Component, Version, GitCommit, BuildDate) +} + +// LogVersion prints the version and exits +// The format is: - commit: - date: +func LogVersion() { + contextLogger := log.WithFields(log.Fields{ + "commit": GitCommit, + "buildDate": BuildDate, + "component": Component, + }) + contextLogger.Infof("version %s", Version) +} diff --git a/pkg/akv2k8s/version_test.go b/pkg/akv2k8s/version_test.go new file mode 100644 index 00000000..a7c07b5d --- /dev/null +++ b/pkg/akv2k8s/version_test.go @@ -0,0 +1,21 @@ +package akv2k8s + +import ( + "fmt" + "strings" + "testing" + "time" +) + +func TestVersion(t *testing.T) { + BuildDate = time.Now().UTC().Format(time.RFC3339) + GitCommit = "20462a2" + Version = "1.1.7" + Component = "env-injector" + expectedUserAgentStr := fmt.Sprintf("akv2k8s/%s/%s/%s/%s", Component, Version, GitCommit, BuildDate) + gotUserAgentStr := GetUserAgent() + t.Log(gotUserAgentStr) + if !strings.EqualFold(expectedUserAgentStr, gotUserAgentStr) { + t.Fatalf("got unexpected user agent string: %s. Expected: %s.", gotUserAgentStr, expectedUserAgentStr) + } +} diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index 73826e55..030b89e4 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -1,4 +1,4 @@ -// Copyright © 2019 Sparebanken Vest +// Copyright © 2020 Sparebanken Vest // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -24,7 +24,6 @@ import ( "github.com/Azure/go-autorest/autorest/azure" docker "github.com/containers/image/v5/types" log "github.com/sirupsen/logrus" - "k8s.io/legacy-cloud-providers/azure/auth" ) var ( @@ -47,10 +46,10 @@ func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*docker. log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) } else { token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ServiceManagementEndpoint) - if err != nil { return nil, err } + if managedCred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, token, loginServer); err == nil { log.Debugf("found acr gredentials for %s", loginServer) return managedCred, nil @@ -71,7 +70,7 @@ func (c CloudConfigCredentialProvider) IsAcrRegistry(image string) bool { return parseACRLoginServerFromImage(image, c.environment) != "" } -func getACRDockerEntryFromARMToken(config *auth.AzureAuthConfig, env azure.Environment, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { +func getACRDockerEntryFromARMToken(config *AzureCloudConfig, env azure.Environment, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { // Run EnsureFresh to make sure the token is valid and does not expire // if err := token.EnsureFresh(); err != nil { // return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) diff --git a/pkg/azure/credentialprovider/akv.go b/pkg/azure/credentialprovider/akv.go index c075c923..c833ba11 100644 --- a/pkg/azure/credentialprovider/akv.go +++ b/pkg/azure/credentialprovider/akv.go @@ -1,4 +1,4 @@ -// Copyright © 2019 Sparebanken Vest +// Copyright © 2020 Sparebanken Vest // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,8 +14,6 @@ // // Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go) -// Todo: Needs refactoring - package credentialprovider import ( @@ -27,9 +25,15 @@ import ( "github.com/Azure/go-autorest/autorest/adal" ) +const ( + vmTypeVMSS = "vmss" + vmTypeStandard = "standard" +) + // AzureKeyVaultCredentials has credentials needed to authenticate with azure key vault. // These credentials will never expire type AzureKeyVaultCredentials struct { + ClientID string Token *adal.ServicePrincipalToken EndpointPartial string } @@ -58,6 +62,48 @@ func (c AzureKeyVaultCredentials) MarshalJSON() ([]byte, error) { }) } +// GetAzureKeyVaultCredentials will get Azure credentials +func (c UserAssignedManagedIdentityProvider) GetAzureKeyVaultCredentials(azureIdentity string, hostname string) (*AzureKeyVaultCredentials, error) { + err := c.aadClient.Init() + if err != nil { + return nil, err + } + + resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) + endpoint := resourceSplit[0] + "%s." + resourceSplit[1] + msiExists := false + + msis, err := c.aadClient.GetUserMSIs(hostname, c.config.VMType == vmTypeVMSS) + if err != nil { + return nil, err + } + + for _, msi := range msis { + if msi == azureIdentity { + msiExists = true + break + } + } + + if !msiExists { + ids := []string{azureIdentity} + err := c.aadClient.UpdateUserMSI(ids, []string{}, hostname, c.config.VMType == vmTypeVMSS) + if err != nil { + return nil, err + } + } + + token, err := getServicePrincipalTokenFromMSI(azureIdentity, c.environment.ResourceIdentifiers.KeyVault) + if err != nil { + return nil, err + } + + return &AzureKeyVaultCredentials{ + Token: token, + EndpointPartial: endpoint, + }, nil +} + // GetAzureKeyVaultCredentials will get Azure credentials func (c CloudConfigCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyVaultCredentials, error) { resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) @@ -93,6 +139,7 @@ func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyV return nil, err } + akvCreds.ClientID = creds.ClientID akvCreds.Token = token return akvCreds, nil } @@ -106,6 +153,7 @@ func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyV if err != nil { return nil, err } + akvCreds.ClientID = creds.ClientID akvCreds.Token = token return akvCreds, nil } @@ -119,6 +167,7 @@ func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyV if err != nil { return nil, err } + akvCreds.ClientID = creds.ClientID akvCreds.Token = token return akvCreds, nil } @@ -135,6 +184,7 @@ func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyV if err != nil { return nil, err } + akvCreds.ClientID = msi.ClientID akvCreds.Token = token return akvCreds, nil } @@ -144,6 +194,7 @@ func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyV if err != nil { return nil, err } + akvCreds.ClientID = "msi" akvCreds.Token = token return akvCreds, nil } diff --git a/pkg/azure/credentialprovider/credential_test.go b/pkg/azure/credentialprovider/credential_test.go index 4a29ffea..1419d919 100644 --- a/pkg/azure/credentialprovider/credential_test.go +++ b/pkg/azure/credentialprovider/credential_test.go @@ -59,6 +59,12 @@ import ( // } // } +func TestIntegrationAuthFromUserAssignedManagedIdentity(t *testing.T) { + akv2k8sTesting.EnsureIntegrationEnvironment(t) + + // provider, err := NewUserAssignedManagedIdentityProvider() +} + func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { akv2k8sTesting.EnsureIntegrationEnvironment(t) diff --git a/pkg/azure/credentialprovider/provider.go b/pkg/azure/credentialprovider/provider.go index 17856dfb..d0ee083a 100644 --- a/pkg/azure/credentialprovider/provider.go +++ b/pkg/azure/credentialprovider/provider.go @@ -27,6 +27,7 @@ import ( "io" "io/ioutil" "strings" + "time" "golang.org/x/crypto/pkcs12" @@ -35,9 +36,9 @@ import ( "github.com/Azure/go-autorest/autorest/azure" "github.com/spf13/pflag" + aadProvider "github.com/Azure/aad-pod-identity/pkg/cloudprovider" azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" log "github.com/sirupsen/logrus" - "k8s.io/legacy-cloud-providers/azure/auth" "sigs.k8s.io/yaml" ) @@ -48,10 +49,18 @@ const ( maxReadLength = 10 * 1 << 20 // 10MB ) +// CloudConfigCredentialProvider provides credentials for Azure using the cloud config file +type UserAssignedManagedIdentityProvider struct { + config *AzureCloudConfig + environment *azure.Environment + aadClient *aadProvider.Client +} + // CloudConfigCredentialProvider provides credentials for Azure using the cloud config file type CloudConfigCredentialProvider struct { - config *auth.AzureAuthConfig + config *AzureCloudConfig environment *azure.Environment + aadClient *aadProvider.Client } // EnvironmentCredentialProvider provides credentials for Azure using environment vars @@ -70,14 +79,25 @@ type credentials struct { EndpointPartial string } -// NewFromCloudConfig parses the specified configFile and returns a DockerConfigProvider +func NewUserAssignedManagedIdentityProvider(azureConfigFile string) (*UserAssignedManagedIdentityProvider, error) { + aadClient, err := aadProvider.NewCloudProvider(azureConfigFile, 2, time.Second*30) + if err != nil { + return nil, fmt.Errorf("failed creating aad cloud provider, error: %+v", err) + } + + return &UserAssignedManagedIdentityProvider{ + aadClient: aadClient, + }, nil +} + +// NewFromCloudConfig parses the specified configFile and returns a CloudConfigCredentialProvider func NewFromCloudConfig(configReader io.Reader) (*CloudConfigCredentialProvider, error) { config, err := ParseConfig(configReader) if err != nil { return nil, fmt.Errorf("failed reading cloud config, error: %+v", err) } - env, err := auth.ParseAzureEnvironment(config.Cloud) + env, err := parseAzureEnvironment(config.Cloud) if err != nil { return nil, fmt.Errorf("failed to parse environment from cloud config, error: %+v", err) } @@ -130,29 +150,39 @@ func (c credentials) MarshalJSON() ([]byte, error) { }) } -func getServicePrincipalTokenFromCloudConfig(config *auth.AzureAuthConfig, env *azure.Environment, resource string) (*adal.ServicePrincipalToken, error) { - if config.UseManagedIdentityExtension { - log.Debug("azure: using managed identity extension to retrieve access token") - msiEndpoint, err := adal.GetMSIVMEndpoint() - if err != nil { - return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) - } +func getServicePrincipalTokenFromMSI(userAssignedIdentityID string, resource string) (*adal.ServicePrincipalToken, error) { + // err := adal.AddToUserAgent(akv2k8s.) + // if err != nil { + // return fmt.Errorf("failed to add MIC to user agent, error: %+v", err) + // } - if len(config.UserAssignedIdentityID) > 0 { - log.Debug("azure: using User Assigned MSI ID to retrieve access token") - token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, - resource, - config.UserAssignedIdentityID) + log.Debug("azure: using managed identity extension to retrieve access token") + msiEndpoint, err := adal.GetMSIVMEndpoint() + if err != nil { + return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) + } - return token, err + if len(userAssignedIdentityID) > 0 { + log.Debug("azure: using User Assigned MSI ID to retrieve access token") + token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, resource, userAssignedIdentityID) + if err != nil { + return nil, fmt.Errorf("failed getting user assigned msi token from endpoint '%s': %+v", msiEndpoint, err) } - log.Debug("azure: using System Assigned MSI to retrieve access token") - token, err := adal.NewServicePrincipalTokenFromMSI( - msiEndpoint, - resource) - return token, err } + log.Debug("azure: using System Assigned MSI to retrieve access token") + token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, resource) + if err != nil { + return nil, fmt.Errorf("failed getting system assigned msi token from endpoint '%s': %+v", msiEndpoint, err) + } + + return token, err + +} +func getServicePrincipalTokenFromCloudConfig(config *AzureCloudConfig, env *azure.Environment, resource string) (*adal.ServicePrincipalToken, error) { + if config.UseManagedIdentityExtension { + return getServicePrincipalTokenFromMSI(config.UserAssignedIdentityID, resource) + } oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) if err != nil { @@ -205,9 +235,34 @@ func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) { return autorest.NewBearerAuthorizer(tokenProvider), nil } +// AzureCloudConfig holds azure configuration +type AzureCloudConfig struct { + // The cloud environment identifier. Takes values from https://github.com/Azure/go-autorest/blob/ec5f4903f77ed9927ac95b19ab8e44ada64c1356/autorest/azure/environments.go#L13 + Cloud string `json:"cloud,omitempty" yaml:"cloud,omitempty"` + // The AAD Tenant ID for the Subscription that the cluster is deployed in + TenantID string `json:"tenantId,omitempty" yaml:"tenantId,omitempty"` + // The ClientID for an AAD application with RBAC access to talk to Azure RM APIs + AADClientID string `json:"aadClientId,omitempty" yaml:"aadClientId,omitempty"` + // The ClientSecret for an AAD application with RBAC access to talk to Azure RM APIs + AADClientSecret string `json:"aadClientSecret,omitempty" yaml:"aadClientSecret,omitempty"` + // The path of a client certificate for an AAD application with RBAC access to talk to Azure RM APIs + AADClientCertPath string `json:"aadClientCertPath,omitempty" yaml:"aadClientCertPath,omitempty"` + // The password of the client certificate for an AAD application with RBAC access to talk to Azure RM APIs + AADClientCertPassword string `json:"aadClientCertPassword,omitempty" yaml:"aadClientCertPassword,omitempty"` + // Use managed service identity for the virtual machine to access Azure ARM APIs + UseManagedIdentityExtension bool `json:"useManagedIdentityExtension,omitempty" yaml:"useManagedIdentityExtension,omitempty"` + // UserAssignedIdentityID contains the Client ID of the user assigned MSI which is assigned to the underlying VMs. If empty the user assigned identity is not used. + // More details of the user assigned identity can be found at: https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/overview + // For the user assigned identity specified here to be used, the UseManagedIdentityExtension has to be set to true. + UserAssignedIdentityID string `json:"userAssignedIdentityID,omitempty" yaml:"userAssignedIdentityID,omitempty"` + // The location of the resource group that the cluster is deployed in + Location string `json:"location,omitempty" yaml:"location,omitempty"` + VMType string `json:"vmType,omitempty" yaml:"vmType,omitempty"` +} + // ParseConfig returns a parsed configuration for an Azure cloudprovider config file -func ParseConfig(configReader io.Reader) (*auth.AzureAuthConfig, error) { - var config auth.AzureAuthConfig +func ParseConfig(configReader io.Reader) (*AzureCloudConfig, error) { + var config AzureCloudConfig if configReader == nil { return &config, nil @@ -241,3 +296,14 @@ func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.Private return certificate, rsaPrivateKey, nil } + +func parseAzureEnvironment(cloudName string) (*azure.Environment, error) { + var env azure.Environment + var err error + if cloudName == "" { + env = azure.PublicCloud + } else { + env, err = azure.EnvironmentFromName(cloudName) + } + return &env, err +} diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index 7fb15148..e407ec61 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -24,7 +24,7 @@ import ( "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" ) const ( diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go index 78a4fd4f..e68e7e6e 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service_test.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go @@ -8,7 +8,7 @@ import ( akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing" auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go new file mode 100644 index 00000000..3987d998 --- /dev/null +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go @@ -0,0 +1,21 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:deepcopy-gen=package +// +groupName=azurekeyvault.spv.no + +// Package v1 is the v1 version of the API. +package v2alpha1 diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go new file mode 100644 index 00000000..44ccdb88 --- /dev/null +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go @@ -0,0 +1,54 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v2alpha1 + +import ( + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v2alpha1"} + +// Kind takes an unqualified kind and returns back a Group qualified GroupKind +func Kind(kind string) schema.GroupKind { + return SchemeGroupVersion.WithKind(kind).GroupKind() +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToScheme +) + +// Adds the list of known types to Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &AzureKeyVaultSecret{}, + &AzureKeyVaultSecretList{}, + &AzureKeyVaultSecretIdentity{}, + &AzureKeyVaultSecretIdentityList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go new file mode 100644 index 00000000..63ad0a1a --- /dev/null +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go @@ -0,0 +1,150 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v2alpha1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AzureKeyVaultSecret is a specification for a AzureKeyVaultSecret resource +type AzureKeyVaultSecret struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec AzureKeyVaultSecretSpec `json:"spec"` + Status AzureKeyVaultSecretStatus `json:"status"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AzureKeyVaultSecretList is a list of AzureKeyVaultSecret resources +type AzureKeyVaultSecretList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []AzureKeyVaultSecret `json:"items"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AzureKeyVaultSecretIdentity is an optional MSI identity to use when accessing Azure Key Vault +type AzureKeyVaultSecretIdentity struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec AzureKeyVaultSecretIdentitySpec `json:"spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AzureKeyVaultSecretIdentityList is a list of AzureKeyVaultSecretIdentity resources +type AzureKeyVaultSecretIdentityList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []AzureKeyVaultSecretIdentity `json:"items"` +} + +type AzureKeyVaultSecretIdentitySpec struct { + Name string `json:"name"` + Type AzureKeyVaultSecretIdentityType `json:"type"` +} + +type AzureKeyVaultSecretIdentityType string + +const ( + // AzureKeyVaultSecretIdentityTypeAzureIdentity - get Secret object type from Azure Key Vault + AzureKeyVaultSecretIdentityTypeAzureIdentity AzureKeyVaultSecretIdentityType = "azureIdentity" +) + +// AzureKeyVaultSecretSpec is the spec for a AzureKeyVaultSecret resource +type AzureKeyVaultSecretSpec struct { + Vault AzureKeyVault `json:"vault"` + Output AzureKeyVaultOutput `json:"output,omitempty"` +} + +// AzureKeyVault contains information needed to get the +// Azure Key Vault secret from Azure Key Vault +type AzureKeyVault struct { + Name string `json:"name"` + Object AzureKeyVaultObject `json:"object"` +} + +// AzureKeyVaultObject has information about the Azure Key Vault +// object to get from Azure Key Vault +type AzureKeyVaultObject struct { + Name string `json:"name"` + Type AzureKeyVaultObjectType `json:"type"` + Version string `json:"version"` + Poll bool `json:"bool"` + ContentType AzureKeyVaultObjectContentType `json:"contentType"` +} + +// AzureKeyVaultObjectType defines which Object type to get from Azure Key Vault +type AzureKeyVaultObjectType string + +// AzureKeyVaultObjectContentType defines what content type a secret contains +type AzureKeyVaultObjectContentType string + +const ( + // AzureKeyVaultObjectTypeSecret - get Secret object type from Azure Key Vault + AzureKeyVaultObjectTypeSecret AzureKeyVaultObjectType = "secret" + + // AzureKeyVaultObjectTypeMultiKeyValueSecret - get Secret object type from Azure Key Vault containing multiple key/values + AzureKeyVaultObjectTypeMultiKeyValueSecret = "multi-key-value-secret" + + // AzureKeyVaultObjectTypeCertificate - get Certificate object type from Azure Key Vault + AzureKeyVaultObjectTypeCertificate = "certificate" + + // AzureKeyVaultObjectTypeKey - get Key object type from Azure Key Vault + AzureKeyVaultObjectTypeKey = "key" + + // AzureKeyVaultObjectContentTypeJSON - object content is of type application/x-json + AzureKeyVaultObjectContentTypeJSON AzureKeyVaultObjectContentType = "application/x-json" + + // AzureKeyVaultObjectContentTypeYaml - object content is of type application/x-yaml + AzureKeyVaultObjectContentTypeYaml = "application/x-yaml" +) + +// AzureKeyVaultOutput defines output sources, currently only support Secret +type AzureKeyVaultOutput struct { + Secret AzureKeyVaultOutputSecret `json:"secret"` + // +optional + Transforms []string `json:"transforms,omitempty"` +} + +// AzureKeyVaultOutputSecret has information needed to output +// a secret from Azure Key Vault to Kubertnetes as a Secret resource +type AzureKeyVaultOutputSecret struct { + Name string `json:"name"` + // +optional + Type corev1.SecretType `json:"type,omitempty"` + DataKey string `json:"dataKey"` + ChainOrder string `json:"chainOrder"` +} + +// AzureKeyVaultSecretStatus is the status for a AzureKeyVaultSecret resource +type AzureKeyVaultSecretStatus struct { + SecretHash string `json:"secretHash"` + LastAzureUpdate metav1.Time `json:"lastAzureUpdate,omitempty"` + SecretName string `json:"secretName"` +} diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go new file mode 100644 index 00000000..35e587a9 --- /dev/null +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go @@ -0,0 +1,271 @@ +// +build !ignore_autogenerated + +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVault) DeepCopyInto(out *AzureKeyVault) { + *out = *in + out.Object = in.Object + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVault. +func (in *AzureKeyVault) DeepCopy() *AzureKeyVault { + if in == nil { + return nil + } + out := new(AzureKeyVault) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultObject) DeepCopyInto(out *AzureKeyVaultObject) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultObject. +func (in *AzureKeyVaultObject) DeepCopy() *AzureKeyVaultObject { + if in == nil { + return nil + } + out := new(AzureKeyVaultObject) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultOutput) DeepCopyInto(out *AzureKeyVaultOutput) { + *out = *in + out.Secret = in.Secret + if in.Transforms != nil { + in, out := &in.Transforms, &out.Transforms + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultOutput. +func (in *AzureKeyVaultOutput) DeepCopy() *AzureKeyVaultOutput { + if in == nil { + return nil + } + out := new(AzureKeyVaultOutput) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultOutputSecret) DeepCopyInto(out *AzureKeyVaultOutputSecret) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultOutputSecret. +func (in *AzureKeyVaultOutputSecret) DeepCopy() *AzureKeyVaultOutputSecret { + if in == nil { + return nil + } + out := new(AzureKeyVaultOutputSecret) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultSecret) DeepCopyInto(out *AzureKeyVaultSecret) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecret. +func (in *AzureKeyVaultSecret) DeepCopy() *AzureKeyVaultSecret { + if in == nil { + return nil + } + out := new(AzureKeyVaultSecret) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AzureKeyVaultSecret) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultSecretIdentity) DeepCopyInto(out *AzureKeyVaultSecretIdentity) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretIdentity. +func (in *AzureKeyVaultSecretIdentity) DeepCopy() *AzureKeyVaultSecretIdentity { + if in == nil { + return nil + } + out := new(AzureKeyVaultSecretIdentity) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AzureKeyVaultSecretIdentity) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultSecretIdentityList) DeepCopyInto(out *AzureKeyVaultSecretIdentityList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]AzureKeyVaultSecretIdentity, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretIdentityList. +func (in *AzureKeyVaultSecretIdentityList) DeepCopy() *AzureKeyVaultSecretIdentityList { + if in == nil { + return nil + } + out := new(AzureKeyVaultSecretIdentityList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AzureKeyVaultSecretIdentityList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultSecretIdentitySpec) DeepCopyInto(out *AzureKeyVaultSecretIdentitySpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretIdentitySpec. +func (in *AzureKeyVaultSecretIdentitySpec) DeepCopy() *AzureKeyVaultSecretIdentitySpec { + if in == nil { + return nil + } + out := new(AzureKeyVaultSecretIdentitySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultSecretList) DeepCopyInto(out *AzureKeyVaultSecretList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]AzureKeyVaultSecret, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretList. +func (in *AzureKeyVaultSecretList) DeepCopy() *AzureKeyVaultSecretList { + if in == nil { + return nil + } + out := new(AzureKeyVaultSecretList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AzureKeyVaultSecretList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultSecretSpec) DeepCopyInto(out *AzureKeyVaultSecretSpec) { + *out = *in + out.Vault = in.Vault + in.Output.DeepCopyInto(&out.Output) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretSpec. +func (in *AzureKeyVaultSecretSpec) DeepCopy() *AzureKeyVaultSecretSpec { + if in == nil { + return nil + } + out := new(AzureKeyVaultSecretSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultSecretStatus) DeepCopyInto(out *AzureKeyVaultSecretStatus) { + *out = *in + in.LastAzureUpdate.DeepCopyInto(&out.LastAzureUpdate) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretStatus. +func (in *AzureKeyVaultSecretStatus) DeepCopy() *AzureKeyVaultSecretStatus { + if in == nil { + return nil + } + out := new(AzureKeyVaultSecretStatus) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index fc4d062c..59a1df23 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -24,6 +24,7 @@ package versioned import ( azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" + azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -33,6 +34,7 @@ type Interface interface { Discovery() discovery.DiscoveryInterface AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface + AzurekeyvaultV2alpha1() azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Interface } // Clientset contains the clients for groups. Each group has exactly one @@ -41,6 +43,7 @@ type Clientset struct { *discovery.DiscoveryClient azurekeyvaultV1alpha1 *azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Client azurekeyvaultV1 *azurekeyvaultv1.AzurekeyvaultV1Client + azurekeyvaultV2alpha1 *azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Client } // AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client @@ -53,6 +56,11 @@ func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface { return c.azurekeyvaultV1 } +// AzurekeyvaultV2alpha1 retrieves the AzurekeyvaultV2alpha1Client +func (c *Clientset) AzurekeyvaultV2alpha1() azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Interface { + return c.azurekeyvaultV2alpha1 +} + // Discovery retrieves the DiscoveryClient func (c *Clientset) Discovery() discovery.DiscoveryInterface { if c == nil { @@ -77,6 +85,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.azurekeyvaultV2alpha1, err = azurekeyvaultv2alpha1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { @@ -91,6 +103,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.NewForConfigOrDie(c) cs.azurekeyvaultV1 = azurekeyvaultv1.NewForConfigOrDie(c) + cs.azurekeyvaultV2alpha1 = azurekeyvaultv2alpha1.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) return &cs @@ -101,6 +114,7 @@ func New(c rest.Interface) *Clientset { var cs Clientset cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.New(c) cs.azurekeyvaultV1 = azurekeyvaultv1.New(c) + cs.azurekeyvaultV2alpha1 = azurekeyvaultv2alpha1.New(c) cs.DiscoveryClient = discovery.NewDiscoveryClient(c) return &cs diff --git a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go index 481c4806..a9b4522f 100644 --- a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go +++ b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go @@ -27,6 +27,8 @@ import ( fakeazurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" fakeazurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake" + azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" + fakeazurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/discovery" @@ -90,3 +92,8 @@ func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface { return &fakeazurekeyvaultv1.FakeAzurekeyvaultV1{Fake: &c.Fake} } + +// AzurekeyvaultV2alpha1 retrieves the AzurekeyvaultV2alpha1Client +func (c *Clientset) AzurekeyvaultV2alpha1() azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Interface { + return &fakeazurekeyvaultv2alpha1.FakeAzurekeyvaultV2alpha1{Fake: &c.Fake} +} diff --git a/pkg/k8s/client/clientset/versioned/fake/register.go b/pkg/k8s/client/clientset/versioned/fake/register.go index c18f0c8f..a1df65d4 100644 --- a/pkg/k8s/client/clientset/versioned/fake/register.go +++ b/pkg/k8s/client/clientset/versioned/fake/register.go @@ -24,6 +24,7 @@ package fake import ( azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -37,6 +38,7 @@ var parameterCodec = runtime.NewParameterCodec(scheme) var localSchemeBuilder = runtime.SchemeBuilder{ azurekeyvaultv1alpha1.AddToScheme, azurekeyvaultv1.AddToScheme, + azurekeyvaultv2alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition diff --git a/pkg/k8s/client/clientset/versioned/scheme/register.go b/pkg/k8s/client/clientset/versioned/scheme/register.go index ff8a815e..50785996 100644 --- a/pkg/k8s/client/clientset/versioned/scheme/register.go +++ b/pkg/k8s/client/clientset/versioned/scheme/register.go @@ -24,6 +24,7 @@ package scheme import ( azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -37,6 +38,7 @@ var ParameterCodec = runtime.NewParameterCodec(Scheme) var localSchemeBuilder = runtime.SchemeBuilder{ azurekeyvaultv1alpha1.AddToScheme, azurekeyvaultv1.AddToScheme, + azurekeyvaultv2alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go new file mode 100644 index 00000000..1a6ee9db --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go @@ -0,0 +1,97 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + rest "k8s.io/client-go/rest" +) + +type AzurekeyvaultV2alpha1Interface interface { + RESTClient() rest.Interface + AzureKeyVaultSecretsGetter + AzureKeyVaultSecretIdentitiesGetter +} + +// AzurekeyvaultV2alpha1Client is used to interact with features provided by the azurekeyvault.spv.no group. +type AzurekeyvaultV2alpha1Client struct { + restClient rest.Interface +} + +func (c *AzurekeyvaultV2alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { + return newAzureKeyVaultSecrets(c, namespace) +} + +func (c *AzurekeyvaultV2alpha1Client) AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityInterface { + return newAzureKeyVaultSecretIdentities(c, namespace) +} + +// NewForConfig creates a new AzurekeyvaultV2alpha1Client for the given config. +func NewForConfig(c *rest.Config) (*AzurekeyvaultV2alpha1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &AzurekeyvaultV2alpha1Client{client}, nil +} + +// NewForConfigOrDie creates a new AzurekeyvaultV2alpha1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV2alpha1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new AzurekeyvaultV2alpha1Client for the given RESTClient. +func New(c rest.Interface) *AzurekeyvaultV2alpha1Client { + return &AzurekeyvaultV2alpha1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v2alpha1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *AzurekeyvaultV2alpha1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go new file mode 100644 index 00000000..1d3674c0 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go @@ -0,0 +1,194 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + "time" + + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// AzureKeyVaultSecretsGetter has a method to return a AzureKeyVaultSecretInterface. +// A group's client should implement this interface. +type AzureKeyVaultSecretsGetter interface { + AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface +} + +// AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources. +type AzureKeyVaultSecretInterface interface { + Create(*v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) + Update(*v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) + UpdateStatus(*v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v2alpha1.AzureKeyVaultSecret, error) + List(opts v1.ListOptions) (*v2alpha1.AzureKeyVaultSecretList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecret, err error) + AzureKeyVaultSecretExpansion +} + +// azureKeyVaultSecrets implements AzureKeyVaultSecretInterface +type azureKeyVaultSecrets struct { + client rest.Interface + ns string +} + +// newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets +func newAzureKeyVaultSecrets(c *AzurekeyvaultV2alpha1Client, namespace string) *azureKeyVaultSecrets { + return &azureKeyVaultSecrets{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. +func (c *azureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecret, err error) { + result = &v2alpha1.AzureKeyVaultSecret{} + err = c.client.Get(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. +func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v2alpha1.AzureKeyVaultSecretList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. +func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch() +} + +// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. +func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { + result = &v2alpha1.AzureKeyVaultSecret{} + err = c.client.Post(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + Body(azureKeyVaultSecret). + Do(). + Into(result) + return +} + +// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. +func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { + result = &v2alpha1.AzureKeyVaultSecret{} + err = c.client.Put(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + Name(azureKeyVaultSecret.Name). + Body(azureKeyVaultSecret). + Do(). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). + +func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { + result = &v2alpha1.AzureKeyVaultSecret{} + err = c.client.Put(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + Name(azureKeyVaultSecret.Name). + SubResource("status"). + Body(azureKeyVaultSecret). + Do(). + Into(result) + return +} + +// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. +func (c *azureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *azureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + var timeout time.Duration + if listOptions.TimeoutSeconds != nil { + timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Timeout(timeout). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched azureKeyVaultSecret. +func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecret, err error) { + result = &v2alpha1.AzureKeyVaultSecret{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("azurekeyvaultsecrets"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go new file mode 100644 index 00000000..d0258b3f --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go @@ -0,0 +1,177 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + "time" + + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// AzureKeyVaultSecretIdentitiesGetter has a method to return a AzureKeyVaultSecretIdentityInterface. +// A group's client should implement this interface. +type AzureKeyVaultSecretIdentitiesGetter interface { + AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityInterface +} + +// AzureKeyVaultSecretIdentityInterface has methods to work with AzureKeyVaultSecretIdentity resources. +type AzureKeyVaultSecretIdentityInterface interface { + Create(*v2alpha1.AzureKeyVaultSecretIdentity) (*v2alpha1.AzureKeyVaultSecretIdentity, error) + Update(*v2alpha1.AzureKeyVaultSecretIdentity) (*v2alpha1.AzureKeyVaultSecretIdentity, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v2alpha1.AzureKeyVaultSecretIdentity, error) + List(opts v1.ListOptions) (*v2alpha1.AzureKeyVaultSecretIdentityList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) + AzureKeyVaultSecretIdentityExpansion +} + +// azureKeyVaultSecretIdentities implements AzureKeyVaultSecretIdentityInterface +type azureKeyVaultSecretIdentities struct { + client rest.Interface + ns string +} + +// newAzureKeyVaultSecretIdentities returns a AzureKeyVaultSecretIdentities +func newAzureKeyVaultSecretIdentities(c *AzurekeyvaultV2alpha1Client, namespace string) *azureKeyVaultSecretIdentities { + return &azureKeyVaultSecretIdentities{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the azureKeyVaultSecretIdentity, and returns the corresponding azureKeyVaultSecretIdentity object, and an error if there is any. +func (c *azureKeyVaultSecretIdentities) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + result = &v2alpha1.AzureKeyVaultSecretIdentity{} + err = c.client.Get(). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of AzureKeyVaultSecretIdentities that match those selectors. +func (c *azureKeyVaultSecretIdentities) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretIdentityList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v2alpha1.AzureKeyVaultSecretIdentityList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested azureKeyVaultSecretIdentities. +func (c *azureKeyVaultSecretIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch() +} + +// Create takes the representation of a azureKeyVaultSecretIdentity and creates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. +func (c *azureKeyVaultSecretIdentities) Create(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + result = &v2alpha1.AzureKeyVaultSecretIdentity{} + err = c.client.Post(). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + Body(azureKeyVaultSecretIdentity). + Do(). + Into(result) + return +} + +// Update takes the representation of a azureKeyVaultSecretIdentity and updates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. +func (c *azureKeyVaultSecretIdentities) Update(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + result = &v2alpha1.AzureKeyVaultSecretIdentity{} + err = c.client.Put(). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + Name(azureKeyVaultSecretIdentity.Name). + Body(azureKeyVaultSecretIdentity). + Do(). + Into(result) + return +} + +// Delete takes name of the azureKeyVaultSecretIdentity and deletes it. Returns an error if one occurs. +func (c *azureKeyVaultSecretIdentities) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *azureKeyVaultSecretIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + var timeout time.Duration + if listOptions.TimeoutSeconds != nil { + timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Timeout(timeout). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched azureKeyVaultSecretIdentity. +func (c *azureKeyVaultSecretIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + result = &v2alpha1.AzureKeyVaultSecretIdentity{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("azurekeyvaultsecretidentities"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go new file mode 100644 index 00000000..550ab0af --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go @@ -0,0 +1,23 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v2alpha1 diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go new file mode 100644 index 00000000..d55229c6 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go @@ -0,0 +1,23 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// Package fake has the automatically generated clients. +package fake diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go new file mode 100644 index 00000000..35e260d0 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go @@ -0,0 +1,47 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakeAzurekeyvaultV2alpha1 struct { + *testing.Fake +} + +func (c *FakeAzurekeyvaultV2alpha1) AzureKeyVaultSecrets(namespace string) v2alpha1.AzureKeyVaultSecretInterface { + return &FakeAzureKeyVaultSecrets{c, namespace} +} + +func (c *FakeAzurekeyvaultV2alpha1) AzureKeyVaultSecretIdentities(namespace string) v2alpha1.AzureKeyVaultSecretIdentityInterface { + return &FakeAzureKeyVaultSecretIdentities{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeAzurekeyvaultV2alpha1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go new file mode 100644 index 00000000..7a6cadde --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go @@ -0,0 +1,143 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface +type FakeAzureKeyVaultSecrets struct { + Fake *FakeAzurekeyvaultV2alpha1 + ns string +} + +var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Resource: "azurekeyvaultsecrets"} + +var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Kind: "AzureKeyVaultSecret"} + +// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. +func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecret, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &v2alpha1.AzureKeyVaultSecret{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecret), err +} + +// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. +func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &v2alpha1.AzureKeyVaultSecretList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v2alpha1.AzureKeyVaultSecretList{ListMeta: obj.(*v2alpha1.AzureKeyVaultSecretList).ListMeta} + for _, item := range obj.(*v2alpha1.AzureKeyVaultSecretList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. +func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretsResource, c.ns, opts)) + +} + +// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. +func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2alpha1.AzureKeyVaultSecret{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecret), err +} + +// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. +func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2alpha1.AzureKeyVaultSecret{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecret), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &v2alpha1.AzureKeyVaultSecret{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecret), err +} + +// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. +func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &v2alpha1.AzureKeyVaultSecret{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v2alpha1.AzureKeyVaultSecretList{}) + return err +} + +// Patch applies the patch and returns the patched azureKeyVaultSecret. +func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecret, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &v2alpha1.AzureKeyVaultSecret{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecret), err +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go new file mode 100644 index 00000000..f0d03f84 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go @@ -0,0 +1,131 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeAzureKeyVaultSecretIdentities implements AzureKeyVaultSecretIdentityInterface +type FakeAzureKeyVaultSecretIdentities struct { + Fake *FakeAzurekeyvaultV2alpha1 + ns string +} + +var azurekeyvaultsecretidentitiesResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Resource: "azurekeyvaultsecretidentities"} + +var azurekeyvaultsecretidentitiesKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Kind: "AzureKeyVaultSecretIdentity"} + +// Get takes name of the azureKeyVaultSecretIdentity, and returns the corresponding azureKeyVaultSecretIdentity object, and an error if there is any. +func (c *FakeAzureKeyVaultSecretIdentities) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(azurekeyvaultsecretidentitiesResource, c.ns, name), &v2alpha1.AzureKeyVaultSecretIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err +} + +// List takes label and field selectors, and returns the list of AzureKeyVaultSecretIdentities that match those selectors. +func (c *FakeAzureKeyVaultSecretIdentities) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretIdentityList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(azurekeyvaultsecretidentitiesResource, azurekeyvaultsecretidentitiesKind, c.ns, opts), &v2alpha1.AzureKeyVaultSecretIdentityList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v2alpha1.AzureKeyVaultSecretIdentityList{ListMeta: obj.(*v2alpha1.AzureKeyVaultSecretIdentityList).ListMeta} + for _, item := range obj.(*v2alpha1.AzureKeyVaultSecretIdentityList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested azureKeyVaultSecretIdentities. +func (c *FakeAzureKeyVaultSecretIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretidentitiesResource, c.ns, opts)) + +} + +// Create takes the representation of a azureKeyVaultSecretIdentity and creates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. +func (c *FakeAzureKeyVaultSecretIdentities) Create(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(azurekeyvaultsecretidentitiesResource, c.ns, azureKeyVaultSecretIdentity), &v2alpha1.AzureKeyVaultSecretIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err +} + +// Update takes the representation of a azureKeyVaultSecretIdentity and updates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. +func (c *FakeAzureKeyVaultSecretIdentities) Update(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(azurekeyvaultsecretidentitiesResource, c.ns, azureKeyVaultSecretIdentity), &v2alpha1.AzureKeyVaultSecretIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err +} + +// Delete takes name of the azureKeyVaultSecretIdentity and deletes it. Returns an error if one occurs. +func (c *FakeAzureKeyVaultSecretIdentities) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(azurekeyvaultsecretidentitiesResource, c.ns, name), &v2alpha1.AzureKeyVaultSecretIdentity{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeAzureKeyVaultSecretIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(azurekeyvaultsecretidentitiesResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v2alpha1.AzureKeyVaultSecretIdentityList{}) + return err +} + +// Patch applies the patch and returns the patched azureKeyVaultSecretIdentity. +func (c *FakeAzureKeyVaultSecretIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretidentitiesResource, c.ns, name, pt, data, subresources...), &v2alpha1.AzureKeyVaultSecretIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go new file mode 100644 index 00000000..4d37b892 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go @@ -0,0 +1,26 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v2alpha1 + +type AzureKeyVaultSecretExpansion interface{} + +type AzureKeyVaultSecretIdentityExpansion interface{} diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go index 56851e94..033b8f9b 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go @@ -24,6 +24,7 @@ package azurekeyvault import ( v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" ) @@ -33,6 +34,8 @@ type Interface interface { V1alpha1() v1alpha1.Interface // V1 provides access to shared informers for resources in V1. V1() v1.Interface + // V2alpha1 provides access to shared informers for resources in V2alpha1. + V2alpha1() v2alpha1.Interface } type group struct { @@ -55,3 +58,8 @@ func (g *group) V1alpha1() v1alpha1.Interface { func (g *group) V1() v1.Interface { return v1.New(g.factory, g.namespace, g.tweakListOptions) } + +// V2alpha1 returns a new v2alpha1.Interface. +func (g *group) V2alpha1() v2alpha1.Interface { + return v2alpha1.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go new file mode 100644 index 00000000..e42c6612 --- /dev/null +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go @@ -0,0 +1,92 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + time "time" + + azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// AzureKeyVaultSecretInformer provides access to a shared informer and lister for +// AzureKeyVaultSecrets. +type AzureKeyVaultSecretInformer interface { + Informer() cache.SharedIndexInformer + Lister() v2alpha1.AzureKeyVaultSecretLister +} + +type azureKeyVaultSecretInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewAzureKeyVaultSecretInformer constructs a new informer for AzureKeyVaultSecret type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewAzureKeyVaultSecretInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredAzureKeyVaultSecretInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredAzureKeyVaultSecretInformer constructs a new informer for AzureKeyVaultSecret type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).Watch(options) + }, + }, + &azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, + resyncPeriod, + indexers, + ) +} + +func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredAzureKeyVaultSecretInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, f.defaultInformer) +} + +func (f *azureKeyVaultSecretInformer) Lister() v2alpha1.AzureKeyVaultSecretLister { + return v2alpha1.NewAzureKeyVaultSecretLister(f.Informer().GetIndexer()) +} diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go new file mode 100644 index 00000000..affaf676 --- /dev/null +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go @@ -0,0 +1,92 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + time "time" + + azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// AzureKeyVaultSecretIdentityInformer provides access to a shared informer and lister for +// AzureKeyVaultSecretIdentities. +type AzureKeyVaultSecretIdentityInformer interface { + Informer() cache.SharedIndexInformer + Lister() v2alpha1.AzureKeyVaultSecretIdentityLister +} + +type azureKeyVaultSecretIdentityInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewAzureKeyVaultSecretIdentityInformer constructs a new informer for AzureKeyVaultSecretIdentity type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewAzureKeyVaultSecretIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredAzureKeyVaultSecretIdentityInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredAzureKeyVaultSecretIdentityInformer constructs a new informer for AzureKeyVaultSecretIdentity type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredAzureKeyVaultSecretIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecretIdentities(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecretIdentities(namespace).Watch(options) + }, + }, + &azurekeyvaultv2alpha1.AzureKeyVaultSecretIdentity{}, + resyncPeriod, + indexers, + ) +} + +func (f *azureKeyVaultSecretIdentityInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredAzureKeyVaultSecretIdentityInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *azureKeyVaultSecretIdentityInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&azurekeyvaultv2alpha1.AzureKeyVaultSecretIdentity{}, f.defaultInformer) +} + +func (f *azureKeyVaultSecretIdentityInformer) Lister() v2alpha1.AzureKeyVaultSecretIdentityLister { + return v2alpha1.NewAzureKeyVaultSecretIdentityLister(f.Informer().GetIndexer()) +} diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go new file mode 100644 index 00000000..85ae29b2 --- /dev/null +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go @@ -0,0 +1,55 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // AzureKeyVaultSecrets returns a AzureKeyVaultSecretInformer. + AzureKeyVaultSecrets() AzureKeyVaultSecretInformer + // AzureKeyVaultSecretIdentities returns a AzureKeyVaultSecretIdentityInformer. + AzureKeyVaultSecretIdentities() AzureKeyVaultSecretIdentityInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// AzureKeyVaultSecrets returns a AzureKeyVaultSecretInformer. +func (v *version) AzureKeyVaultSecrets() AzureKeyVaultSecretInformer { + return &azureKeyVaultSecretInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} + +// AzureKeyVaultSecretIdentities returns a AzureKeyVaultSecretIdentityInformer. +func (v *version) AzureKeyVaultSecretIdentities() AzureKeyVaultSecretIdentityInformer { + return &azureKeyVaultSecretIdentityInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/pkg/k8s/client/informers/externalversions/generic.go b/pkg/k8s/client/informers/externalversions/generic.go index e4cb97f9..f9c2c288 100644 --- a/pkg/k8s/client/informers/externalversions/generic.go +++ b/pkg/k8s/client/informers/externalversions/generic.go @@ -26,6 +26,7 @@ import ( v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" ) @@ -64,6 +65,12 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case v1alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V1alpha1().AzureKeyVaultSecrets().Informer()}, nil + // Group=azurekeyvault.spv.no, Version=v2alpha1 + case v2alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer()}, nil + case v2alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecretidentities"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V2alpha1().AzureKeyVaultSecretIdentities().Informer()}, nil + } return nil, fmt.Errorf("no informer found for %v", resource) diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go new file mode 100644 index 00000000..60cd19e3 --- /dev/null +++ b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go @@ -0,0 +1,97 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets. +type AzureKeyVaultSecretLister interface { + // List lists all AzureKeyVaultSecrets in the indexer. + List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) + // AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets. + AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister + AzureKeyVaultSecretListerExpansion +} + +// azureKeyVaultSecretLister implements the AzureKeyVaultSecretLister interface. +type azureKeyVaultSecretLister struct { + indexer cache.Indexer +} + +// NewAzureKeyVaultSecretLister returns a new AzureKeyVaultSecretLister. +func NewAzureKeyVaultSecretLister(indexer cache.Indexer) AzureKeyVaultSecretLister { + return &azureKeyVaultSecretLister{indexer: indexer} +} + +// List lists all AzureKeyVaultSecrets in the indexer. +func (s *azureKeyVaultSecretLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecret)) + }) + return ret, err +} + +// AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets. +func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister { + return azureKeyVaultSecretNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets. +type AzureKeyVaultSecretNamespaceLister interface { + // List lists all AzureKeyVaultSecrets in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) + // Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name. + Get(name string) (*v2alpha1.AzureKeyVaultSecret, error) + AzureKeyVaultSecretNamespaceListerExpansion +} + +// azureKeyVaultSecretNamespaceLister implements the AzureKeyVaultSecretNamespaceLister +// interface. +type azureKeyVaultSecretNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all AzureKeyVaultSecrets in the indexer for a given namespace. +func (s azureKeyVaultSecretNamespaceLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecret)) + }) + return ret, err +} + +// Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name. +func (s azureKeyVaultSecretNamespaceLister) Get(name string) (*v2alpha1.AzureKeyVaultSecret, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v2alpha1.Resource("azurekeyvaultsecret"), name) + } + return obj.(*v2alpha1.AzureKeyVaultSecret), nil +} diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go new file mode 100644 index 00000000..e0f16ec6 --- /dev/null +++ b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go @@ -0,0 +1,97 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v2alpha1 + +import ( + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// AzureKeyVaultSecretIdentityLister helps list AzureKeyVaultSecretIdentities. +type AzureKeyVaultSecretIdentityLister interface { + // List lists all AzureKeyVaultSecretIdentities in the indexer. + List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) + // AzureKeyVaultSecretIdentities returns an object that can list and get AzureKeyVaultSecretIdentities. + AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityNamespaceLister + AzureKeyVaultSecretIdentityListerExpansion +} + +// azureKeyVaultSecretIdentityLister implements the AzureKeyVaultSecretIdentityLister interface. +type azureKeyVaultSecretIdentityLister struct { + indexer cache.Indexer +} + +// NewAzureKeyVaultSecretIdentityLister returns a new AzureKeyVaultSecretIdentityLister. +func NewAzureKeyVaultSecretIdentityLister(indexer cache.Indexer) AzureKeyVaultSecretIdentityLister { + return &azureKeyVaultSecretIdentityLister{indexer: indexer} +} + +// List lists all AzureKeyVaultSecretIdentities in the indexer. +func (s *azureKeyVaultSecretIdentityLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecretIdentity)) + }) + return ret, err +} + +// AzureKeyVaultSecretIdentities returns an object that can list and get AzureKeyVaultSecretIdentities. +func (s *azureKeyVaultSecretIdentityLister) AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityNamespaceLister { + return azureKeyVaultSecretIdentityNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// AzureKeyVaultSecretIdentityNamespaceLister helps list and get AzureKeyVaultSecretIdentities. +type AzureKeyVaultSecretIdentityNamespaceLister interface { + // List lists all AzureKeyVaultSecretIdentities in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) + // Get retrieves the AzureKeyVaultSecretIdentity from the indexer for a given namespace and name. + Get(name string) (*v2alpha1.AzureKeyVaultSecretIdentity, error) + AzureKeyVaultSecretIdentityNamespaceListerExpansion +} + +// azureKeyVaultSecretIdentityNamespaceLister implements the AzureKeyVaultSecretIdentityNamespaceLister +// interface. +type azureKeyVaultSecretIdentityNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all AzureKeyVaultSecretIdentities in the indexer for a given namespace. +func (s azureKeyVaultSecretIdentityNamespaceLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecretIdentity)) + }) + return ret, err +} + +// Get retrieves the AzureKeyVaultSecretIdentity from the indexer for a given namespace and name. +func (s azureKeyVaultSecretIdentityNamespaceLister) Get(name string) (*v2alpha1.AzureKeyVaultSecretIdentity, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v2alpha1.Resource("azurekeyvaultsecretidentity"), name) + } + return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), nil +} diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go new file mode 100644 index 00000000..6fbd0294 --- /dev/null +++ b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go @@ -0,0 +1,38 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v2alpha1 + +// AzureKeyVaultSecretListerExpansion allows custom methods to be added to +// AzureKeyVaultSecretLister. +type AzureKeyVaultSecretListerExpansion interface{} + +// AzureKeyVaultSecretNamespaceListerExpansion allows custom methods to be added to +// AzureKeyVaultSecretNamespaceLister. +type AzureKeyVaultSecretNamespaceListerExpansion interface{} + +// AzureKeyVaultSecretIdentityListerExpansion allows custom methods to be added to +// AzureKeyVaultSecretIdentityLister. +type AzureKeyVaultSecretIdentityListerExpansion interface{} + +// AzureKeyVaultSecretIdentityNamespaceListerExpansion allows custom methods to be added to +// AzureKeyVaultSecretIdentityNamespaceLister. +type AzureKeyVaultSecretIdentityNamespaceListerExpansion interface{} From 21a883a4e0e28afdcf93b74c0ae85f34f80c2055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 28 Sep 2020 19:14:11 +0200 Subject: [PATCH 121/251] default to API version v1 for AzureKeyVaultSecret --- docs/source/content/reference/azure-key-vault-secret.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/content/reference/azure-key-vault-secret.md b/docs/source/content/reference/azure-key-vault-secret.md index ddaa8be9..8cb29013 100644 --- a/docs/source/content/reference/azure-key-vault-secret.md +++ b/docs/source/content/reference/azure-key-vault-secret.md @@ -6,7 +6,7 @@ description: "Reference of AzureKeyVaultSecret custom resource definition" The `AzureKeyVaultSecret` is defined using this schema: ```yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: < name for azure key vault secret> From 064a59a44409d7d34a563ff9172d312c78485d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 28 Sep 2020 19:33:49 +0200 Subject: [PATCH 122/251] remove test output --- pkg/akv2k8s/version_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/akv2k8s/version_test.go b/pkg/akv2k8s/version_test.go index a7c07b5d..6c0e84de 100644 --- a/pkg/akv2k8s/version_test.go +++ b/pkg/akv2k8s/version_test.go @@ -14,7 +14,7 @@ func TestVersion(t *testing.T) { Component = "env-injector" expectedUserAgentStr := fmt.Sprintf("akv2k8s/%s/%s/%s/%s", Component, Version, GitCommit, BuildDate) gotUserAgentStr := GetUserAgent() - t.Log(gotUserAgentStr) + if !strings.EqualFold(expectedUserAgentStr, gotUserAgentStr) { t.Fatalf("got unexpected user agent string: %s. Expected: %s.", gotUserAgentStr, expectedUserAgentStr) } From c95df263bdf26e4f4aa8c8e32f875f71c7da8883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 28 Sep 2020 20:36:43 +0200 Subject: [PATCH 123/251] remove race from test - crash on ubuntu --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 6c8f7892..e37607e5 100644 --- a/Makefile +++ b/Makefile @@ -159,12 +159,12 @@ codegen: .PHONY: test test: fmtcheck GOOS=$(TEST_GOOS) \ - CGO_ENABLED=1 \ + CGO_ENABLED=0 \ AKV2K8S_CLIENT_ID=$(AKV2K8S_CLIENT_ID) \ AKV2K8S_CLIENT_SECRET=$(AKV2K8S_CLIENT_SECRET) \ AKV2K8S_CLIENT_TENANT_ID=$(AKV2K8S_CLIENT_TENANT_ID) \ AKV2K8S_AZURE_SUBSCRIPTION_ID=$(AKV2K8S_AZURE_SUBSCRIPTION_ID) \ - go test -race -coverprofile=coverage.txt -covermode=atomic -count=1 -v $(shell go list ./... | grep -v /pkg/k8s/) + go test -coverprofile=coverage.txt -covermode=atomic -count=1 -v $(shell go list ./... | grep -v /pkg/k8s/) .PHONY: init-int-test-local init-int-test-local: From e345c2e6f1c845f180656ad914adf26ff2f1279b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 28 Sep 2020 21:58:35 +0200 Subject: [PATCH 124/251] fix build issue --- Dockerfile | 2 +- Makefile | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 938778f8..cdeecb3f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -74,7 +74,7 @@ LABEL org.label-schema.author="Jon Arild Tørresdal" COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/ca-bundle-controller /usr/local/bin/ ENV DEBUG false USER 65534 -ENTRYPOINT ["/usr/local/bin/azure-keyvault-secrets-webhook"] +ENTRYPOINT ["/usr/local/bin/ca-bundle-controller"] # -------- # vaultenv diff --git a/Makefile b/Makefile index e37607e5..09bfae39 100644 --- a/Makefile +++ b/Makefile @@ -233,7 +233,6 @@ image-webhook: .PHONY: image-controller image-controller: - # docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/controller/Dockerfile --build-arg BUILD_OPTIONS="$(GO_BUILD_OPTIONS)" --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) docker build \ --target controller \ --build-arg BUILD_SUB_TARGET=-controller \ @@ -245,7 +244,6 @@ image-controller: .PHONY: image-ca-bundle-controller image-ca-bundle-controller: - # docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/ca-bundle-controller/Dockerfile --build-arg BUILD_OPTIONS="$(GO_BUILD_OPTIONS)" --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/ca-bundle-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) docker build \ --target ca-bundle-controller \ --build-arg BUILD_SUB_TARGET=-ca-bundle-controller \ @@ -257,7 +255,6 @@ image-ca-bundle-controller: .PHONY: image-vaultenv image-vaultenv: - # docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/vault-env/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg BUILD_OPTIONS="$(GO_BUILD_OPTIONS)" --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-env" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL) docker build \ --target vaultenv \ --build-arg BUILD_SUB_TARGET=-vaultenv \ From cf7a81c61b3e7094e6df7773d3c10657c6291219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 29 Sep 2020 13:59:24 +0200 Subject: [PATCH 125/251] use docker buildkit to target specific docker targets --- Dockerfile | 4 +++- Makefile | 30 +++++++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index cdeecb3f..584deb81 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,11 +7,13 @@ ARG GO_VERSION=1.13.0 # ------- FROM golang:${GO_VERSION} AS builder ARG PACKAGE +ARG VCS_REF=noref ARG BUILD_SUB_TARGET + WORKDIR /go/src/${PACKAGE} ADD . . RUN go mod download -RUN make build${BUILD_SUB_TARGET} +RUN GIT_TAG=${VCS_REF} make build${BUILD_SUB_TARGET} # ------------ # Env Injector diff --git a/Makefile b/Makefile index 09bfae39..3d485dbd 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ else endif endif -GO_BUILD_OPTIONS := --tags "netgo osusergo" -ldflags "-s -X $(COMPONENT_VAR)=$(COMPONENT) -X $(GIT_VAR)=$(DOCKER_INTERNAL_TAG) -X $(BUILD_DATE_VAR)=$(BUILD_DATE) -extldflags '-static'" +GO_BUILD_OPTIONS := --tags "netgo osusergo" -ldflags "-s -X $(COMPONENT_VAR)=$(COMPONENT) -X $(GIT_VAR)=$(GIT_TAG) -X $(BUILD_DATE_VAR)=$(BUILD_DATE) -extldflags '-static'" $(TOOLS_DIR)/golangci-lint: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go cd $(TOOLS_MOD_DIR) && \ @@ -215,16 +215,18 @@ build-ca-bundle-controller: clean-ca-bundle-controller CGO_ENABLED=0 COMPONENT=ca-bundle-controller PKG_NAME=$(PACKAGE)/cmd/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) .PHONY: build-vaultenv -build-vaultenv: clean-ca-bundle-controller +build-vaultenv: clean-vaultenv CGO_ENABLED=0 COMPONENT=vaultenv PKG_NAME=$(PACKAGE)/cmd/$(KEYVAULT_ENV_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(KEYVAULT_ENV_BINARY_NAME) +.PHONY: images images: image-webhook image-controller image-ca-bundle-controller image-vaultenv .PHONY: image-webhook image-webhook: - docker build \ + DOCKER_BUILDKIT=1 docker build \ + --progress=plain \ --target webhook \ - --build-arg BUILD_SUB_TARGET=-webhook \ + --build-arg BUILD_SUB_TARGET="-webhook" \ --build-arg PACKAGE=$(PACKAGE) \ --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ --build-arg BUILD_DATE=$(BUILD_DATE) \ @@ -233,9 +235,10 @@ image-webhook: .PHONY: image-controller image-controller: - docker build \ + DOCKER_BUILDKIT=1 docker build \ + --progress=plain \ --target controller \ - --build-arg BUILD_SUB_TARGET=-controller \ + --build-arg BUILD_SUB_TARGET="-controller" \ --build-arg PACKAGE=$(PACKAGE) \ --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ --build-arg BUILD_DATE=$(BUILD_DATE) \ @@ -244,9 +247,10 @@ image-controller: .PHONY: image-ca-bundle-controller image-ca-bundle-controller: - docker build \ + DOCKER_BUILDKIT=1 docker build \ + --progress=plain \ --target ca-bundle-controller \ - --build-arg BUILD_SUB_TARGET=-ca-bundle-controller \ + --build-arg BUILD_SUB_TARGET="-ca-bundle-controller" \ --build-arg PACKAGE=$(PACKAGE) \ --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ --build-arg BUILD_DATE=$(BUILD_DATE) \ @@ -255,9 +259,10 @@ image-ca-bundle-controller: .PHONY: image-vaultenv image-vaultenv: - docker build \ + DOCKER_BUILDKIT=1 docker build \ + --progress=plain \ --target vaultenv \ - --build-arg BUILD_SUB_TARGET=-vaultenv \ + --build-arg BUILD_SUB_TARGET="-vaultenv" \ --build-arg PACKAGE=$(PACKAGE) \ --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ --build-arg BUILD_DATE=$(BUILD_DATE) \ @@ -266,7 +271,10 @@ image-vaultenv: .PHONY: image-akv2k8s-env-test image-akv2k8s-env-test: - docker build . -t $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) -f images/akv2k8s-test/Dockerfile + DOCKER_BUILDKIT=1 docker build \ + --progress=plain \ + -t $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) \ + -f images/akv2k8s-test/Dockerfile . .PHONY: push push: push-controller push-ca-bundle-controller push-webhook push-vaultenv From 740444bae6e21c06daf19ac096b5e5a768262c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 29 Sep 2020 14:26:22 +0200 Subject: [PATCH 126/251] allow root access in order to read file on host --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 584deb81..017b9dcb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,7 +33,6 @@ LABEL org.label-schema.author="Jon Arild Tørresdal" COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-secrets-webhook /usr/local/bin/ ENV DEBUG false -USER 65534 ENTRYPOINT ["/usr/local/bin/azure-keyvault-secrets-webhook"] # ---------- @@ -54,7 +53,6 @@ LABEL org.label-schema.author="Jon Arild Tørresdal" COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-controller /usr/local/bin/ ENV DEBUG false -USER 65534 ENTRYPOINT ["/usr/local/bin/azure-keyvault-controller"] # -------------------- From 7a59441543cf13278166cba5620006a916d7d8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 29 Sep 2020 14:34:43 +0200 Subject: [PATCH 127/251] trigger build when Dockerfile changes --- .github/workflows/ca-bundle-controller-build.yaml | 1 + .github/workflows/controller-build.yaml | 1 + .github/workflows/vaultenv-build.yaml | 1 + .github/workflows/webhook-build.yaml | 1 + 4 files changed, 4 insertions(+) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index 5e1984d8..adeb948a 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -7,6 +7,7 @@ on: paths: - '.github/workflows/ca-bundle-controller-build.yaml' - '.github/actions/**' + - 'Dockerfile' - 'Makefile' - 'go.mod' - 'go.sum' diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index 12a04d42..658c07c0 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -7,6 +7,7 @@ on: paths: - '.github/workflows/controller-build.yaml' - '.github/actions/**' + - 'Dockerfile' - 'Makefile' - 'go.mod' - 'go.sum' diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index 1c4b3a8f..9baa8ddc 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -7,6 +7,7 @@ on: paths: - '.github/workflows/vaultenv-build.yaml' - '.github/actions/**' + - 'Dockerfile' - 'Makefile' - 'go.mod' - 'go.sum' diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index 88b0bbc8..4890ef77 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -7,6 +7,7 @@ on: paths: - '.github/workflows/webhook-build.yaml' - '.github/actions/**' + - 'Dockerfile' - 'Makefile' - 'go.mod' - 'go.sum' From 2317da0cd980774f61eb9b78214ace4fd8920792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 29 Sep 2020 14:49:15 +0200 Subject: [PATCH 128/251] use alpine image on injector and controller --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 017b9dcb..85321dda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ RUN GIT_TAG=${VCS_REF} make build${BUILD_SUB_TARGET} # ------------ # Env Injector # ------------ -FROM $BASEIMAGE AS webhook +FROM $BASE_ALPINE AS webhook ARG VCS_REF ARG BUILD_DATE ARG VCS_URL @@ -38,7 +38,7 @@ ENTRYPOINT ["/usr/local/bin/azure-keyvault-secrets-webhook"] # ---------- # Controller # ---------- -FROM $BASEIMAGE AS controller +FROM $BASE_ALPINE AS controller ARG VCS_REF ARG BUILD_DATE ARG VCS_URL From 26816fee78de47a7278b0f5a3877493db32f70c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 08:29:32 +0200 Subject: [PATCH 129/251] refactor controller to use queue from kmodule removing lots of scaffolding --- .../controller/controller.go | 459 ++++++++++-------- .../controller/handler.go | 59 ++- cmd/azure-keyvault-controller/main.go | 22 +- go.mod | 16 +- go.sum | 354 ++++++-------- 5 files changed, 499 insertions(+), 411 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 9e5269ed..f2cd3411 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -20,22 +20,27 @@ limitations under the License. package controller import ( - "fmt" "time" + "github.com/appscode/go/runtime" + "github.com/pkg/errors" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/wait" - coreinformers "k8s.io/client-go/informers/core/v1" + "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/cache" - "k8s.io/client-go/util/workqueue" + "kmodules.xyz/client-go/tools/queue" + + // "k8s.io/client-go/util/workqueue" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" - informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" + akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" + akvInformersv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" ) const ( @@ -72,68 +77,108 @@ type Controller struct { // Handler process work on workqueues handler *Handler - secretsSynced cache.InformerSynced - azureKeyVaultSecretsSynced cache.InformerSynced + // secretsSynced cache.InformerSynced + // azureKeyVaultSecretsSynced cache.InformerSynced // workqueue is a rate limited work queue. This is used to queue work to be // processed instead of performing it as soon as a change happens. This // means we can ensure we only process a fixed amount of resources at a // time, and makes it easy to ensure we are never processing the same item // simultaneously in two different workers. - workqueue workqueue.RateLimitingInterface - workqueueAzure workqueue.RateLimitingInterface + + secretInformerFactory informers.SharedInformerFactory + akvsInformerFactory akvInformers.SharedInformerFactory + + secretInformer cache.SharedIndexInformer + secretQueue *queue.Worker + + akvsInformer cache.SharedIndexInformer + akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface + + akvQueue *queue.Worker //workqueue.RateLimitingInterface +} + +// Options contains options for the controller +type Options struct { + NumThreads int + MaxNumRequeues int + ResyncPeriod time.Duration + AkvsRef corev1.ObjectReference } // NewController returns a new AzureKeyVaultSecret controller -func NewController(handler *Handler, secretInformer coreinformers.SecretInformer, azureKeyVaultSecretsInformer informers.AzureKeyVaultSecretInformer, azureFrequency AzurePollFrequency) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, handler *Handler, azureFrequency AzurePollFrequency, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) controller := &Controller{ - handler: handler, - secretsSynced: secretInformer.Informer().HasSynced, - azureKeyVaultSecretsSynced: azureKeyVaultSecretsInformer.Informer().HasSynced, - workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "AzureKeyVaultSecrets"), - workqueueAzure: workqueue.NewNamedRateLimitingQueue(workqueue.NewItemFastSlowRateLimiter(azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown), "AzureKeyVault"), + handler: handler, + // secretsSynced: secretInformer.Informer().HasSynced, + // azureKeyVaultSecretsSynced: azureKeyVaultSecretsInformer.Informer().HasSynced, + + //workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "AzureKeyVaultSecrets"), + //workqueue.NewNamedRateLimitingQueue(workqueue.NewItemFastSlowRateLimiter(azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown), "AzureKeyVault"), + + akvsInformerFactory: akvInformers.NewFilteredSharedInformerFactory(akvsClient, options.ResyncPeriod, options.AkvsRef.Namespace, nil), + secretInformerFactory: informers.NewFilteredSharedInformerFactory(client, options.ResyncPeriod, options.AkvsRef.Namespace, nil), + secretQueue: queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, handler.syncSecret), + akvsCrdQueue: queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVaultSecret), + akvQueue: queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), } log.Info("Setting up event handlers") // Set up an event handler for when AzureKeyVaultSecret resources change - azureKeyVaultSecretsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + akvsInformer := controller.akvsInformerFactory.InformerFor(&akv.AzureKeyVaultSecret{}, func(client akvcs.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return akvInformersv2alpha1.NewAzureKeyVaultSecretInformer( + akvsClient, + options.AkvsRef.Namespace, + resyncPeriod, + cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, + ) + }) + akvsInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - secret := obj.(*akv.AzureKeyVaultSecret) - if secret.Spec.Output.Secret.Name == "" { - return + if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { + if secret.Spec.Output.Secret.Name == "" { + return + } + log.Debugf("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name) + queue.Enqueue(controller.akvsCrdQueue.GetQueue(), obj) + queue.Enqueue(controller.akvQueue.GetQueue(), obj) + // controller.enqueueAzureKeyVaultSecret(obj) + // controller.enqueueAzurePoll(obj) } - log.Debugf("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name) - controller.enqueueAzureKeyVaultSecret(obj) - controller.enqueueAzurePoll(obj) }, UpdateFunc: func(old, new interface{}) { - newSecret := new.(*akv.AzureKeyVaultSecret) - oldSecret := old.(*akv.AzureKeyVaultSecret) - if oldSecret.Spec.Output.Secret.Name == "" { - return - } - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - log.Debugf("AzureKeyVaultSecret '%s' added to Azure queue to check if changed in Azure.", newSecret.Name) - // Check if secret has changed in Azure - controller.enqueueAzurePoll(new) - return + if newSecret, ok := new.(*akv.AzureKeyVaultSecret); ok { + oldSecret := old.(*akv.AzureKeyVaultSecret) + if oldSecret.Spec.Output.Secret.Name == "" { + return + } + if newSecret.ResourceVersion == oldSecret.ResourceVersion { + log.Debugf("AzureKeyVaultSecret '%s' added to Azure queue to check if changed in Azure.", newSecret.Name) + // Check if secret has changed in Azure + queue.Enqueue(controller.akvQueue.GetQueue(), new) + // controller.enqueueAzurePoll(new) + return + } + + log.Debugf("AzureKeyVaultSecret '%s' changed. Adding to queue.", newSecret.Name) + queue.Enqueue(controller.akvsCrdQueue.GetQueue(), new) + // controller.enqueueAzureKeyVaultSecret(new) } - - log.Debugf("AzureKeyVaultSecret '%s' changed. Adding to queue.", newSecret.Name) - controller.enqueueAzureKeyVaultSecret(new) }, DeleteFunc: func(obj interface{}) { - secret := obj.(*akv.AzureKeyVaultSecret) - if secret.Spec.Output.Secret.Name == "" { - return + if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { + if secret.Spec.Output.Secret.Name == "" { + return + } + log.Debugf("AzureKeyVaultSecret '%s' deleted. Adding to delete queue.", secret.Name) + queue.Enqueue(controller.akvsCrdQueue.GetQueue(), obj) + // controller.enqueueDeleteAzureKeyVaultSecret(obj) } - log.Debugf("AzureKeyVaultSecret '%s' deleted. Adding to delete queue.", secret.Name) - controller.enqueueDeleteAzureKeyVaultSecret(obj) }, }) @@ -143,29 +188,35 @@ func NewController(handler *Handler, secretInformer coreinformers.SecretInformer // processing. This way, we don't need to implement custom logic for // handling AzureKeyVaultSecret resources. More info on this pattern: // https://github.com/kubernetes/community/blob/8cafef897a22026d42f5e5bb3f104febe7e29830/contributors/devel/controllers.md - secretInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + controller.secretInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - secret := obj.(*corev1.Secret) - log.Debugf("Secret '%s' added. Handling.", secret.Name) - controller.enqueueObject(obj) + if secret, ok := obj.(*corev1.Secret); ok { + log.Debugf("Secret '%s' added. Handling.", secret.Name) + queue.Enqueue(controller.secretQueue.GetQueue(), obj) + // controller.enqueueObject(obj) + } }, UpdateFunc: func(old, new interface{}) { - newSecret := new.(*corev1.Secret) - oldSecret := old.(*corev1.Secret) - - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return + if newSecret, ok := new.(*corev1.Secret); ok { + oldSecret := old.(*corev1.Secret) + + if newSecret.ResourceVersion == oldSecret.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } + secret := new.(*corev1.Secret) + log.Debugf("Secret '%s' controlled by AzureKeyVaultSecret changed. Handling.", secret.Name) + queue.Enqueue(controller.secretQueue.GetQueue(), new) + // controller.enqueueObject(new) } - secret := new.(*corev1.Secret) - log.Debugf("Secret '%s' controlled by AzureKeyVaultSecret changed. Handling.", secret.Name) - controller.enqueueObject(new) }, DeleteFunc: func(obj interface{}) { - secret := obj.(*corev1.Secret) - log.Debugf("Secret '%s' deleted. Handling.", secret.Name) - controller.enqueueObject(obj) + if secret, ok := obj.(*corev1.Secret); ok { + log.Debugf("Secret '%s' deleted. Handling.", secret.Name) + queue.Enqueue(controller.secretQueue.GetQueue(), obj) + // controller.enqueueObject(obj) + } }, }) @@ -176,154 +227,172 @@ func NewController(handler *Handler, secretInformer coreinformers.SecretInformer // as syncing informer caches and starting workers. It will block until stopCh // is closed, at which point it will shutdown the workqueue and wait for // workers to finish processing their current work items. -func (c *Controller) Run(threadiness int, stopCh <-chan struct{}) error { +func (c *Controller) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() - defer c.workqueue.ShutDown() - defer c.workqueueAzure.ShutDown() + // defer c.workqueue.ShutDown() + // defer c.workqueueAzure.ShutDown() // Start the informer factories to begin populating the informer caches log.Info("Starting AzureKeyVaultSecret controller") - - // Wait for the caches to be synced before starting workers - log.Info("Waiting for informer caches to sync") - if ok := cache.WaitForCacheSync(stopCh, c.secretsSynced, c.azureKeyVaultSecretsSynced); !ok { - return fmt.Errorf("failed to wait for caches to sync") - } - - log.Info("Starting workers") - // Launch two workers to process AzureKeyVaultSecret resources - for i := 0; i < threadiness; i++ { - go wait.Until(c.runWorker, time.Second, stopCh) - go wait.Until(c.runAzureWorker, time.Second, stopCh) - } - - log.Info("Started workers") - <-stopCh - log.Info("Shutting down workers") - - return nil -} - -// runWorker is a long-running function that will continually call the -// processNextWorkItem function in order to read and process a message on the -// workqueue. -func (c *Controller) runWorker() { - for c.processNextWorkItem(c.workqueue, false) { - } -} - -func (c *Controller) runAzureWorker() { - for c.processNextWorkItem(c.workqueueAzure, true) { - } -} - -// processNextWorkItem will read a single work item off the workqueue and -// attempt to process it, by calling the syncHandler. -func (c *Controller) processNextWorkItem(queue workqueue.RateLimitingInterface, syncAzure bool) bool { - log.Debug("Processing next work item in queue...") - obj, shutdown := queue.Get() - - if shutdown { - return false - } - - // We wrap this block in a func so we can defer c.workqueue.Done. - err := func(obj interface{}) error { - defer queue.Done(obj) - var key string - var ok bool - var successMsg string - - if key, ok = obj.(string); !ok { - queue.Forget(obj) - utilruntime.HandleError(fmt.Errorf("expected string in workqueue but got %#v", obj)) - return nil - } - - var err error - if syncAzure { - log.Debugf("Handling '%s' in Azure queue...", key) - successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Azure Key Vault" - err = c.handler.azureSyncHandler(key) - } else { - log.Debugf("Handling '%s' in default queue...", key) - successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Kubernetes Secret" - err = c.handler.kubernetesSyncHandler(key) + c.akvsInformerFactory.Start(stopCh) + c.secretInformerFactory.Start(stopCh) + + // Wait for all involved caches to be synced, before processing items from the queue is started + for _, v := range c.akvsInformerFactory.WaitForCacheSync(stopCh) { + if !v { + runtime.HandleError(errors.Errorf("timed out waiting for caches to sync")) + return } - - if err != nil { - queue.AddRateLimited(key) - return fmt.Errorf("error syncing '%s': %s, requeuing", key, err.Error()) + } + for _, v := range c.secretInformerFactory.WaitForCacheSync(stopCh) { + if !v { + runtime.HandleError(errors.Errorf("timed out waiting for caches to sync")) + return } - - queue.Forget(obj) - log.Infof(successMsg, key) - return nil - }(obj) - - if err != nil { - log.Error(err) - return true } - return true -} - -func (c *Controller) enqueueObject(obj interface{}) { - azureKeyVaultSecret, ignore, err := c.handler.handleObject(obj) - - if err != nil { - utilruntime.HandleError(err) - } + c.akvQueue.Run(stopCh) + c.secretQueue.Run(stopCh) + c.akvQueue.Run(stopCh) - if !ignore { - c.enqueueAzureKeyVaultSecret(azureKeyVaultSecret) - } -} + // // Wait for the caches to be synced before starting workers + // log.Info("Waiting for informer caches to sync") + // if ok := cache.WaitForCacheSync(stopCh, c.secretsSynced, c.azureKeyVaultSecretsSynced); !ok { + // return fmt.Errorf("failed to wait for caches to sync") + // } -// enqueueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// string which is then put onto the work queue. This method should *not* be -// passed resources of any type other than AzureKeyVaultSecret. -func (c *Controller) enqueueAzureKeyVaultSecret(obj interface{}) { - var key string - var err error - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.workqueue.AddRateLimited(key) -} + // log.Info("Starting workers") + // // Launch two workers to process AzureKeyVaultSecret resources + // for i := 0; i < threadiness; i++ { + // go wait.Until(c.runWorker, time.Second, stopCh) + // go wait.Until(c.runAzureWorker, time.Second, stopCh) + // } -// enqueueAzurePoll takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// string which is then put onto the work queue. This method should *not* be -// passed resources of any type other than AzureKeyVaultSecret. -func (c *Controller) enqueueAzurePoll(obj interface{}) { - var key string - var err error - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.workqueueAzure.AddRateLimited(key) + log.Info("Started workers") + <-stopCh + log.Info("Shutting down workers") } -// dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// string which is then put onto the work queue for deltion. This method should *not* be -// passed resources of any type other than AzureKeyVaultSecret. -func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { - var key string - var err error - - if key, err = cache.DeletionHandlingMetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.workqueue.AddRateLimited(key) - - // Getting default key to remove from Azure work queue - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.workqueueAzure.Forget(key) -} +// // runWorker is a long-running function that will continually call the +// // processNextWorkItem function in order to read and process a message on the +// // workqueue. +// func (c *Controller) runWorker() { +// for c.processNextWorkItem(c.workqueue, false) { +// } +// } + +// func (c *Controller) runAzureWorker() { +// for c.processNextWorkItem(c.workqueueAzure, true) { +// } +// } + +// // processNextWorkItem will read a single work item off the workqueue and +// // attempt to process it, by calling the syncHandler. +// func (c *Controller) processNextWorkItem(queue workqueue.RateLimitingInterface, syncAzure bool) bool { +// log.Debug("Processing next work item in queue...") +// obj, shutdown := queue.Get() + +// if shutdown { +// return false +// } + +// // We wrap this block in a func so we can defer c.workqueue.Done. +// err := func(obj interface{}) error { +// defer queue.Done(obj) +// var key string +// var ok bool +// var successMsg string + +// if key, ok = obj.(string); !ok { +// queue.Forget(obj) +// utilruntime.HandleError(fmt.Errorf("expected string in workqueue but got %#v", obj)) +// return nil +// } + +// var err error +// if syncAzure { +// log.Debugf("Handling '%s' in Azure queue...", key) +// successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Azure Key Vault" +// err = c.handler.azureSyncHandler(key) +// } else { +// log.Debugf("Handling '%s' in default queue...", key) +// successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Kubernetes Secret" +// err = c.handler.kubernetesSyncHandler(key) +// } + +// if err != nil { +// queue.AddRateLimited(key) +// return fmt.Errorf("error syncing '%s': %s, requeuing", key, err.Error()) +// } + +// queue.Forget(obj) +// log.Infof(successMsg, key) +// return nil +// }(obj) + +// if err != nil { +// log.Error(err) +// return true +// } + +// return true +// } + +// func (c *Controller) enqueueObject(obj interface{}) { +// azureKeyVaultSecret, ignore, err := c.handler.handleObject(obj) + +// if err != nil { +// utilruntime.HandleError(err) +// } + +// if !ignore { +// c.enqueueAzureKeyVaultSecret(azureKeyVaultSecret) +// } +// } + +// // enqueueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name +// // string which is then put onto the work queue. This method should *not* be +// // passed resources of any type other than AzureKeyVaultSecret. +// func (c *Controller) enqueueAzureKeyVaultSecret(obj interface{}) { +// var key string +// var err error +// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { +// utilruntime.HandleError(err) +// return +// } +// c.akvsCrdQueue.AddRateLimited(key) +// } + +// // enqueueAzurePoll takes a AzureKeyVaultSecret resource and converts it into a namespace/name +// // string which is then put onto the work queue. This method should *not* be +// // passed resources of any type other than AzureKeyVaultSecret. +// func (c *Controller) enqueueAzurePoll(obj interface{}) { +// var key string +// var err error +// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { +// utilruntime.HandleError(err) +// return +// } +// c.akvQueue.AddRateLimited(key) +// } + +// // dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name +// // string which is then put onto the work queue for deltion. This method should *not* be +// // passed resources of any type other than AzureKeyVaultSecret. +// func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { +// var key string +// var err error + +// if key, err = cache.DeletionHandlingMetaNamespaceKeyFunc(obj); err != nil { +// utilruntime.HandleError(err) +// return +// } +// c.akvsCrdQueue.AddRateLimited(key) + +// // Getting default key to remove from Azure work queue +// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { +// utilruntime.HandleError(err) +// return +// } +// c.akvQueue.Forget(key) +// } diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 3c1d8c15..1d08cd50 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -92,7 +92,7 @@ func NewHandler(kubeclientset kubernetes.Interface, azureKeyvaultClientset clien // kubernetesSyncHandler compares the actual state with the desired, and attempts to // converge the two. It then updates the Status block of the AzureKeyVaultSecret resource // with the current status of the resource. -func (h *Handler) kubernetesSyncHandler(key string) error { +func (h *Handler) syncAzureKeyVaultSecret(key string) error { var azureKeyVaultSecret *akv.AzureKeyVaultSecret var secret *corev1.Secret var err error @@ -119,7 +119,48 @@ func (h *Handler) kubernetesSyncHandler(key string) error { return nil } -func (h *Handler) azureSyncHandler(key string) error { +// kubernetesSyncHandler compares the actual state with the desired, and attempts to +// converge the two. It then updates the Status block of the AzureKeyVaultSecret resource +// with the current status of the resource. +func (h *Handler) syncSecret(key string) error { + var secret *corev1.Secret + var err error + + if secret, err = h.getSecret(key); err != nil { + if exit := handleKeyVaultError(err, key); exit { + return nil + } + return err + } + + log.Debugf("Processing secret: %s", secret.GetName()) + if ownerRef := metav1.GetControllerOf(secret); ownerRef != nil { + // If this object is not owned by a AzureKeyVaultSecret, we should not do anything more + // with it. + if ownerRef.Kind != "AzureKeyVaultSecret" { + return nil + } + + azureKeyVaultSecret, err := h.azureKeyVaultSecretsLister.AzureKeyVaultSecrets(secret.GetNamespace()).Get(ownerRef.Name) + if err != nil { + log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", secret.GetSelfLink(), ownerRef.Name) + return nil + } + + key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(azureKeyVaultSecret) + if err != nil { + if exit := handleKeyVaultError(err, key); exit { + return nil + } + return err + } + + h.syncAzureKeyVaultSecret(key) + } + return nil +} + +func (h *Handler) syncAzureKeyVault(key string) error { var azureKeyVaultSecret *akv.AzureKeyVaultSecret var secret *corev1.Secret var secretValue map[string][]byte @@ -200,6 +241,20 @@ func (h *Handler) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, return azureKeyVaultSecret, err } +func (h *Handler) getSecret(key string) (*corev1.Secret, error) { + namespace, name, err := cache.SplitMetaNamespaceKey(key) + if err != nil { + return nil, fmt.Errorf("invalid resource key: %s", key) + } + + secret, err := h.secretsLister.Secrets(namespace).Get(name) + + if err != nil { + return nil, err + } + return secret, err +} + func (h *Handler) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (*corev1.Secret, error) { var secret *corev1.Secret var secretValues map[string][]byte diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index d350a075..379877a2 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -154,19 +154,19 @@ func main() { recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecretIdentities().Lister(), recorder, vaultService, azurePollFrequency) - controller := controller.NewController(handler, - kubeInformerFactory.Core().V1().Secrets(), - azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets(), - azurePollFrequency) + options := &controller.Options{ + MaxNumRequeues: 5, + NumThreads: 1, + } - // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) - // Start method is non-blocking and runs all registered informers in a dedicated goroutine. - kubeInformerFactory.Start(stopCh) - azureKeyVaultSecretInformerFactory.Start(stopCh) + controller := controller.NewController(kubeClient, azureKeyVaultSecretClient, handler, azurePollFrequency, options) - if err = controller.Run(2, stopCh); err != nil { - log.Fatalf("Error running controller: %s", err.Error()) - } + // // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) + // // Start method is non-blocking and runs all registered informers in a dedicated goroutine. + // kubeInformerFactory.Start(stopCh) + // azureKeyVaultSecretInformerFactory.Start(stopCh) + + controller.Run(stopCh) } func init() { diff --git a/go.mod b/go.mod index caf8407b..e5acf4e7 100644 --- a/go.mod +++ b/go.mod @@ -10,20 +10,34 @@ require ( github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 github.com/Azure/go-autorest/autorest/to v0.3.0 // indirect github.com/Azure/go-autorest/autorest/validation v0.2.0 // indirect + github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc github.com/containers/image/v5 v5.3.0 github.com/ghodss/yaml v1.0.0 - github.com/golangci/golangci-lint v1.31.0 // indirect + github.com/google/go-cmp v0.5.2 // indirect github.com/gorilla/mux v1.7.4 + github.com/klauspost/compress v1.10.10 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/mattn/go-colorable v0.1.7 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/onsi/ginkgo v1.13.0 // indirect github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 + github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.1.0 github.com/sirupsen/logrus v1.6.0 github.com/slok/kubewebhook v0.4.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.1 + github.com/stretchr/testify v1.6.1 // indirect golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 + golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect + golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.3.0 k8s.io/api v0.17.2 k8s.io/apimachinery v0.17.2 k8s.io/client-go v0.17.2 + kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053 sigs.k8s.io/yaml v1.2.0 ) diff --git a/go.sum b/go.sum index 9cdcd663..ae5facbf 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/Azure/aad-pod-identity v1.6.3/go.mod h1:wFUg5YGthk9OLfwg0vImAf6i4vsw1 github.com/Azure/azure-sdk-for-go v40.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible h1:CVQNKuUepSFBo6BW6gM1J9slPHLRcjn6vaw+j+causw= github.com/Azure/azure-sdk-for-go v40.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= @@ -73,37 +75,37 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 h1:XTrzB+F8+SpRmbhAH8HLxhiiG6nYNwaBZjrFps1oWEk= -github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2 h1:JCHLVE3B+kJde7bIEo5N4J+ZbLhp0J1Fs+ulyRws4gE= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 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/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc h1:Q5jwbRq/a1Tien+Is8Zn6HMBRgE13+UOQ9mTvrIuvuE= +github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8 h1:UPvo0sEDBWGIb/nxKyC07j8r3ZH0Qtd0V3aDDM9VpjI= github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8/go.mod h1:4AJxUpXUhv4N+ziTvIcWWXgeorXpxPZOfk9HdEVr96M= 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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= 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= @@ -111,14 +113,16 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r 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/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bombsimon/wsl/v3 v3.1.0 h1:E5SRssoBgtVFPcYWUOFJEcgaySgdtTNYzsSKDOY7ss8= -github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= @@ -139,24 +143,26 @@ github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741/go.mod h1:MeJD github.com/containers/storage v1.16.5 h1:eHeWEhUEWX3VMIG1Vn1rEjfRoLHUQev3cwtA5zd89wk= github.com/containers/storage v1.16.5/go.mod h1:SdysZeLKJOvfHYysUWg9OZUC3gdZWi5b2b7NC18VpPE= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3/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/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-iptables v0.3.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 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/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/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/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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/daixiang0/gci v0.2.4 h1:BUCKk5nlK2m+kRIsoj+wb/5hazHvHeZieBKWd9Afa8Q= -github.com/daixiang0/gci v0.2.4/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUsNa8F+hHc6w= -github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= 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= @@ -166,10 +172,13 @@ github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65 h1:4zlOyrJUbYn github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bPlG8QMY64VeXtVfjmjIlzaQok5Q= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969 h1:p2WzwcFof6KwsloLgCiAKkU5DJSVgOKGdevswAmskvY= github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= @@ -181,14 +190,17 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/evanphx/json-patch v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= @@ -196,50 +208,56 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.5.2 h1:3RJdgf6u4NZUumoP8nzbqiiNT8e1tC2Oc7jlgqre/IA= -github.com/go-critic/go-critic v0.5.2/go.mod h1:cc0+HvdE3lFpqLecgqMaJcvWWH77sLdBp+wLGPM1Yyo= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1 h1:wSt/4CYxs70xbATrGXhokKF1i0tZjENLOo1ioIO13zk= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9 h1:tF+augKRWlWx0J0B7ZyyKSiTyV6E1zZe+7b3qQlcEf8= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501 h1:C1JKChikHGpXwT5UQDFaryIpDtyyGL/CR6C2kB7F1oc= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87 h1:zP3nY8Tk2E6RTkqGYrarZXuzh+ffyLDljLxCy1iJw80= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= -github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= 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 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= @@ -268,36 +286,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0= -github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.31.0 h1:+m9I3LEmxXLpymkXRPkDQGzOVBmBYm16UtDiXqZxWek= -github.com/golangci/golangci-lint v1.31.0/go.mod h1:aMQuNCA+NDU5+4jLL5pEuFHoue0IznKE2+/GsFvvs8A= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -307,9 +295,9 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= 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.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -327,7 +315,6 @@ github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsC github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -340,16 +327,16 @@ github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 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/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3 h1:iwp+5/UAyzQSFgQ4uR2sni99sJ8Eo9DEacKWM5pekIg= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= 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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -376,6 +363,7 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO 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/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -384,13 +372,8 @@ github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk= -github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= -github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4= -github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/go-ogle-analytics v0.0.0-20161213085824-14b04e0594ef/go.mod h1:PlwhC7q1VSK73InDzdDatVetQrTsQHIbOvcJAZzitY0= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= @@ -401,13 +384,14 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= 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/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I= github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/pgzip v1.2.2 h1:8d4I0LDiieuGngsqlqOih9ker/NS0LX4V0i+EhiFWg0= @@ -422,36 +406,29 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kyoh86/exportloopref v0.1.7 h1:u+iHuTbkbTS2D/JP7fCuZDo/t3rBVGo3Hf58Rc+lQVY= -github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a h1:TpvdAwDAt1K4ANVOfcihouRdvP+MgAfDWwBuct4l6ZY= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 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-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -461,7 +438,6 @@ github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceT github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= 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= @@ -475,19 +451,15 @@ github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lN github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= -github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0 h1:eMV1t2NQRc3r1k3guWiv/zEeqZZP6kPvpUfy6byfL1g= -github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -495,6 +467,7 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7F github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 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.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -503,6 +476,7 @@ github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1ls github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 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.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -533,8 +507,6 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -546,6 +518,7 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9 h1:kyf9snWXHvQc+yxE9imhdI8YAm4oKeZISlaAR+x73zs= github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= @@ -577,31 +550,17 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.2.0 h1:UOVMyH2EKkxIfzrULvA9n/tO+HtEhqD9mrLSWMr5FwU= -github.com/quasilyte/go-ruleguard v0.2.0/go.mod h1:2RT/tf0Ce0UDj5y243iWKosQogJd8+1G3Rs2fxmlYnw= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +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/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU= -github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= -github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.4.0 h1:ivAoWcY5DMs9n04Abc1VkqZBO0FL0h4ShTcVsC53lCE= -github.com/securego/gosec/v2 v2.4.0/go.mod h1:0/Q4cjmlFDfDUj1+Fib61sc+U5IQb2w+Iv9/C3wPVko= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 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.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -613,13 +572,11 @@ github.com/slok/kubewebhook v0.4.0 h1:USgcA77rvKMOf688LtY1RDTKwKbnLgXS4jRKzcjLF9 github.com/slok/kubewebhook v0.4.0/go.mod h1:LXfv4ixuCK4UVPvFFag1Sf/ZeidXugVB2fJpc5udPo8= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sourcegraph/go-diff v0.6.0 h1:WbN9e/jD8ujU+o0vd9IFN5AEwtfB0rn/zM/AANaClqQ= -github.com/sourcegraph/go-diff v0.6.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -627,8 +584,8 @@ github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +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/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -636,14 +593,14 @@ github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= 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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA= -github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= @@ -660,33 +617,16 @@ github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ= -github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tetafro/godot v0.4.8 h1:h61+hQraWhdI6WYqMwAwZYCE5yxL6a9/Orw4REbabSU= -github.com/tetafro/godot v0.4.8/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +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/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As= -github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -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.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= -github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.15.1/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= -github.com/valyala/quicktemplate v1.6.2/go.mod h1:mtEJpQtUiBV0SHhMX6RtiJtqxncgrfmjcUy5T68X8TM= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE= @@ -695,11 +635,15 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v0.0.0-20190816131739-be0936907f66/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 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/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= 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.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -707,19 +651,25 @@ 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 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/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/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 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-20190211182817-74369b46fc67/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-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/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-20190611184440-5c40567a22f8/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg= @@ -727,7 +677,9 @@ golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 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= @@ -744,14 +696,11 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU 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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20181005035420-146acd28ed58/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -760,21 +709,20 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r 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-20190320064053-1272bf9dcd53/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 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/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 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -786,8 +734,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ 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-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-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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= @@ -797,10 +743,12 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h 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-20190209173611-3b5209105503/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-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-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/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= @@ -808,6 +756,7 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -815,7 +764,6 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/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-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -835,54 +783,39 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-20180525024113-a5b4c53f6e8b/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-20181011042414-1f849cf54d09/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-20190110163146-51295c7ec13a/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-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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 h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/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-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/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-20190614205625-5aca471b1d59/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-20190719005602-e377ae9d6386/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-20190910044552-dd2b5c81c578/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-20191012152004-8de300cfc20a/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-20191119224855-298f0cb1881e/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-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200321224714-0d839f3cf2ed/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200519015757-0d0afa43d58a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200701041122-1837592efa10/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0 h1:SQvH+DjrwqD1hyyQU+K7JegHz1KEZgEwt17p9d6R2eg= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= +gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/version v0.1.0/go.mod h1:Y8xuV02mL/45psyPKG3NCVOwvAOy6T5Kx0l3rCjKSjU= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= 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.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -906,13 +839,14 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= 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 h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 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.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -933,11 +867,14 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -960,43 +897,56 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh 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.5 h1:nI5egYTGJakVyOryqLs1cQO5dO0ksin5XXs2pspk75k= -honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b h1:38Nx0U83WjBqn1hUWxlgKc7mvH7WhyHfypxeW3zWwCQ= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.0.0-20191114100352-16d7abae0d2a/go.mod h1:qetVJgs5i8jwdFIdoOZ70ks0ecgU+dYwqZ2uD1srwOU= k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/apiextensions-apiserver v0.0.0-20191114105449-027877536833/go.mod h1:Gb1G2W/kXMizbVTnA9oh2ybQ4cM3COr3r5JDj+DzKGw= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a h1:lDydUqHrbL/1l5ZQrqD1RIlabhmX8aiZEtxVUb+30iU= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.0.0-20191028221656-72ed19daf4bb/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4= k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apiserver v0.0.0-20191114103151-9ca1dc586682/go.mod h1:Idob8Va6/sMX5SmwPLsU0pdvFlkwxuJ5x+fXMG8NbKE= +k8s.io/cli-runtime v0.0.0-20191114110141-0a35778df828/go.mod h1:r9ARs2FUnSgInbeN4+mo9nFzf7oqUtRZ3tcuEcoelR4= k8s.io/client-go v0.0.0-20170217214107-bcde30fb7eae/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7 h1:WyPHgjjXvF4zVVwKGZKKiJGBUW45AuN44uSOuH8euuE= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.0.0-20191114101535-6c5935290e33/go.mod h1:4L/zQOBkEf4pArQJ+CMk1/5xjA30B5oyWv+Bzb44DOw= k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc= k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= +k8s.io/code-generator v0.0.0-20191004115455-8e001e5d1894/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY= +k8s.io/component-base v0.0.0-20191114102325-35a9586014f7/go.mod h1:9rNMvrwbqPF4MxI+VQYETrWqMKxi8yAd8YZLdSJ9EDw= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-aggregator v0.0.0-20191114103820-f023614fb9ea/go.mod h1:LlqyQuTxPHvUzmEgT71Cl/BB86o5+UcbN1LiGgSz94U= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f h1:gi7cb8HTDZ6q8VqsUpkdoFi3vxwHMneQ6+Q5Ap5hjPE= -mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053 h1:Zx4CChonrlcoH6cq3m+pA9OW6j7jyciqLp9dHZnMcXM= +kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053/go.mod h1:z/AkrES60XR+jeKGg5zJyPd13NdG/Di0BptbG1gnS60= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= From d0dd86805563a0e8a1ee1ac809c3fa9c9f57db53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 08:31:47 +0200 Subject: [PATCH 130/251] validate incoming informer objects is of correct type --- .../controller/cabundleinjector/controller.go | 112 ++++++++---------- 1 file changed, 50 insertions(+), 62 deletions(-) diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go index 9fd3435f..d2815846 100644 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ b/pkg/akv2k8s/controller/cabundleinjector/controller.go @@ -107,11 +107,6 @@ type Controller struct { // NewController returns a new AzureKeyVaultSecret controller func NewController(kubeclientset kubernetes.Interface, recorder record.EventRecorder, secretInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer, labelName string, caBundleSecretNamespaceName string, caBundleSecretName string, caBundleConfigMapName string) *Controller { - // // Create event broadcaster - // // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be - // // logged for azure-keyvault-controller types. - // utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) - controller := &Controller{ kubeclientset: kubeclientset, recorder: recorder, @@ -139,83 +134,76 @@ func NewController(kubeclientset kubernetes.Interface, recorder record.EventReco // https://github.com/kubernetes/community/blob/8cafef897a22026d42f5e5bb3f104febe7e29830/contributors/devel/controllers.md secretInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { // When CA Bundle gets added to akv2k8s - secret := obj.(*corev1.Secret) - if secret.Name != caBundleSecretName { - return + if secret, ok := obj.(*corev1.Secret); ok { + if secret.Name != caBundleSecretName { + return + } + log.Infof("Secret '%s' monitored by CA Bundle Injector added. Adding to queue.", secret.Name) + controller.enqueueSecret(obj) } - // lbl := secret.Labels[controller.labelName] - // if lbl == "" { - // return - // } - - log.Infof("Secret '%s' monitored by CA Bundle Injector added. Adding to queue.", secret.Name) - controller.enqueueSecret(obj) }, UpdateFunc: func(old, new interface{}) { // When CA Bundle gets changed in akv2k8s - newSecret := new.(*corev1.Secret) - oldSecret := old.(*corev1.Secret) - - if newSecret.Name != caBundleSecretName { - return + if newSecret, ok := new.(*corev1.Secret); ok { + oldSecret := old.(*corev1.Secret) + + if newSecret.Name != caBundleSecretName { + return + } + + if newSecret.ResourceVersion == oldSecret.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } + log.Infof("Secret '%s' monitored by CA Bundle Injector changed. Handling.", newSecret.Name) + controller.enqueueSecret(new) } - - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } - secret := new.(*corev1.Secret) - log.Infof("Secret '%s' monitored by CA Bundle Injector changed. Handling.", secret.Name) - controller.enqueueSecret(new) }, DeleteFunc: func(obj interface{}) { // When CA Bundle gets deleted in akv2k8s - secret, ok := obj.(*corev1.Secret) - if !ok { - log.Warningf("received deletion alert of secret, but was not a proper secret") - return - } + if secret, ok := obj.(*corev1.Secret); ok { + if secret.Name != caBundleSecretName { + return + } - if secret.Name != caBundleSecretName { - return + log.Infof("Secret '%s' monitored by CA Bundle Injector deleted. Handling.", secret.Name) + controller.enqueueSecret(obj) } - - log.Infof("Secret '%s' monitored by CA Bundle Injector deleted. Handling.", secret.Name) - controller.enqueueSecret(obj) }, }) namespaceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { // When a new namespace gets added, that we should add ConfigMap to - ns := obj.(*corev1.Namespace) - lbl := ns.Labels[controller.labelName] - if lbl == "" { - return + if ns, ok := obj.(*corev1.Namespace); ok { + lbl := ns.Labels[controller.labelName] + if lbl == "" { + return + } + + log.Infof("Namespace '%s' labeled '%s' will be monitored by CA Bundle Injector. Adding to queue.", ns.Name, lbl) + controller.enqueueNewNamespace(obj) } - - log.Infof("Namespace '%s' labeled '%s' will be monitored by CA Bundle Injector. Adding to queue.", ns.Name, lbl) - controller.enqueueNewNamespace(obj) }, UpdateFunc: func(old, new interface{}) { // When an existing namespace gets updated, that potentually have akv2k8s label on it - newNs := new.(*corev1.Namespace) - oldNs := old.(*corev1.Namespace) + if newNs, ok := new.(*corev1.Namespace); ok { + oldNs := old.(*corev1.Namespace) - if newNs.ResourceVersion == oldNs.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } + if newNs.ResourceVersion == oldNs.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } - newLbl := newNs.Labels[controller.labelName] - oldLbl := oldNs.Labels[controller.labelName] - diffLabels := newLbl != oldLbl + newLbl, newLblExist := newNs.Labels[controller.labelName] + oldLbl, oldLblExist := oldNs.Labels[controller.labelName] - if !diffLabels { - return // we only care if the namespace label has changed - } + if newLblExist == oldLblExist && newLbl == oldLbl { + return // we only care if the namespace label has changed + } - ns := new.(*corev1.Namespace) - log.Infof("labels in namespace '%s' changed, handling.", ns.Name) - controller.enqueueChangedNamespace(new) + ns := new.(*corev1.Namespace) + log.Infof("labels in namespace '%s' changed, handling.", ns.Name) + controller.enqueueChangedNamespace(new) + } }, // DeleteFunc: func(obj interface{}) { // ns := obj.(*corev1.Namespace) From 1fad11929d06399f7db3530cac2be0f14557c030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 08:46:46 +0200 Subject: [PATCH 131/251] handle Secret object errors specifically --- .../controller/handler.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 1d08cd50..9332fa7a 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -127,7 +127,7 @@ func (h *Handler) syncSecret(key string) error { var err error if secret, err = h.getSecret(key); err != nil { - if exit := handleKeyVaultError(err, key); exit { + if exit := handleSecretError(err, key); exit { return nil } return err @@ -149,7 +149,7 @@ func (h *Handler) syncSecret(key string) error { key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(azureKeyVaultSecret) if err != nil { - if exit := handleKeyVaultError(err, key); exit { + if exit := handleSecretError(err, key); exit { return nil } return err @@ -358,6 +358,20 @@ func handleKeyVaultError(err error, key string) bool { return false } +func handleSecretError(err error, key string) bool { + log.Debugf("Handling error for '%s' in Secret: %s", key, err.Error()) + if err != nil { + // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. + if errors.IsNotFound(err) { + log.Debugf("Error for '%s' was 'Not Found'", key) + + utilruntime.HandleError(fmt.Errorf("Secret '%s' in work queue no longer exists", key)) + return true + } + } + return false +} + // handleObject will take any resource implementing metav1.Object and attempt // to find the AzureKeyVaultSecret resource that 'owns' it. It does this by looking at the // objects metadata.ownerReferences field for an appropriate OwnerReference. From fe2c57650966c0cb500fbd1293bbce293e0301ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 09:40:49 +0200 Subject: [PATCH 132/251] introduce custom worker for fast/slow handling of akv updated --- .../controller/controller.go | 7 +- .../controller/fastSlowWorker.go | 110 ++++++++++++++++++ 2 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 cmd/azure-keyvault-controller/controller/fastSlowWorker.go diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index f2cd3411..0abd5d17 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -34,8 +34,6 @@ import ( "k8s.io/client-go/tools/cache" "kmodules.xyz/client-go/tools/queue" - // "k8s.io/client-go/util/workqueue" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" @@ -95,7 +93,7 @@ type Controller struct { akvsInformer cache.SharedIndexInformer akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface - akvQueue *queue.Worker //workqueue.RateLimitingInterface + akvQueue *FastSlowWorker //workqueue.RateLimitingInterface } // Options contains options for the controller @@ -125,7 +123,8 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, hand secretInformerFactory: informers.NewFilteredSharedInformerFactory(client, options.ResyncPeriod, options.AkvsRef.Namespace, nil), secretQueue: queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, handler.syncSecret), akvsCrdQueue: queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVaultSecret), - akvQueue: queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), + akvQueue: NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), + // akvQueue: queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), } log.Info("Setting up event handlers") diff --git a/cmd/azure-keyvault-controller/controller/fastSlowWorker.go b/cmd/azure-keyvault-controller/controller/fastSlowWorker.go new file mode 100644 index 00000000..c889189b --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/fastSlowWorker.go @@ -0,0 +1,110 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "time" + + "github.com/appscode/go/runtime" + "github.com/appscode/go/wait" + "github.com/golang/glog" + + "k8s.io/client-go/util/workqueue" +) + +type FastSlowWorker struct { + name string + queue workqueue.RateLimitingInterface + maxRetries int + threadiness int + reconcile func(key string) error +} + +func NewFastSlowWorker(name string, normalFreq time.Duration, slowFreq time.Duration, maxFailSlow int, maxRetries, threadiness int, fn func(key string) error) *FastSlowWorker { + rl := workqueue.NewItemFastSlowRateLimiter(normalFreq, slowFreq, maxFailSlow) + q := workqueue.NewNamedRateLimitingQueue(rl, name) + return &FastSlowWorker{name, q, maxRetries, threadiness, fn} +} + +func (w *FastSlowWorker) GetQueue() workqueue.RateLimitingInterface { + return w.queue +} + +func (w *FastSlowWorker) processQueue() { + for w.processNextEntry() { + } +} + +// ProcessMessage tries to process the next message in the Queue, and requeues on an error +func (w *FastSlowWorker) processNextEntry() bool { + // Wait until there is a new item in the working queue + key, quit := w.queue.Get() + if quit { + return false + } + // Tell the queue that we are done with processing this key. This unblocks the key for other workers + // This allows safe parallel processing because two deployments with the same key are never processed in + // parallel. + defer w.queue.Done(key) + + // Invoke the method containing the business logic + err := w.reconcile(key.(string)) + if err == nil { + // Forget about the #AddRateLimited history of the key on every successful synchronization. + // This ensures that future processing of updates for this key is not delayed because of + // an outdated error history. + w.queue.Forget(key) + return true + } + glog.Errorf("Failed to process key %v. Reason: %s", key, err) + + // This controller retries 5 times if something goes wrong. After that, it stops trying. + if w.queue.NumRequeues(key) < w.maxRetries { + glog.Infof("Error syncing key %v: %v", key, err) + + // Re-enqueue the key rate limited. Based on the rate limiter on the + // queue and the re-enqueue history, the key will be processed later again. + w.queue.AddRateLimited(key) + return true + } + + w.queue.Forget(key) + // Report to an external entity that, even after several retries, we could not successfully process this key + runtime.HandleError(err) + glog.Infof("Dropping key %q out of the queue: %v", key, err) + return true +} + +func (w *FastSlowWorker) Run(shutdown <-chan struct{}) { + defer runtime.HandleCrash() + + // Every second, process all messages in the Queue until it is time to shutdown + for i := 0; i < w.threadiness; i++ { + go wait.Until(w.processQueue, time.Second, shutdown) + } + + go func() { + <-shutdown + + // Stop accepting messages into the Queue + glog.V(1).Infof("Shutting down %s Queue\n", w.name) + w.queue.ShutDown() + }() +} From 8dbbd38d2dc6dbc29106ab1995925ab20de95982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 11:01:15 +0200 Subject: [PATCH 133/251] controller: debug which object in which ns gets accessed --- cmd/azure-keyvault-controller/controller/handler.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 9332fa7a..9588af88 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -97,6 +97,7 @@ func (h *Handler) syncAzureKeyVaultSecret(key string) error { var secret *corev1.Secret var err error + log.Infof("Processing AzureKeyVaultSecret %s", key) if azureKeyVaultSecret, err = h.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil @@ -233,6 +234,7 @@ func (h *Handler) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, return nil, fmt.Errorf("invalid resource key: %s", key) } + log.Debugf("Getting AzureKeyVaultSecret %s from namespace %s", name, namespace) azureKeyVaultSecret, err := h.azureKeyVaultSecretsLister.AzureKeyVaultSecrets(namespace).Get(name) if err != nil { @@ -247,6 +249,7 @@ func (h *Handler) getSecret(key string) (*corev1.Secret, error) { return nil, fmt.Errorf("invalid resource key: %s", key) } + log.Debugf("Getting Secret %s from namespace %s", name, namespace) secret, err := h.secretsLister.Secrets(namespace).Get(name) if err != nil { From 71b1f944e3e353f82f3dd9815c6213064d375a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 12:19:40 +0200 Subject: [PATCH 134/251] bump k8s version --- Makefile | 4 +-- .../controller/controller.go | 8 +++--- .../controller/handler.go | 26 +++++++++---------- cmd/azure-keyvault-controller/main.go | 4 +-- .../client/clientset/versioned/clientset.go | 7 +++++ 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 3d485dbd..09a5a8b3 100644 --- a/Makefile +++ b/Makefile @@ -6,8 +6,8 @@ COMPONENT_VAR=$(PACKAGE)/pkg/akv2k8s.Component GIT_VAR=$(PACKAGE)/pkg/akv2k8s.GitCommit BUILD_DATE_VAR := $(PACKAGE)/pkg/akv2k8s.BuildDate -KUBERNETES_VERSION=v1.15.11 -KUBERNETES_DEP_VERSION=v0.15.11 +KUBERNETES_VERSION=v1.17.2 +KUBERNETES_DEP_VERSION=v0.17.2 WEBHOOK_BINARY_NAME=azure-keyvault-secrets-webhook CONTROLLER_BINARY_NAME=azure-keyvault-controller diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 0abd5d17..2bb4dbd9 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -105,7 +105,7 @@ type Options struct { } // NewController returns a new AzureKeyVaultSecret controller -func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, handler *Handler, azureFrequency AzurePollFrequency, options *Options) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, secretInformerFactory informers.SharedInformerFactory, handler *Handler, azureFrequency AzurePollFrequency, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. @@ -119,8 +119,10 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, hand //workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "AzureKeyVaultSecrets"), //workqueue.NewNamedRateLimitingQueue(workqueue.NewItemFastSlowRateLimiter(azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown), "AzureKeyVault"), - akvsInformerFactory: akvInformers.NewFilteredSharedInformerFactory(akvsClient, options.ResyncPeriod, options.AkvsRef.Namespace, nil), - secretInformerFactory: informers.NewFilteredSharedInformerFactory(client, options.ResyncPeriod, options.AkvsRef.Namespace, nil), + // akvsInformerFactory: akvInformers.NewFilteredSharedInformerFactory(akvsClient, options.ResyncPeriod, options.AkvsRef.Namespace, nil), + // secretInformerFactory: informers.NewFilteredSharedInformerFactory(client, options.ResyncPeriod, options.AkvsRef.Namespace, nil), + akvsInformerFactory: akvInformerFactory, + secretInformerFactory: secretInformerFactory, secretQueue: queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, handler.syncSecret), akvsCrdQueue: queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVaultSecret), akvQueue: NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 9588af88..5f373bc2 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -53,8 +53,8 @@ type Handler struct { // azureKeyvaultClientset is a clientset for our own API group azureKeyvaultClientset clientset.Interface - secretsLister corelisters.SecretLister - azureKeyVaultSecretsLister listers.AzureKeyVaultSecretLister + secretsLister corelisters.SecretLister + azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister // recorder is an event recorder for recording Event resources to the // Kubernetes API. @@ -77,15 +77,15 @@ type AzurePollFrequency struct { } //NewHandler returns a new Handler -func NewHandler(kubeclientset kubernetes.Interface, azureKeyvaultClientset clientset.Interface, secretLister corelisters.SecretLister, azureKeyVaultSecretsLister listers.AzureKeyVaultSecretLister, azureKeyVaultSecretIdentitiesLister listers.AzureKeyVaultSecretIdentityLister, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency) *Handler { +func NewHandler(kubeclientset kubernetes.Interface, azureKeyvaultClientset clientset.Interface, secretLister corelisters.SecretLister, azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency) *Handler { return &Handler{ - kubeclientset: kubeclientset, - azureKeyvaultClientset: azureKeyvaultClientset, - secretsLister: secretLister, - azureKeyVaultSecretsLister: azureKeyVaultSecretsLister, - recorder: recorder, - vaultService: vaultService, - clock: &Clock{}, + kubeclientset: kubeclientset, + azureKeyvaultClientset: azureKeyvaultClientset, + secretsLister: secretLister, + azureKeyVaultSecretLister: azureKeyVaultSecretLister, + recorder: recorder, + vaultService: vaultService, + clock: &Clock{}, } } @@ -142,7 +142,7 @@ func (h *Handler) syncSecret(key string) error { return nil } - azureKeyVaultSecret, err := h.azureKeyVaultSecretsLister.AzureKeyVaultSecrets(secret.GetNamespace()).Get(ownerRef.Name) + azureKeyVaultSecret, err := h.azureKeyVaultSecretLister.AzureKeyVaultSecrets(secret.GetNamespace()).Get(ownerRef.Name) if err != nil { log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", secret.GetSelfLink(), ownerRef.Name) return nil @@ -235,7 +235,7 @@ func (h *Handler) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, } log.Debugf("Getting AzureKeyVaultSecret %s from namespace %s", name, namespace) - azureKeyVaultSecret, err := h.azureKeyVaultSecretsLister.AzureKeyVaultSecrets(namespace).Get(name) + azureKeyVaultSecret, err := h.azureKeyVaultSecretLister.AzureKeyVaultSecrets(namespace).Get(name) if err != nil { return nil, err @@ -404,7 +404,7 @@ func (h *Handler) handleObject(obj interface{}) (*akv.AzureKeyVaultSecret, bool, return nil, true, nil } - azureKeyVaultSecret, err := h.azureKeyVaultSecretsLister.AzureKeyVaultSecrets(object.GetNamespace()).Get(ownerRef.Name) + azureKeyVaultSecret, err := h.azureKeyVaultSecretLister.AzureKeyVaultSecrets(object.GetNamespace()).Get(ownerRef.Name) if err != nil { log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", object.GetSelfLink(), ownerRef.Name) return nil, true, nil diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 379877a2..ff30b4c2 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -152,14 +152,14 @@ func main() { vaultService := vault.NewService(vaultAuth) recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) - handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecretIdentities().Lister(), recorder, vaultService, azurePollFrequency) + handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), recorder, vaultService, azurePollFrequency) options := &controller.Options{ MaxNumRequeues: 5, NumThreads: 1, } - controller := controller.NewController(kubeClient, azureKeyVaultSecretClient, handler, azurePollFrequency, options) + controller := controller.NewController(kubeClient, azureKeyVaultSecretClient, azureKeyVaultSecretInformerFactory, kubeInformerFactory, handler, azurePollFrequency, options) // // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) // // Start method is non-blocking and runs all registered informers in a dedicated goroutine. diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index 59a1df23..d4c390a8 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -22,6 +22,8 @@ limitations under the License. package versioned import ( + "fmt" + azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" @@ -70,9 +72,14 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { } // NewForConfig creates a new Clientset for the given config. +// If config's RateLimiter is not set and QPS and Burst are acceptable, +// NewForConfig will generate a rate-limiter in configShallowCopy. func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + if configShallowCopy.Burst <= 0 { + return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") + } configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) } var cs Clientset From 7e3d77bc18e3fd23538c4438d37e4d4e05d47f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 12:23:03 +0200 Subject: [PATCH 135/251] remove ref to glog --- .../controller/fastSlowWorker.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/fastSlowWorker.go b/cmd/azure-keyvault-controller/controller/fastSlowWorker.go index c889189b..8e60b823 100644 --- a/cmd/azure-keyvault-controller/controller/fastSlowWorker.go +++ b/cmd/azure-keyvault-controller/controller/fastSlowWorker.go @@ -24,7 +24,7 @@ import ( "github.com/appscode/go/runtime" "github.com/appscode/go/wait" - "github.com/golang/glog" + log "github.com/sirupsen/logrus" "k8s.io/client-go/util/workqueue" ) @@ -73,11 +73,11 @@ func (w *FastSlowWorker) processNextEntry() bool { w.queue.Forget(key) return true } - glog.Errorf("Failed to process key %v. Reason: %s", key, err) + log.Errorf("Failed to process key %v. Reason: %s", key, err) // This controller retries 5 times if something goes wrong. After that, it stops trying. if w.queue.NumRequeues(key) < w.maxRetries { - glog.Infof("Error syncing key %v: %v", key, err) + log.Infof("Error syncing key %v: %v", key, err) // Re-enqueue the key rate limited. Based on the rate limiter on the // queue and the re-enqueue history, the key will be processed later again. @@ -88,7 +88,7 @@ func (w *FastSlowWorker) processNextEntry() bool { w.queue.Forget(key) // Report to an external entity that, even after several retries, we could not successfully process this key runtime.HandleError(err) - glog.Infof("Dropping key %q out of the queue: %v", key, err) + log.Infof("Dropping key %q out of the queue: %v", key, err) return true } @@ -104,7 +104,7 @@ func (w *FastSlowWorker) Run(shutdown <-chan struct{}) { <-shutdown // Stop accepting messages into the Queue - glog.V(1).Infof("Shutting down %s Queue\n", w.name) + log.Infof("Shutting down %s Queue\n", w.name) w.queue.ShutDown() }() } From 2cdb70daaf91d8b3669830041232d6ee2c3bb07f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 15:04:58 +0200 Subject: [PATCH 136/251] remove old controller code --- .../controller/controller.go | 194 +++--------------- .../controller/handler.go | 2 + 2 files changed, 35 insertions(+), 161 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 2bb4dbd9..f0001e3d 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -112,21 +112,12 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) controller := &Controller{ - handler: handler, - // secretsSynced: secretInformer.Informer().HasSynced, - // azureKeyVaultSecretsSynced: azureKeyVaultSecretsInformer.Informer().HasSynced, - - //workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "AzureKeyVaultSecrets"), - //workqueue.NewNamedRateLimitingQueue(workqueue.NewItemFastSlowRateLimiter(azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown), "AzureKeyVault"), - - // akvsInformerFactory: akvInformers.NewFilteredSharedInformerFactory(akvsClient, options.ResyncPeriod, options.AkvsRef.Namespace, nil), - // secretInformerFactory: informers.NewFilteredSharedInformerFactory(client, options.ResyncPeriod, options.AkvsRef.Namespace, nil), + handler: handler, akvsInformerFactory: akvInformerFactory, secretInformerFactory: secretInformerFactory, secretQueue: queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, handler.syncSecret), akvsCrdQueue: queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVaultSecret), akvQueue: NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), - // akvQueue: queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), } log.Info("Setting up event handlers") @@ -148,8 +139,6 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI log.Debugf("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name) queue.Enqueue(controller.akvsCrdQueue.GetQueue(), obj) queue.Enqueue(controller.akvQueue.GetQueue(), obj) - // controller.enqueueAzureKeyVaultSecret(obj) - // controller.enqueueAzurePoll(obj) } }, UpdateFunc: func(old, new interface{}) { @@ -160,15 +149,12 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI } if newSecret.ResourceVersion == oldSecret.ResourceVersion { log.Debugf("AzureKeyVaultSecret '%s' added to Azure queue to check if changed in Azure.", newSecret.Name) - // Check if secret has changed in Azure queue.Enqueue(controller.akvQueue.GetQueue(), new) - // controller.enqueueAzurePoll(new) return } log.Debugf("AzureKeyVaultSecret '%s' changed. Adding to queue.", newSecret.Name) queue.Enqueue(controller.akvsCrdQueue.GetQueue(), new) - // controller.enqueueAzureKeyVaultSecret(new) } }, DeleteFunc: func(obj interface{}) { @@ -177,8 +163,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI return } log.Debugf("AzureKeyVaultSecret '%s' deleted. Adding to delete queue.", secret.Name) - queue.Enqueue(controller.akvsCrdQueue.GetQueue(), obj) - // controller.enqueueDeleteAzureKeyVaultSecret(obj) + controller.enqueueDeleteAzureKeyVaultSecret(obj) } }, }) @@ -193,8 +178,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI AddFunc: func(obj interface{}) { if secret, ok := obj.(*corev1.Secret); ok { log.Debugf("Secret '%s' added. Handling.", secret.Name) - queue.Enqueue(controller.secretQueue.GetQueue(), obj) - // controller.enqueueObject(obj) + controller.enqueueObject(obj) } }, UpdateFunc: func(old, new interface{}) { @@ -208,15 +192,13 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI } secret := new.(*corev1.Secret) log.Debugf("Secret '%s' controlled by AzureKeyVaultSecret changed. Handling.", secret.Name) - queue.Enqueue(controller.secretQueue.GetQueue(), new) - // controller.enqueueObject(new) + controller.enqueueObject(new) } }, DeleteFunc: func(obj interface{}) { if secret, ok := obj.(*corev1.Secret); ok { log.Debugf("Secret '%s' deleted. Handling.", secret.Name) - queue.Enqueue(controller.secretQueue.GetQueue(), obj) - // controller.enqueueObject(obj) + controller.enqueueObject(obj) } }, }) @@ -230,8 +212,6 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI // workers to finish processing their current work items. func (c *Controller) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() - // defer c.workqueue.ShutDown() - // defer c.workqueueAzure.ShutDown() // Start the informer factories to begin populating the informer caches log.Info("Starting AzureKeyVaultSecret controller") @@ -256,144 +236,36 @@ func (c *Controller) Run(stopCh <-chan struct{}) { c.secretQueue.Run(stopCh) c.akvQueue.Run(stopCh) - // // Wait for the caches to be synced before starting workers - // log.Info("Waiting for informer caches to sync") - // if ok := cache.WaitForCacheSync(stopCh, c.secretsSynced, c.azureKeyVaultSecretsSynced); !ok { - // return fmt.Errorf("failed to wait for caches to sync") - // } - - // log.Info("Starting workers") - // // Launch two workers to process AzureKeyVaultSecret resources - // for i := 0; i < threadiness; i++ { - // go wait.Until(c.runWorker, time.Second, stopCh) - // go wait.Until(c.runAzureWorker, time.Second, stopCh) - // } - log.Info("Started workers") <-stopCh log.Info("Shutting down workers") } -// // runWorker is a long-running function that will continually call the -// // processNextWorkItem function in order to read and process a message on the -// // workqueue. -// func (c *Controller) runWorker() { -// for c.processNextWorkItem(c.workqueue, false) { -// } -// } - -// func (c *Controller) runAzureWorker() { -// for c.processNextWorkItem(c.workqueueAzure, true) { -// } -// } - -// // processNextWorkItem will read a single work item off the workqueue and -// // attempt to process it, by calling the syncHandler. -// func (c *Controller) processNextWorkItem(queue workqueue.RateLimitingInterface, syncAzure bool) bool { -// log.Debug("Processing next work item in queue...") -// obj, shutdown := queue.Get() - -// if shutdown { -// return false -// } - -// // We wrap this block in a func so we can defer c.workqueue.Done. -// err := func(obj interface{}) error { -// defer queue.Done(obj) -// var key string -// var ok bool -// var successMsg string - -// if key, ok = obj.(string); !ok { -// queue.Forget(obj) -// utilruntime.HandleError(fmt.Errorf("expected string in workqueue but got %#v", obj)) -// return nil -// } - -// var err error -// if syncAzure { -// log.Debugf("Handling '%s' in Azure queue...", key) -// successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Azure Key Vault" -// err = c.handler.azureSyncHandler(key) -// } else { -// log.Debugf("Handling '%s' in default queue...", key) -// successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Kubernetes Secret" -// err = c.handler.kubernetesSyncHandler(key) -// } - -// if err != nil { -// queue.AddRateLimited(key) -// return fmt.Errorf("error syncing '%s': %s, requeuing", key, err.Error()) -// } - -// queue.Forget(obj) -// log.Infof(successMsg, key) -// return nil -// }(obj) - -// if err != nil { -// log.Error(err) -// return true -// } - -// return true -// } - -// func (c *Controller) enqueueObject(obj interface{}) { -// azureKeyVaultSecret, ignore, err := c.handler.handleObject(obj) - -// if err != nil { -// utilruntime.HandleError(err) -// } - -// if !ignore { -// c.enqueueAzureKeyVaultSecret(azureKeyVaultSecret) -// } -// } - -// // enqueueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// // string which is then put onto the work queue. This method should *not* be -// // passed resources of any type other than AzureKeyVaultSecret. -// func (c *Controller) enqueueAzureKeyVaultSecret(obj interface{}) { -// var key string -// var err error -// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { -// utilruntime.HandleError(err) -// return -// } -// c.akvsCrdQueue.AddRateLimited(key) -// } - -// // enqueueAzurePoll takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// // string which is then put onto the work queue. This method should *not* be -// // passed resources of any type other than AzureKeyVaultSecret. -// func (c *Controller) enqueueAzurePoll(obj interface{}) { -// var key string -// var err error -// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { -// utilruntime.HandleError(err) -// return -// } -// c.akvQueue.AddRateLimited(key) -// } - -// // dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// // string which is then put onto the work queue for deltion. This method should *not* be -// // passed resources of any type other than AzureKeyVaultSecret. -// func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { -// var key string -// var err error - -// if key, err = cache.DeletionHandlingMetaNamespaceKeyFunc(obj); err != nil { -// utilruntime.HandleError(err) -// return -// } -// c.akvsCrdQueue.AddRateLimited(key) - -// // Getting default key to remove from Azure work queue -// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { -// utilruntime.HandleError(err) -// return -// } -// c.akvQueue.Forget(key) -// } +func (c *Controller) enqueueObject(obj interface{}) { + azureKeyVaultSecret, ignore, err := c.handler.handleObject(obj) + + if err != nil { + utilruntime.HandleError(err) + } + + if !ignore { + queue.Enqueue(c.akvsCrdQueue.GetQueue(), azureKeyVaultSecret) + } +} + +// dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name +// string which is then put onto the work queue for deltion. This method should *not* be +// passed resources of any type other than AzureKeyVaultSecret. +func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { + var key string + var err error + + queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) + + // Getting default key to remove from Azure work queue + if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { + utilruntime.HandleError(err) + return + } + c.akvQueue.GetQueue().Forget(key) +} diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 5f373bc2..75414923 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -116,6 +116,7 @@ func (h *Handler) syncAzureKeyVaultSecret(key string) error { return fmt.Errorf(msg) } + log.Infof("Successfully synced AzureKeyVaultSecret %s", key) h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) return nil } @@ -203,6 +204,7 @@ func (h *Handler) syncAzureKeyVault(key string) error { return err } + log.Infof("Successfully synced AzureKeyVaultSecret %s with Azure Key Vault", key) return nil } From 53a276393a2119ca0ac802216d4950643290c3c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 15:23:39 +0200 Subject: [PATCH 137/251] controller: improve info logging --- cmd/azure-keyvault-controller/controller/handler.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go index 75414923..e92c8318 100644 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ b/cmd/azure-keyvault-controller/controller/handler.go @@ -116,7 +116,7 @@ func (h *Handler) syncAzureKeyVaultSecret(key string) error { return fmt.Errorf(msg) } - log.Infof("Successfully synced AzureKeyVaultSecret %s", key) + log.Infof("Successfully synced AzureKeyVaultSecret %s with Kubernetes Secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) return nil } @@ -157,8 +157,10 @@ func (h *Handler) syncSecret(key string) error { return err } - h.syncAzureKeyVaultSecret(key) + return h.syncAzureKeyVaultSecret(key) } + + log.Infof("Successfully synced Secret %s", key) return nil } From b6e3081889e57ce2e940a513fb2037830838c6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 15:33:01 +0200 Subject: [PATCH 138/251] controller: start informer factories --- cmd/azure-keyvault-controller/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index ff30b4c2..9e6aa744 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -163,8 +163,8 @@ func main() { // // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) // // Start method is non-blocking and runs all registered informers in a dedicated goroutine. - // kubeInformerFactory.Start(stopCh) - // azureKeyVaultSecretInformerFactory.Start(stopCh) + kubeInformerFactory.Start(stopCh) + azureKeyVaultSecretInformerFactory.Start(stopCh) controller.Run(stopCh) } From c6f72570bd4d7094770a17a7c49042464ad157e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 15:58:18 +0200 Subject: [PATCH 139/251] controller: use native informer for akvs --- .../controller/controller.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index f0001e3d..ae73b85b 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -38,7 +38,6 @@ import ( akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" - akvInformersv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" ) const ( @@ -122,15 +121,15 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI log.Info("Setting up event handlers") // Set up an event handler for when AzureKeyVaultSecret resources change - akvsInformer := controller.akvsInformerFactory.InformerFor(&akv.AzureKeyVaultSecret{}, func(client akvcs.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return akvInformersv2alpha1.NewAzureKeyVaultSecretInformer( - akvsClient, - options.AkvsRef.Namespace, - resyncPeriod, - cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - ) - }) - akvsInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ + // akvsInformer := controller.akvsInformerFactory.Azurekeyvault().V1alpha1().AzureKeyVaultSecrets().Informer() //.InformerFor(&akv.AzureKeyVaultSecret{}, func(client akvcs.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + // return akvInformersv2alpha1.NewAzureKeyVaultSecretInformer( + // akvsClient, + // options.AkvsRef.Namespace, + // resyncPeriod, + // cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, + // ) + // }) + controller.akvsInformerFactory.Azurekeyvault().V1alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { if secret.Spec.Output.Secret.Name == "" { From 0597426f5b4bbe8927072d67143051b763210ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 15:59:39 +0200 Subject: [PATCH 140/251] controller: remove start informer factories in main, as they are started in controller --- cmd/azure-keyvault-controller/main.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 9e6aa744..e30b995c 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -161,11 +161,6 @@ func main() { controller := controller.NewController(kubeClient, azureKeyVaultSecretClient, azureKeyVaultSecretInformerFactory, kubeInformerFactory, handler, azurePollFrequency, options) - // // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) - // // Start method is non-blocking and runs all registered informers in a dedicated goroutine. - kubeInformerFactory.Start(stopCh) - azureKeyVaultSecretInformerFactory.Start(stopCh) - controller.Run(stopCh) } From 84b422fbe2fd4faabd61ece8ea8b9da0b8c0b820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 16:21:32 +0200 Subject: [PATCH 141/251] controller: use correct api version, v2alpha1, not v1alpha1 --- cmd/azure-keyvault-controller/controller/controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index ae73b85b..f9530df9 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -129,7 +129,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI // cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, // ) // }) - controller.akvsInformerFactory.Azurekeyvault().V1alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + controller.akvsInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { if secret.Spec.Output.Secret.Name == "" { From bb150c2d1b95d19cb2df11abae120fcf0854f1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 23:19:18 +0200 Subject: [PATCH 142/251] controlleer: remove queue for secret, as this is handled through azure key vault secret queue --- cmd/azure-keyvault-controller/controller/controller.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index f9530df9..361543af 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -87,7 +87,7 @@ type Controller struct { akvsInformerFactory akvInformers.SharedInformerFactory secretInformer cache.SharedIndexInformer - secretQueue *queue.Worker + // secretQueue *queue.Worker akvsInformer cache.SharedIndexInformer akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface @@ -114,9 +114,9 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI handler: handler, akvsInformerFactory: akvInformerFactory, secretInformerFactory: secretInformerFactory, - secretQueue: queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, handler.syncSecret), - akvsCrdQueue: queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVaultSecret), - akvQueue: NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), + // secretQueue: queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, handler.syncSecret), + akvsCrdQueue: queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVaultSecret), + akvQueue: NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), } log.Info("Setting up event handlers") @@ -232,7 +232,7 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } c.akvQueue.Run(stopCh) - c.secretQueue.Run(stopCh) + // c.secretQueue.Run(stopCh) c.akvQueue.Run(stopCh) log.Info("Started workers") From 6abcde6341391e2ffa887811f07cff448ae9acfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 23:42:46 +0200 Subject: [PATCH 143/251] controlleer: log to info every time we add to a queue --- .../controller/controller.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 361543af..e201488a 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -135,7 +135,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI if secret.Spec.Output.Secret.Name == "" { return } - log.Debugf("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name) + log.Infof("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name) queue.Enqueue(controller.akvsCrdQueue.GetQueue(), obj) queue.Enqueue(controller.akvQueue.GetQueue(), obj) } @@ -152,7 +152,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI return } - log.Debugf("AzureKeyVaultSecret '%s' changed. Adding to queue.", newSecret.Name) + log.Infof("AzureKeyVaultSecret '%s' changed. Adding to queue.", newSecret.Name) queue.Enqueue(controller.akvsCrdQueue.GetQueue(), new) } }, @@ -161,7 +161,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI if secret.Spec.Output.Secret.Name == "" { return } - log.Debugf("AzureKeyVaultSecret '%s' deleted. Adding to delete queue.", secret.Name) + log.Infof("AzureKeyVaultSecret '%s' deleted. Adding to delete queue.", secret.Name) controller.enqueueDeleteAzureKeyVaultSecret(obj) } }, @@ -176,7 +176,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI controller.secretInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { if secret, ok := obj.(*corev1.Secret); ok { - log.Debugf("Secret '%s' added. Handling.", secret.Name) + log.Infof("Secret '%s' added. Handling.", secret.Name) controller.enqueueObject(obj) } }, @@ -190,13 +190,13 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI return } secret := new.(*corev1.Secret) - log.Debugf("Secret '%s' controlled by AzureKeyVaultSecret changed. Handling.", secret.Name) + log.Infof("Secret '%s' controlled by AzureKeyVaultSecret changed. Handling.", secret.Name) controller.enqueueObject(new) } }, DeleteFunc: func(obj interface{}) { if secret, ok := obj.(*corev1.Secret); ok { - log.Debugf("Secret '%s' deleted. Handling.", secret.Name) + log.Infof("Secret '%s' deleted. Handling.", secret.Name) controller.enqueueObject(obj) } }, From fa1a8ebac9bb5a4543262c5aa0ff692de76b21c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 30 Sep 2020 23:51:59 +0200 Subject: [PATCH 144/251] controlleer: do not add to key vault queue when new key vault secrets gets added - only to key vault secret queue --- cmd/azure-keyvault-controller/controller/controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index e201488a..2e582404 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -137,7 +137,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI } log.Infof("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name) queue.Enqueue(controller.akvsCrdQueue.GetQueue(), obj) - queue.Enqueue(controller.akvQueue.GetQueue(), obj) + // queue.Enqueue(controller.akvQueue.GetQueue(), obj) } }, UpdateFunc: func(old, new interface{}) { From a1c03ff02a92ba1754df37a7d57d57ad29cc3777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 1 Oct 2020 00:07:56 +0200 Subject: [PATCH 145/251] controller: start akv secret queue (was not being started) --- cmd/azure-keyvault-controller/controller/controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 2e582404..582a3830 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -232,8 +232,8 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } c.akvQueue.Run(stopCh) + c.akvsCrdQueue.Run(stopCh) // c.secretQueue.Run(stopCh) - c.akvQueue.Run(stopCh) log.Info("Started workers") <-stopCh From 55a58c0b7d016b4ff8b3c230f9a8ffddc1977dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 1 Oct 2020 02:02:19 +0200 Subject: [PATCH 146/251] controller: refactor out handler --- .../controller/azureKeyVaultSecret.go | 251 +++++++++ .../controller/controller.go | 183 ++----- .../controller/handler.go | 485 ------------------ .../controller/secret.go | 267 ++++++++++ cmd/azure-keyvault-controller/main.go | 12 +- 5 files changed, 573 insertions(+), 625 deletions(-) create mode 100644 cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go delete mode 100644 cmd/azure-keyvault-controller/controller/handler.go create mode 100644 cmd/azure-keyvault-controller/controller/secret.go diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go new file mode 100644 index 00000000..e7bfa738 --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -0,0 +1,251 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "fmt" + + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + log "github.com/sirupsen/logrus" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/tools/cache" + + "kmodules.xyz/client-go/tools/queue" +) + +func (c *Controller) initAzureKeyVaultSecret() { + c.akvsInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { + if secret.Spec.Output.Secret.Name == "" { + return + } + log.Debugf("AzureKeyVaultSecret %s/%s added. Adding to queue.", secret.Namespace, secret.Name) + queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) + queue.Enqueue(c.akvQueue.GetQueue(), obj) + } + }, + UpdateFunc: func(old, new interface{}) { + if newSecret, ok := new.(*akv.AzureKeyVaultSecret); ok { + oldSecret := old.(*akv.AzureKeyVaultSecret) + if oldSecret.Spec.Output.Secret.Name == "" { + return + } + if newSecret.ResourceVersion == oldSecret.ResourceVersion { + log.Debugf("AzureKeyVaultSecret %s/%s changed and diffs in resource version. Adding to Azure Key Vault queue.", newSecret.Namespace, newSecret.Name) + queue.Enqueue(c.akvQueue.GetQueue(), new) + return + } + + log.Debugf("AzureKeyVaultSecret %s/%s changed. Adding to queue.", newSecret.Namespace, newSecret.Name) + queue.Enqueue(c.akvsCrdQueue.GetQueue(), new) + } + }, + DeleteFunc: func(obj interface{}) { + if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { + if secret.Spec.Output.Secret.Name == "" { + return + } + log.Debugf("AzureKeyVaultSecret %s/%s deleted. Adding to delete queue.", secret.Namespace, secret.Name) + c.enqueueDeleteAzureKeyVaultSecret(obj) + } + }, + }) +} + +func (c *Controller) syncAzureKeyVaultSecret(key string) error { + var azureKeyVaultSecret *akv.AzureKeyVaultSecret + var secret *corev1.Secret + var err error + + log.Infof("Processing AzureKeyVaultSecret %s", key) + if azureKeyVaultSecret, err = c.getAzureKeyVaultSecret(key); err != nil { + if exit := handleKeyVaultError(err, key); exit { + return nil + } + return err + } + + if secret, err = c.getOrCreateKubernetesSecret(azureKeyVaultSecret); err != nil { + return err + } + + if !metav1.IsControlledBy(secret, azureKeyVaultSecret) { // checks if the object has a controllerRef set to the given owner + msg := fmt.Sprintf(MessageResourceExists, secret.Name) + log.Warning(msg) + c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrResourceExists, msg) + return fmt.Errorf(msg) + } + + log.Infof("Successfully synced AzureKeyVaultSecret %s with Kubernetes Secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) + c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) + return nil +} + +func (c *Controller) syncAzureKeyVault(key string) error { + var azureKeyVaultSecret *akv.AzureKeyVaultSecret + var secret *corev1.Secret + var secretValue map[string][]byte + var err error + + log.Debugf("Checking state for %s in Azure", key) + if azureKeyVaultSecret, err = c.getAzureKeyVaultSecret(key); err != nil { + if exit := handleKeyVaultError(err, key); exit { + return nil + } + return err + } + + log.Debugf("Getting secret value for %s in Azure", key) + if secretValue, err = c.getSecretFromKeyVault(azureKeyVaultSecret); err != nil { + msg := fmt.Sprintf(FailedAzureKeyVault, azureKeyVaultSecret.Name, azureKeyVaultSecret.Spec.Vault.Name) + log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, azureKeyVaultSecret.Spec.Vault.Name, azureKeyVaultSecret.Spec.Vault.Object.Name, err) + c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrAzureVault, msg) + return fmt.Errorf(msg) + } + + secretHash := getMD5Hash(secretValue) + + log.Debugf("Checking if secret value for %s has changed in Azure", key) + if azureKeyVaultSecret.Status.SecretHash != secretHash { + log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", azureKeyVaultSecret.Name) + + if secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secretValue)); err != nil { + log.Warningf("Failed to create Secret, Error: %+v", err) + return err + } + + log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secrets must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) + c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSyncedWithAzure) + } + + log.Debugf("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) + if err = c.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, secretHash); err != nil { + return err + } + + log.Infof("Successfully synced AzureKeyVaultSecret %s with Azure Key Vault", key) + return nil +} + +func (c *Controller) getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string][]byte, error) { + var secretHandler KubernetesSecretHandler + + switch azureKeyVaultSecret.Spec.Vault.Object.Type { + case akv.AzureKeyVaultObjectTypeSecret: + transformator, err := transformers.CreateTransformator(&azureKeyVaultSecret.Spec.Output) + if err != nil { + return nil, err + } + secretHandler = NewAzureSecretHandler(azureKeyVaultSecret, c.vaultService, *transformator) + case akv.AzureKeyVaultObjectTypeCertificate: + secretHandler = NewAzureCertificateHandler(azureKeyVaultSecret, c.vaultService) + case akv.AzureKeyVaultObjectTypeKey: + secretHandler = NewAzureKeyHandler(azureKeyVaultSecret, c.vaultService) + case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret: + secretHandler = NewAzureMultiKeySecretHandler(azureKeyVaultSecret, c.vaultService) + default: + return nil, fmt.Errorf("azure key vault object type '%s' not currently supported", azureKeyVaultSecret.Spec.Vault.Object.Type) + } + return secretHandler.Handle() +} + +func (c *Controller) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, error) { + namespace, name, err := cache.SplitMetaNamespaceKey(key) + if err != nil { + return nil, fmt.Errorf("invalid resource key: %s", key) + } + + log.Debugf("Getting AzureKeyVaultSecret %s from namespace %s", name, namespace) + azureKeyVaultSecret, err := c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(namespace).Get(name) + + if err != nil { + return nil, err + } + return azureKeyVaultSecret, err +} + +func hasAzureKeyVaultSecretChanged(vaultSecret *akv.AzureKeyVaultSecret, secret *corev1.Secret) bool { + secretType := determineSecretType(vaultSecret) + if secretType != secret.Type { + return true + } + + // Check if dataKey has changed by trying to lookup key + if vaultSecret.Spec.Output.Secret.DataKey != "" { + if _, ok := secret.Data[vaultSecret.Spec.Output.Secret.DataKey]; !ok { + return true + } + } + return false +} + +func (c *Controller) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.AzureKeyVaultSecret, secretHash string) error { + secretName := determineSecretName(azureKeyVaultSecret) + + // NEVER modify objects from the store. It's a read-only, local cache. + // You can use DeepCopy() to make a deep copy of original object and modify this copy + // Or create a copy manually for better performance + + azureKeyVaultSecretCopy := azureKeyVaultSecret.DeepCopy() + azureKeyVaultSecretCopy.Status.SecretHash = secretHash + azureKeyVaultSecretCopy.Status.LastAzureUpdate = c.clock.Now() + azureKeyVaultSecretCopy.Status.SecretName = secretName + + // If the CustomResourceSubresources feature gate is not enabled, + // we must use Update instead of UpdateStatus to update the Status block of the AzureKeyVaultSecret resource. + // UpdateStatus will not allow changes to the Spec of the resource, + // which is ideal for ensuring nothing other than resource status has been updated. + _, err := c.akvsClient.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy) + return err +} + +func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { + var key string + var err error + + queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) + + // Getting default key to remove from Azure work queue + if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { + utilruntime.HandleError(err) + return + } + c.akvQueue.GetQueue().Forget(key) +} + +func handleKeyVaultError(err error, key string) bool { + log.Debugf("Handling error for '%s' in AzureKeyVaultSecret: %s", key, err.Error()) + if err != nil { + // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. + if errors.IsNotFound(err) { + log.Debugf("Error for '%s' was 'Not Found'", key) + + utilruntime.HandleError(fmt.Errorf("AzureKeyVaultSecret '%s' in work queue no longer exists", key)) + return true + } + } + return false +} diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 582a3830..359aa87e 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -31,13 +31,15 @@ import ( "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/tools/cache" + corelisters "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/record" "kmodules.xyz/client-go/tools/queue" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" + listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" ) const ( @@ -71,28 +73,21 @@ const ( // Controller is the controller implementation for AzureKeyVaultSecret resources type Controller struct { - // Handler process work on workqueues - handler *Handler + kubeclientset kubernetes.Interface + akvsClient akvcs.Interface + vaultService vault.Service + recorder record.EventRecorder - // secretsSynced cache.InformerSynced - // azureKeyVaultSecretsSynced cache.InformerSynced - - // workqueue is a rate limited work queue. This is used to queue work to be - // processed instead of performing it as soon as a change happens. This - // means we can ensure we only process a fixed amount of resources at a - // time, and makes it easy to ensure we are never processing the same item - // simultaneously in two different workers. + secretsLister corelisters.SecretLister + azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister secretInformerFactory informers.SharedInformerFactory akvsInformerFactory akvInformers.SharedInformerFactory - secretInformer cache.SharedIndexInformer - // secretQueue *queue.Worker - - akvsInformer cache.SharedIndexInformer - akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface + akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface + akvQueue *FastSlowWorker //workqueue.RateLimitingInterface - akvQueue *FastSlowWorker //workqueue.RateLimitingInterface + clock Timer } // Options contains options for the controller @@ -103,112 +98,51 @@ type Options struct { AkvsRef corev1.ObjectReference } +// AzurePollFrequency controls time durations to wait between polls to Azure Key Vault for changes +type AzurePollFrequency struct { + // Normal is the time duration to wait between polls to Azure Key Vault for changes + Normal time.Duration + + // MaxFailuresBeforeSlowingDown controls how many failures are accepted before reducing the frequency to Slow + MaxFailuresBeforeSlowingDown int + + // Slow is the time duration to wait between polls to Azure Key Vault for changes, after MaxFailuresBeforeSlowingDown is reached + Slow time.Duration +} + // NewController returns a new AzureKeyVaultSecret controller -func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, secretInformerFactory informers.SharedInformerFactory, handler *Handler, azureFrequency AzurePollFrequency, options *Options) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, secretInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) controller := &Controller{ - handler: handler, + kubeclientset: client, + akvsClient: akvsClient, + recorder: recorder, + vaultService: vaultService, + akvsInformerFactory: akvInformerFactory, secretInformerFactory: secretInformerFactory, - // secretQueue: queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, handler.syncSecret), - akvsCrdQueue: queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVaultSecret), - akvQueue: NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, handler.syncAzureKeyVault), + + secretsLister: secretInformerFactory.Core().V1().Secrets().Lister(), + azureKeyVaultSecretLister: akvInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), + + clock: &Clock{}, } + controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) + controller.akvQueue = NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) + log.Info("Setting up event handlers") - // Set up an event handler for when AzureKeyVaultSecret resources change - // akvsInformer := controller.akvsInformerFactory.Azurekeyvault().V1alpha1().AzureKeyVaultSecrets().Informer() //.InformerFor(&akv.AzureKeyVaultSecret{}, func(client akvcs.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - // return akvInformersv2alpha1.NewAzureKeyVaultSecretInformer( - // akvsClient, - // options.AkvsRef.Namespace, - // resyncPeriod, - // cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, - // ) - // }) - controller.akvsInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { - if secret.Spec.Output.Secret.Name == "" { - return - } - log.Infof("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name) - queue.Enqueue(controller.akvsCrdQueue.GetQueue(), obj) - // queue.Enqueue(controller.akvQueue.GetQueue(), obj) - } - }, - UpdateFunc: func(old, new interface{}) { - if newSecret, ok := new.(*akv.AzureKeyVaultSecret); ok { - oldSecret := old.(*akv.AzureKeyVaultSecret) - if oldSecret.Spec.Output.Secret.Name == "" { - return - } - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - log.Debugf("AzureKeyVaultSecret '%s' added to Azure queue to check if changed in Azure.", newSecret.Name) - queue.Enqueue(controller.akvQueue.GetQueue(), new) - return - } - - log.Infof("AzureKeyVaultSecret '%s' changed. Adding to queue.", newSecret.Name) - queue.Enqueue(controller.akvsCrdQueue.GetQueue(), new) - } - }, - DeleteFunc: func(obj interface{}) { - if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { - if secret.Spec.Output.Secret.Name == "" { - return - } - log.Infof("AzureKeyVaultSecret '%s' deleted. Adding to delete queue.", secret.Name) - controller.enqueueDeleteAzureKeyVaultSecret(obj) - } - }, - }) - - // Set up an event handler for when Secret resources change. This - // handler will lookup the owner of the given Secret, and if it is - // owned by a AzureKeyVaultSecret resource will enqueue that Secret resource for - // processing. This way, we don't need to implement custom logic for - // handling AzureKeyVaultSecret resources. More info on this pattern: - // https://github.com/kubernetes/community/blob/8cafef897a22026d42f5e5bb3f104febe7e29830/contributors/devel/controllers.md - controller.secretInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - if secret, ok := obj.(*corev1.Secret); ok { - log.Infof("Secret '%s' added. Handling.", secret.Name) - controller.enqueueObject(obj) - } - }, - UpdateFunc: func(old, new interface{}) { - if newSecret, ok := new.(*corev1.Secret); ok { - oldSecret := old.(*corev1.Secret) - - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } - secret := new.(*corev1.Secret) - log.Infof("Secret '%s' controlled by AzureKeyVaultSecret changed. Handling.", secret.Name) - controller.enqueueObject(new) - } - }, - DeleteFunc: func(obj interface{}) { - if secret, ok := obj.(*corev1.Secret); ok { - log.Infof("Secret '%s' deleted. Handling.", secret.Name) - controller.enqueueObject(obj) - } - }, - }) + controller.initAzureKeyVaultSecret() + controller.initSecret() return controller } -// Run will set up the event handlers for types we are interested in, as well -// as syncing informer caches and starting workers. It will block until stopCh -// is closed, at which point it will shutdown the workqueue and wait for -// workers to finish processing their current work items. +// Run will start the controller func (c *Controller) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() @@ -231,40 +165,13 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } } + log.Debug("Starting Azure Key Vault queue") c.akvQueue.Run(stopCh) + + log.Debug("Starting Azure Key Vault Secret queue") c.akvsCrdQueue.Run(stopCh) - // c.secretQueue.Run(stopCh) log.Info("Started workers") <-stopCh log.Info("Shutting down workers") } - -func (c *Controller) enqueueObject(obj interface{}) { - azureKeyVaultSecret, ignore, err := c.handler.handleObject(obj) - - if err != nil { - utilruntime.HandleError(err) - } - - if !ignore { - queue.Enqueue(c.akvsCrdQueue.GetQueue(), azureKeyVaultSecret) - } -} - -// dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// string which is then put onto the work queue for deltion. This method should *not* be -// passed resources of any type other than AzureKeyVaultSecret. -func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { - var key string - var err error - - queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) - - // Getting default key to remove from Azure work queue - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.akvQueue.GetQueue().Forget(key) -} diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go deleted file mode 100644 index e92c8318..00000000 --- a/cmd/azure-keyvault-controller/controller/handler.go +++ /dev/null @@ -1,485 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "fmt" - "sort" - "time" - - log "github.com/sirupsen/logrus" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/client-go/kubernetes" - corelisters "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/tools/cache" - "k8s.io/client-go/tools/record" - - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" -) - -// Handler process work on workqueues -type Handler struct { - // kubeclientset is a standard kubernetes clientset - kubeclientset kubernetes.Interface - // azureKeyvaultClientset is a clientset for our own API group - azureKeyvaultClientset clientset.Interface - - secretsLister corelisters.SecretLister - azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister - - // recorder is an event recorder for recording Event resources to the - // Kubernetes API. - recorder record.EventRecorder - - vaultService vault.Service - clock Timer -} - -// AzurePollFrequency controls time durations to wait between polls to Azure Key Vault for changes -type AzurePollFrequency struct { - // Normal is the time duration to wait between polls to Azure Key Vault for changes - Normal time.Duration - - // MaxFailuresBeforeSlowingDown controls how many failures are accepted before reducing the frequency to Slow - MaxFailuresBeforeSlowingDown int - - // Slow is the time duration to wait between polls to Azure Key Vault for changes, after MaxFailuresBeforeSlowingDown is reached - Slow time.Duration -} - -//NewHandler returns a new Handler -func NewHandler(kubeclientset kubernetes.Interface, azureKeyvaultClientset clientset.Interface, secretLister corelisters.SecretLister, azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency) *Handler { - return &Handler{ - kubeclientset: kubeclientset, - azureKeyvaultClientset: azureKeyvaultClientset, - secretsLister: secretLister, - azureKeyVaultSecretLister: azureKeyVaultSecretLister, - recorder: recorder, - vaultService: vaultService, - clock: &Clock{}, - } -} - -// kubernetesSyncHandler compares the actual state with the desired, and attempts to -// converge the two. It then updates the Status block of the AzureKeyVaultSecret resource -// with the current status of the resource. -func (h *Handler) syncAzureKeyVaultSecret(key string) error { - var azureKeyVaultSecret *akv.AzureKeyVaultSecret - var secret *corev1.Secret - var err error - - log.Infof("Processing AzureKeyVaultSecret %s", key) - if azureKeyVaultSecret, err = h.getAzureKeyVaultSecret(key); err != nil { - if exit := handleKeyVaultError(err, key); exit { - return nil - } - return err - } - - if secret, err = h.getOrCreateKubernetesSecret(azureKeyVaultSecret); err != nil { - return err - } - - if !metav1.IsControlledBy(secret, azureKeyVaultSecret) { // checks if the object has a controllerRef set to the given owner - msg := fmt.Sprintf(MessageResourceExists, secret.Name) - log.Warning(msg) - h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrResourceExists, msg) - return fmt.Errorf(msg) - } - - log.Infof("Successfully synced AzureKeyVaultSecret %s with Kubernetes Secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) - h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) - return nil -} - -// kubernetesSyncHandler compares the actual state with the desired, and attempts to -// converge the two. It then updates the Status block of the AzureKeyVaultSecret resource -// with the current status of the resource. -func (h *Handler) syncSecret(key string) error { - var secret *corev1.Secret - var err error - - if secret, err = h.getSecret(key); err != nil { - if exit := handleSecretError(err, key); exit { - return nil - } - return err - } - - log.Debugf("Processing secret: %s", secret.GetName()) - if ownerRef := metav1.GetControllerOf(secret); ownerRef != nil { - // If this object is not owned by a AzureKeyVaultSecret, we should not do anything more - // with it. - if ownerRef.Kind != "AzureKeyVaultSecret" { - return nil - } - - azureKeyVaultSecret, err := h.azureKeyVaultSecretLister.AzureKeyVaultSecrets(secret.GetNamespace()).Get(ownerRef.Name) - if err != nil { - log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", secret.GetSelfLink(), ownerRef.Name) - return nil - } - - key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(azureKeyVaultSecret) - if err != nil { - if exit := handleSecretError(err, key); exit { - return nil - } - return err - } - - return h.syncAzureKeyVaultSecret(key) - } - - log.Infof("Successfully synced Secret %s", key) - return nil -} - -func (h *Handler) syncAzureKeyVault(key string) error { - var azureKeyVaultSecret *akv.AzureKeyVaultSecret - var secret *corev1.Secret - var secretValue map[string][]byte - var err error - - log.Debugf("Checking state for %s in Azure", key) - if azureKeyVaultSecret, err = h.getAzureKeyVaultSecret(key); err != nil { - if exit := handleKeyVaultError(err, key); exit { - return nil - } - return err - } - - log.Debugf("Getting secret value for %s in Azure", key) - if secretValue, err = h.getSecretFromKeyVault(azureKeyVaultSecret); err != nil { - msg := fmt.Sprintf(FailedAzureKeyVault, azureKeyVaultSecret.Name, azureKeyVaultSecret.Spec.Vault.Name) - log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, azureKeyVaultSecret.Spec.Vault.Name, azureKeyVaultSecret.Spec.Vault.Object.Name, err) - h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrAzureVault, msg) - return fmt.Errorf(msg) - } - - secretHash := getMD5Hash(secretValue) - - log.Debugf("Checking if secret value for %s has changed in Azure", key) - if azureKeyVaultSecret.Status.SecretHash != secretHash { - log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", azureKeyVaultSecret.Name) - - if secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secretValue)); err != nil { - log.Warningf("Failed to create Secret, Error: %+v", err) - return err - } - - log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secrets must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) - h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSyncedWithAzure) - } - - log.Debugf("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) - if err = h.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, secretHash); err != nil { - return err - } - - log.Infof("Successfully synced AzureKeyVaultSecret %s with Azure Key Vault", key) - return nil -} - -func (h *Handler) getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string][]byte, error) { - var secretHandler KubernetesSecretHandler - - switch azureKeyVaultSecret.Spec.Vault.Object.Type { - case akv.AzureKeyVaultObjectTypeSecret: - transformator, err := transformers.CreateTransformator(&azureKeyVaultSecret.Spec.Output) - if err != nil { - return nil, err - } - secretHandler = NewAzureSecretHandler(azureKeyVaultSecret, h.vaultService, *transformator) - case akv.AzureKeyVaultObjectTypeCertificate: - secretHandler = NewAzureCertificateHandler(azureKeyVaultSecret, h.vaultService) - case akv.AzureKeyVaultObjectTypeKey: - secretHandler = NewAzureKeyHandler(azureKeyVaultSecret, h.vaultService) - case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret: - secretHandler = NewAzureMultiKeySecretHandler(azureKeyVaultSecret, h.vaultService) - default: - return nil, fmt.Errorf("azure key vault object type '%s' not currently supported", azureKeyVaultSecret.Spec.Vault.Object.Type) - } - return secretHandler.Handle() -} - -func (h *Handler) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, error) { - namespace, name, err := cache.SplitMetaNamespaceKey(key) - if err != nil { - return nil, fmt.Errorf("invalid resource key: %s", key) - } - - log.Debugf("Getting AzureKeyVaultSecret %s from namespace %s", name, namespace) - azureKeyVaultSecret, err := h.azureKeyVaultSecretLister.AzureKeyVaultSecrets(namespace).Get(name) - - if err != nil { - return nil, err - } - return azureKeyVaultSecret, err -} - -func (h *Handler) getSecret(key string) (*corev1.Secret, error) { - namespace, name, err := cache.SplitMetaNamespaceKey(key) - if err != nil { - return nil, fmt.Errorf("invalid resource key: %s", key) - } - - log.Debugf("Getting Secret %s from namespace %s", name, namespace) - secret, err := h.secretsLister.Secrets(namespace).Get(name) - - if err != nil { - return nil, err - } - return secret, err -} - -func (h *Handler) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (*corev1.Secret, error) { - var secret *corev1.Secret - var secretValues map[string][]byte - var err error - - secretName := azureKeyVaultSecret.Spec.Output.Secret.Name - if secretName == "" { - return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name") - } - - if secret, err = h.secretsLister.Secrets(azureKeyVaultSecret.Namespace).Get(secretName); err != nil { - if errors.IsNotFound(err) { - secretValues, err = h.getSecretFromKeyVault(azureKeyVaultSecret) - if err != nil { - return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, err) - } - - if secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil { - return nil, err - } - - log.Infof("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) - if err = h.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, getMD5Hash(secretValues)); err != nil { - return nil, err - } - - return secret, nil - } - } - - if secretName != secret.Name { - // Name of secret has changed in AzureKeyVaultSecret, so we need to delete current Secret and recreate - // under new name - - // Delete secret - if err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Delete(secret.Name, nil); err != nil { - return nil, err - } - - // Recreate secret under new Name - if secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil { - return nil, err - } - return secret, nil - } - - if hasAzureKeyVaultSecretChanged(azureKeyVaultSecret, secret) { - log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, secretName) - secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secret.Data)) - } - - return secret, err -} - -func hasAzureKeyVaultSecretChanged(vaultSecret *akv.AzureKeyVaultSecret, secret *corev1.Secret) bool { - secretType := determineSecretType(vaultSecret) - if secretType != secret.Type { - return true - } - - // Check if dataKey has changed by trying to lookup key - if vaultSecret.Spec.Output.Secret.DataKey != "" { - if _, ok := secret.Data[vaultSecret.Spec.Output.Secret.DataKey]; !ok { - return true - } - } - return false -} - -func (h *Handler) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.AzureKeyVaultSecret, secretHash string) error { - secretName := determineSecretName(azureKeyVaultSecret) - - // NEVER modify objects from the store. It's a read-only, local cache. - // You can use DeepCopy() to make a deep copy of original object and modify this copy - // Or create a copy manually for better performance - - azureKeyVaultSecretCopy := azureKeyVaultSecret.DeepCopy() - azureKeyVaultSecretCopy.Status.SecretHash = secretHash - azureKeyVaultSecretCopy.Status.LastAzureUpdate = h.clock.Now() - azureKeyVaultSecretCopy.Status.SecretName = secretName - - // If the CustomResourceSubresources feature gate is not enabled, - // we must use Update instead of UpdateStatus to update the Status block of the AzureKeyVaultSecret resource. - // UpdateStatus will not allow changes to the Spec of the resource, - // which is ideal for ensuring nothing other than resource status has been updated. - _, err := h.azureKeyvaultClientset.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy) - return err -} - -func handleKeyVaultError(err error, key string) bool { - log.Debugf("Handling error for '%s' in AzureKeyVaultSecret: %s", key, err.Error()) - if err != nil { - // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. - if errors.IsNotFound(err) { - log.Debugf("Error for '%s' was 'Not Found'", key) - - utilruntime.HandleError(fmt.Errorf("AzureKeyVaultSecret '%s' in work queue no longer exists", key)) - return true - } - } - return false -} - -func handleSecretError(err error, key string) bool { - log.Debugf("Handling error for '%s' in Secret: %s", key, err.Error()) - if err != nil { - // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. - if errors.IsNotFound(err) { - log.Debugf("Error for '%s' was 'Not Found'", key) - - utilruntime.HandleError(fmt.Errorf("Secret '%s' in work queue no longer exists", key)) - return true - } - } - return false -} - -// handleObject will take any resource implementing metav1.Object and attempt -// to find the AzureKeyVaultSecret resource that 'owns' it. It does this by looking at the -// objects metadata.ownerReferences field for an appropriate OwnerReference. -// It then enqueues that AzureKeyVaultSecret resource to be processed. If the object does not -// have an appropriate OwnerReference, it will simply be skipped. -func (h *Handler) handleObject(obj interface{}) (*akv.AzureKeyVaultSecret, bool, error) { - var object metav1.Object - var ok bool - - if object, ok = obj.(metav1.Object); !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - return nil, false, fmt.Errorf("error decoding object, invalid type") - } - object, ok = tombstone.Obj.(metav1.Object) - if !ok { - return nil, false, fmt.Errorf("error decoding object tombstone, invalid type") - } - log.Infof("Recovered deleted object '%s' from tombstone", object.GetName()) - } - - log.Debugf("Processing object: %s", object.GetName()) - if ownerRef := metav1.GetControllerOf(object); ownerRef != nil { - // If this object is not owned by a AzureKeyVaultSecret, we should not do anything more - // with it. - if ownerRef.Kind != "AzureKeyVaultSecret" { - return nil, true, nil - } - - azureKeyVaultSecret, err := h.azureKeyVaultSecretLister.AzureKeyVaultSecrets(object.GetNamespace()).Get(ownerRef.Name) - if err != nil { - log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", object.GetSelfLink(), ownerRef.Name) - return nil, true, nil - } - - return azureKeyVaultSecret, false, nil - } - return nil, true, nil -} - -// newSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets -// the appropriate OwnerReferences on the resource so handleObject can discover -// the AzureKeyVaultSecret resource that 'owns' it. -func createNewSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretValue map[string][]byte) *corev1.Secret { - secretName := determineSecretName(azureKeyVaultSecret) - secretType := determineSecretType(azureKeyVaultSecret) - - return &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: secretName, - Namespace: azureKeyVaultSecret.Namespace, - Labels: azureKeyVaultSecret.Labels, - Annotations: azureKeyVaultSecret.Annotations, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(azureKeyVaultSecret, schema.GroupVersionKind{ - Group: akv.SchemeGroupVersion.Group, - Version: akv.SchemeGroupVersion.Version, - Kind: "AzureKeyVaultSecret", - }), - }, - }, - Type: secretType, - Data: azureSecretValue, - } -} - -func determineSecretName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string { - name := azureKeyVaultSecret.Spec.Output.Secret.Name - if name == "" { - name = azureKeyVaultSecret.Name - } - return name -} - -func determineSecretType(azureKeyVaultSecret *akv.AzureKeyVaultSecret) corev1.SecretType { - if azureKeyVaultSecret.Spec.Output.Secret.Type == "" { - return corev1.SecretTypeOpaque - } - - return azureKeyVaultSecret.Spec.Output.Secret.Type -} - -func getMD5Hash(values map[string][]byte) string { - var mergedValues bytes.Buffer - - keys := sortValueKeys(values) - - for _, k := range keys { - mergedValues.WriteString(k + string(values[k])) - } - - hasher := md5.New() - hasher.Write([]byte(mergedValues.String())) - return hex.EncodeToString(hasher.Sum(nil)) -} - -func sortValueKeys(values map[string][]byte) []string { - var keys []string - for k := range values { - keys = append(keys, k) - } - sort.Strings(keys) - return keys -} diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go new file mode 100644 index 00000000..f52bbc22 --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -0,0 +1,267 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "fmt" + "sort" + + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + log "github.com/sirupsen/logrus" + "kmodules.xyz/client-go/tools/queue" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/tools/cache" +) + +func (c *Controller) initSecret() { + c.secretInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + if secret, ok := obj.(*corev1.Secret); ok { + log.Infof("Secret %s/%s controlled by AzureKeyVaultSecret added. Adding to queue.", secret.Namespace, secret.Name) + c.enqueueObject(obj) + } + }, + UpdateFunc: func(old, new interface{}) { + if newSecret, ok := new.(*corev1.Secret); ok { + oldSecret := old.(*corev1.Secret) + + if newSecret.ResourceVersion == oldSecret.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } + secret := new.(*corev1.Secret) + log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret changed. Handling.", secret.Namespace, secret.Name) + c.enqueueObject(new) + } + }, + DeleteFunc: func(obj interface{}) { + if secret, ok := obj.(*corev1.Secret); ok { + log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret deleted. Handling.", secret.Namespace, secret.Name) + c.enqueueObject(obj) + } + }, + }) + +} + +func (c *Controller) enqueueObject(obj interface{}) { + azureKeyVaultSecret, ignore, err := c.getAzureKeyVaultSecretFromSecret(obj) + + if err != nil { + utilruntime.HandleError(err) + } + + if !ignore { + queue.Enqueue(c.akvsCrdQueue.GetQueue(), azureKeyVaultSecret) + } +} + +func (c *Controller) getSecret(key string) (*corev1.Secret, error) { + namespace, name, err := cache.SplitMetaNamespaceKey(key) + if err != nil { + return nil, fmt.Errorf("invalid resource key: %s", key) + } + + log.Debugf("Getting Secret %s from namespace %s", name, namespace) + secret, err := c.secretsLister.Secrets(namespace).Get(name) + + if err != nil { + return nil, err + } + return secret, err +} + +func (c *Controller) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (*corev1.Secret, error) { + var secret *corev1.Secret + var secretValues map[string][]byte + var err error + + secretName := azureKeyVaultSecret.Spec.Output.Secret.Name + if secretName == "" { + return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name") + } + + log.Info("Get or create secret %s in namespace %s", secretName, azureKeyVaultSecret.Namespace) + if secret, err = c.secretsLister.Secrets(azureKeyVaultSecret.Namespace).Get(secretName); err != nil { + if errors.IsNotFound(err) { + secretValues, err = c.getSecretFromKeyVault(azureKeyVaultSecret) + if err != nil { + return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, err) + } + + if secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil { + return nil, err + } + + log.Infof("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) + if err = c.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, getMD5Hash(secretValues)); err != nil { + return nil, err + } + + return secret, nil + } + } + + if secretName != secret.Name { + // Name of secret has changed in AzureKeyVaultSecret, so we need to delete current Secret and recreate + // under new name + + // Delete secret + if err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Delete(secret.Name, nil); err != nil { + return nil, err + } + + // Recreate secret under new Name + if secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil { + return nil, err + } + return secret, nil + } + + if hasAzureKeyVaultSecretChanged(azureKeyVaultSecret, secret) { + log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, secretName) + secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secret.Data)) + } + + return secret, err +} + +func (c *Controller) getAzureKeyVaultSecretFromSecret(obj interface{}) (*akv.AzureKeyVaultSecret, bool, error) { + var object metav1.Object + var ok bool + + if object, ok = obj.(metav1.Object); !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, false, fmt.Errorf("error decoding object, invalid type") + } + object, ok = tombstone.Obj.(metav1.Object) + if !ok { + return nil, false, fmt.Errorf("error decoding object tombstone, invalid type") + } + log.Infof("Recovered deleted object '%s' from tombstone", object.GetName()) + } + + log.Debugf("Processing object: %s", object.GetName()) + if ownerRef := metav1.GetControllerOf(object); ownerRef != nil { + // If this object is not owned by a AzureKeyVaultSecret, we should not do anything more + // with it. + if ownerRef.Kind != "AzureKeyVaultSecret" { + return nil, true, nil + } + + azureKeyVaultSecret, err := c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(object.GetNamespace()).Get(ownerRef.Name) + if err != nil { + log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", object.GetSelfLink(), ownerRef.Name) + return nil, true, nil + } + + return azureKeyVaultSecret, false, nil + } + return nil, true, nil +} + +// newSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets +// the appropriate OwnerReferences on the resource so handleObject can discover +// the AzureKeyVaultSecret resource that 'owns' it. +func createNewSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretValue map[string][]byte) *corev1.Secret { + secretName := determineSecretName(azureKeyVaultSecret) + secretType := determineSecretType(azureKeyVaultSecret) + + return &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Namespace: azureKeyVaultSecret.Namespace, + Labels: azureKeyVaultSecret.Labels, + Annotations: azureKeyVaultSecret.Annotations, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(azureKeyVaultSecret, schema.GroupVersionKind{ + Group: akv.SchemeGroupVersion.Group, + Version: akv.SchemeGroupVersion.Version, + Kind: "AzureKeyVaultSecret", + }), + }, + }, + Type: secretType, + Data: azureSecretValue, + } +} + +func determineSecretName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string { + name := azureKeyVaultSecret.Spec.Output.Secret.Name + if name == "" { + name = azureKeyVaultSecret.Name + } + return name +} + +func determineSecretType(azureKeyVaultSecret *akv.AzureKeyVaultSecret) corev1.SecretType { + if azureKeyVaultSecret.Spec.Output.Secret.Type == "" { + return corev1.SecretTypeOpaque + } + + return azureKeyVaultSecret.Spec.Output.Secret.Type +} + +func getMD5Hash(values map[string][]byte) string { + var mergedValues bytes.Buffer + + keys := sortValueKeys(values) + + for _, k := range keys { + mergedValues.WriteString(k + string(values[k])) + } + + hasher := md5.New() + hasher.Write([]byte(mergedValues.String())) + return hex.EncodeToString(hasher.Sum(nil)) +} + +func sortValueKeys(values map[string][]byte) []string { + var keys []string + for k := range values { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} + +func handleSecretError(err error, key string) bool { + log.Debugf("Handling error for '%s' in Secret: %s", key, err.Error()) + if err != nil { + // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. + if errors.IsNotFound(err) { + log.Debugf("Error for '%s' was 'Not Found'", key) + + utilruntime.HandleError(fmt.Errorf("Secret '%s' in work queue no longer exists", key)) + return true + } + } + return false +} diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index e30b995c..e985a73a 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -152,14 +152,22 @@ func main() { vaultService := vault.NewService(vaultAuth) recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) - handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), recorder, vaultService, azurePollFrequency) + // handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), recorder, vaultService, azurePollFrequency) options := &controller.Options{ MaxNumRequeues: 5, NumThreads: 1, } - controller := controller.NewController(kubeClient, azureKeyVaultSecretClient, azureKeyVaultSecretInformerFactory, kubeInformerFactory, handler, azurePollFrequency, options) + controller := controller.NewController( + kubeClient, + azureKeyVaultSecretClient, + azureKeyVaultSecretInformerFactory, + kubeInformerFactory, + recorder, + vaultService, + azurePollFrequency, + options) controller.Run(stopCh) } From fe44942905b545c803566079d9c6655fb80e733e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 1 Oct 2020 02:02:46 +0200 Subject: [PATCH 147/251] --amend controller: refactor out handler --- go.sum | 1 + 1 file changed, 1 insertion(+) diff --git a/go.sum b/go.sum index ae5facbf..1af74685 100644 --- a/go.sum +++ b/go.sum @@ -902,6 +902,7 @@ k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j k8s.io/api v0.0.0-20191114100352-16d7abae0d2a/go.mod h1:qetVJgs5i8jwdFIdoOZ70ks0ecgU+dYwqZ2uD1srwOU= k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms= k8s.io/apiextensions-apiserver v0.0.0-20191114105449-027877536833/go.mod h1:Gb1G2W/kXMizbVTnA9oh2ybQ4cM3COr3r5JDj+DzKGw= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a h1:lDydUqHrbL/1l5ZQrqD1RIlabhmX8aiZEtxVUb+30iU= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= From bae5d8c867ab8438531295f0eed05e5a63814fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 1 Oct 2020 19:29:45 +0200 Subject: [PATCH 148/251] controller: rename enqueueObject to enqueueSecret, as that's what it is --- cmd/azure-keyvault-controller/controller/secret.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index f52bbc22..c391591c 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -42,8 +42,8 @@ func (c *Controller) initSecret() { c.secretInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { if secret, ok := obj.(*corev1.Secret); ok { - log.Infof("Secret %s/%s controlled by AzureKeyVaultSecret added. Adding to queue.", secret.Namespace, secret.Name) - c.enqueueObject(obj) + log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret added. Adding to queue.", secret.Namespace, secret.Name) + c.enqueueSecret(obj) } }, UpdateFunc: func(old, new interface{}) { @@ -57,20 +57,20 @@ func (c *Controller) initSecret() { } secret := new.(*corev1.Secret) log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret changed. Handling.", secret.Namespace, secret.Name) - c.enqueueObject(new) + c.enqueueSecret(new) } }, DeleteFunc: func(obj interface{}) { if secret, ok := obj.(*corev1.Secret); ok { log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret deleted. Handling.", secret.Namespace, secret.Name) - c.enqueueObject(obj) + c.enqueueSecret(obj) } }, }) } -func (c *Controller) enqueueObject(obj interface{}) { +func (c *Controller) enqueueSecret(obj interface{}) { azureKeyVaultSecret, ignore, err := c.getAzureKeyVaultSecretFromSecret(obj) if err != nil { From 4e1c50384b9d6ca488b0a8cdba0f88a43aa01705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 1 Oct 2020 20:10:06 +0200 Subject: [PATCH 149/251] controllere: fix log directive --- cmd/azure-keyvault-controller/controller/secret.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index c391591c..7e2f36f7 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -107,7 +107,7 @@ func (c *Controller) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureK return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name") } - log.Info("Get or create secret %s in namespace %s", secretName, azureKeyVaultSecret.Namespace) + log.Infof("Get or create secret %s in namespace %s", secretName, azureKeyVaultSecret.Namespace) if secret, err = c.secretsLister.Secrets(azureKeyVaultSecret.Namespace).Get(secretName); err != nil { if errors.IsNotFound(err) { secretValues, err = c.getSecretFromKeyVault(azureKeyVaultSecret) From cddd4b3ff341a00370850004e59ba1081ecbae91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 4 Oct 2020 01:03:11 +0200 Subject: [PATCH 150/251] controller: move ca bundler into controller --- .../controller/azureKeyVaultSecret.go | 97 ++++--- .../controller/caBundle.go | 255 ++++++++++++++++++ .../controller/controller.go | 59 ++-- .../controller/secret.go | 140 ++++++---- 4 files changed, 448 insertions(+), 103 deletions(-) create mode 100644 cmd/azure-keyvault-controller/controller/caBundle.go diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index e7bfa738..88ff5e92 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -23,6 +23,7 @@ import ( "fmt" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" log "github.com/sirupsen/logrus" @@ -38,43 +39,79 @@ import ( func (c *Controller) initAzureKeyVaultSecret() { c.akvsInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { - if secret.Spec.Output.Secret.Name == "" { - return - } + secret, err := convertToAzureKeyVaultSecret(obj) + if err != nil { + log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + } + + if c.akvsHasSecretOutput(secret) { log.Debugf("AzureKeyVaultSecret %s/%s added. Adding to queue.", secret.Namespace, secret.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) - queue.Enqueue(c.akvQueue.GetQueue(), obj) + queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), obj) } }, UpdateFunc: func(old, new interface{}) { - if newSecret, ok := new.(*akv.AzureKeyVaultSecret); ok { - oldSecret := old.(*akv.AzureKeyVaultSecret) - if oldSecret.Spec.Output.Secret.Name == "" { - return - } - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - log.Debugf("AzureKeyVaultSecret %s/%s changed and diffs in resource version. Adding to Azure Key Vault queue.", newSecret.Namespace, newSecret.Name) - queue.Enqueue(c.akvQueue.GetQueue(), new) - return - } + newSecret, err := convertToAzureKeyVaultSecret(new) + if err != nil { + log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + } + oldSecret, err := convertToAzureKeyVaultSecret(old) + if err != nil { + log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + } + + if newSecret.ResourceVersion != oldSecret.ResourceVersion { + return + } + // if newSecret.ResourceVersion == oldSecret.ResourceVersion { + // log.Debugf("AzureKeyVaultSecret %s/%s changed and diffs in resource version. Adding to Azure Key Vault queue.", newSecret.Namespace, newSecret.Name) + // queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) + // return + // } + + if c.akvsHasSecretOutput(newSecret) || c.akvsHasSecretOutput(oldSecret) { log.Debugf("AzureKeyVaultSecret %s/%s changed. Adding to queue.", newSecret.Namespace, newSecret.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), new) } }, DeleteFunc: func(obj interface{}) { - if secret, ok := obj.(*akv.AzureKeyVaultSecret); ok { - if secret.Spec.Output.Secret.Name == "" { + secret, err := convertToAzureKeyVaultSecret(obj) + if err != nil { + log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + } + + if c.akvsHasSecretOutput(secret) { + log.Debugf("AzureKeyVaultSecret %s/%s deleted. Adding to delete queue.", secret.Namespace, secret.Name) + queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) + + // Getting default key to remove from Azure work queue + key, err := cache.MetaNamespaceKeyFunc(obj) + if err != nil { + utilruntime.HandleError(err) return } - log.Debugf("AzureKeyVaultSecret %s/%s deleted. Adding to delete queue.", secret.Namespace, secret.Name) - c.enqueueDeleteAzureKeyVaultSecret(obj) + c.azureKeyVaultQueue.GetQueue().Forget(key) } }, }) } +func convertToAzureKeyVaultSecret(obj interface{}) (*v2alpha1.AzureKeyVaultSecret, error) { + secret, ok := obj.(*v2alpha1.AzureKeyVaultSecret) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) + } + secret, ok = tombstone.Obj.(*v2alpha1.AzureKeyVaultSecret) + if !ok { + return nil, fmt.Errorf("tombstone contained object that is not a AzureKeyVaultSecret %#v", obj) + } + } + return secret, nil +} + func (c *Controller) syncAzureKeyVaultSecret(key string) error { var azureKeyVaultSecret *akv.AzureKeyVaultSecret var secret *corev1.Secret @@ -104,6 +141,10 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return nil } +func (c *Controller) akvsHasSecretOutput(secret *v2alpha1.AzureKeyVaultSecret) bool { + return secret.Spec.Output.Secret.Name != "" +} + func (c *Controller) syncAzureKeyVault(key string) error { var azureKeyVaultSecret *akv.AzureKeyVaultSecret var secret *corev1.Secret @@ -150,6 +191,10 @@ func (c *Controller) syncAzureKeyVault(key string) error { return nil } +func (c *Controller) getAzureKeyVaultSecretFromSecret(secret *corev1.Secret, owner *metav1.OwnerReference) (*akv.AzureKeyVaultSecret, error) { + return c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(secret.Namespace).Get(owner.Name) +} + func (c *Controller) getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string][]byte, error) { var secretHandler KubernetesSecretHandler @@ -222,20 +267,6 @@ func (c *Controller) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.Az return err } -func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { - var key string - var err error - - queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) - - // Getting default key to remove from Azure work queue - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.akvQueue.GetQueue().Forget(key) -} - func handleKeyVaultError(err error, key string) bool { log.Debugf("Handling error for '%s' in AzureKeyVaultSecret: %s", key, err.Error()) if err != nil { diff --git a/cmd/azure-keyvault-controller/controller/caBundle.go b/cmd/azure-keyvault-controller/controller/caBundle.go new file mode 100644 index 00000000..882908de --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/caBundle.go @@ -0,0 +1,255 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "fmt" + + log "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/tools/cache" +) + +func (c *Controller) syncCABundleSecret(key string) error { + /* + 1. Get Secret + 2. Get all akv2k8s-injector enabled namespaces + 3. Create ConfigMaps containing CA cert in namespaces + */ + + // Convert the namespace/name string into a distinct namespace and name + namespace, name, err := cache.SplitMetaNamespaceKey(key) + if err != nil { + utilruntime.HandleError(fmt.Errorf("invalid resource key: %s", key)) + return nil + } + + log.Debugf("pulling secret '%s' from namespace '%s'", name, namespace) + + // Get the Secret resource with this namespace/name + secret, err := c.secretsLister.Secrets(namespace).Get(name) + if err != nil { + // The Secret resource may no longer exist, in which case we stop + // processing. + if errors.IsNotFound(err) { + utilruntime.HandleError(fmt.Errorf("secret '%s' in work queue no longer exists", key)) + return nil + } + + return err + } + + labelledNamespaces, err := c.getAllAkvsLabelledNamespaces() + + log.Infof("looping all labelled namespaces looking for config map '%s' to update", c.caBundleConfigMapName) + + for _, ns := range labelledNamespaces { + configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + + // If the resource doesn't exist, we'll create it + if errors.IsNotFound(err) { + log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating configmap now", c.caBundleConfigMapName, ns.Name) + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + if err != nil { + msg := fmt.Sprintf("failed to create configmap %s in namespace %s", newConfigMap.Name, ns.Name) + c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) + log.Errorf("%s, error: %+v", msg, err) + return err + } + return nil + } + + // If an error occurs during Get/Create, we'll requeue the item so we can + // attempt processing again later. This could have been caused by a + // temporary network failure, or any other transient reason. + if err != nil { + return err + } + + // If the ConfigMap is not controlled by this Secret resource, we should log + // a warning to the event recorder and return error msg. + if !metav1.IsControlledBy(configMap, secret) { + msg := fmt.Sprintf(MessageResourceExists, configMap.Name) + c.recorder.Event(secret, corev1.EventTypeWarning, ErrResourceExists, msg) + return fmt.Errorf(msg) + } + + // If CA cert in ConfigMap resource is not the same as in Secret resource, we + // should update the ConfigMap resource. + if configMap.Data["caCert"] != secret.StringData["caCert"] { + log.Infof("secret %s updated: updating config map: %s", secret.Name, configMap.Name) + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) + + if err != nil { + msg := fmt.Sprintf("failed to update configmap %s in namespace %s", newConfigMap.Name, ns.Name) + c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) + log.Errorf("%s, error: %+v", msg, err) + return err + } + } + + // If an error occurs during Update, we'll requeue the item so we can + // attempt processing again later. This could have been caused by a + // temporary network failure, or any other transient reason. + if err != nil { + return err + } + } + + c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) + return nil +} + +func (c *Controller) getAllAkvsLabelledNamespaces() ([]*corev1.Namespace, error) { + labelSelector := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "azure-key-vault-env-injection": "enabled", + }, + } + + selector, err := metav1.LabelSelectorAsSelector(labelSelector) + if err != nil { + return nil, err + } + + return c.namespaceLister.List(selector) +} + +//syncHandler for new labelled namespaces +func (c *Controller) syncHandlerNewNamespace(key string) error { + ns, err := c.namespaceLister.Get(key) + if err != nil { + return err + } + + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, key) + cm, err := c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) + + if err != nil { + if errors.IsNotFound(err) { // if configmap does not exist, create it + log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating", c.caBundleConfigMapName, key) + + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + if err != nil { + return err + } + return nil + } + + return err + } + + if cm != nil { + log.Debugf("configmap '%s' exists in namespace '%s' with old ca bundle - updating", c.caBundleConfigMapName, key) + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) + if err != nil { + return err + } + } + + c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) + return nil +} + +//syncHandler for changed namespaces +func (c *Controller) syncHandlerChangedNamespace(key string) error { + ns, err := c.namespaceLister.Get(key) + if err != nil { + return err + } + + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) + cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + if err != nil { + if errors.IsNotFound(err) { + log.Debugf("configmap '%s' not found in updated namespace '%s' - creating", c.caBundleConfigMapName, key) + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + if err != nil { + return err + } + return nil + } + return err + } + + //If the resource exists in a non-labelled namespace, we delete it + if !c.isNamespaceLabelled(ns) && cm != nil { + log.Infof("configmap '%s' exists in namespace '%s' which is no longer labelled to keep CA Bundle", c.caBundleConfigMapName, key) + err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) + if err != nil { + return err + } + } + + return nil +} + +func (c *Controller) isNamespaceLabelled(ns *corev1.Namespace) bool { + lbl := ns.Labels[c.options.NamespaceAkvsLabel] + if lbl == "enabled" { + return true + } + + return false +} + +func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigMap { + dataByte := secret.Data["ca.crt"] + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: ns, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(secret, schema.GroupVersionKind{ + Group: corev1.SchemeGroupVersion.Group, + Version: corev1.SchemeGroupVersion.Version, + Kind: "Secret", + }), + }, + }, + Data: map[string]string{ + "caCert": string(dataByte), + }, + } +} diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 359aa87e..07888838 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -54,6 +54,9 @@ const ( // to sync due to a Secret of the same name already existing. ErrAzureVault = "ErrAzureVault" + // ErrConfigMap is used as part of the Event 'reason' when a Secret sync fails + ErrConfigMap = "ErrConfigMap" + // FailedAzureKeyVault is the message used for Events when a resource // fails to get secret from Azure Key Vault FailedAzureKeyVault = "Failed to get secret for '%s' from Azure Key Vault '%s'" @@ -78,24 +81,44 @@ type Controller struct { vaultService vault.Service recorder record.EventRecorder - secretsLister corelisters.SecretLister - azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister - + // Secret + secretsLister corelisters.SecretLister secretInformerFactory informers.SharedInformerFactory - akvsInformerFactory akvInformers.SharedInformerFactory + akvsSecretQueue *queue.Worker //workqueue.RateLimitingInterface - akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface - akvQueue *FastSlowWorker //workqueue.RateLimitingInterface - - clock Timer + // AzureKeyVaultSecret + azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister + akvsInformerFactory akvInformers.SharedInformerFactory + akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface + azureKeyVaultQueue *FastSlowWorker //workqueue.RateLimitingInterface + + // CA Bundle + caBundleSecretQueue *queue.Worker + caBundleSecretName string + caBundleSecretNamespaceName string + caBundleConfigMapName string + + // Namespace + namespaceLister corelisters.NamespaceLister + namespaceInformerFactory informers.SharedInformerFactory + namespaceQueue *queue.Worker //workqueue.RateLimitingInterface + + // ConfigMap + configMapLister corelisters.ConfigMapLister + configMapInformerFactory informers.SharedInformerFactory + configMapQueue *queue.Worker //workqueue.RateLimitingInterface + + options *Options + clock Timer } // Options contains options for the controller type Options struct { - NumThreads int - MaxNumRequeues int - ResyncPeriod time.Duration - AkvsRef corev1.ObjectReference + NumThreads int + MaxNumRequeues int + ResyncPeriod time.Duration + AkvsRef corev1.ObjectReference + NamespaceAkvsLabel string } // AzurePollFrequency controls time durations to wait between polls to Azure Key Vault for changes @@ -129,11 +152,14 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI secretsLister: secretInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretLister: akvInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), - clock: &Clock{}, + options: options, + clock: &Clock{}, } controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) - controller.akvQueue = NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) + controller.akvsSecretQueue = queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, controller.syncSecret) + controller.azureKeyVaultQueue = NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) + controller.caBundleSecretQueue = queue.New("CABundleSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleSecret) log.Info("Setting up event handlers") controller.initAzureKeyVaultSecret() @@ -166,11 +192,14 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } log.Debug("Starting Azure Key Vault queue") - c.akvQueue.Run(stopCh) + c.azureKeyVaultQueue.Run(stopCh) log.Debug("Starting Azure Key Vault Secret queue") c.akvsCrdQueue.Run(stopCh) + log.Debug("Starting CA Bundle Secret queue") + c.caBundleSecretQueue.Run(stopCh) + log.Info("Started workers") <-stopCh log.Info("Shutting down workers") diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 7e2f36f7..7e455dbd 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -41,45 +41,110 @@ import ( func (c *Controller) initSecret() { c.secretInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - if secret, ok := obj.(*corev1.Secret); ok { + secret, err := convertToSecret(obj) + if err != nil { + log.Errorf("failed to convert to secret: %v", err) + } + + if c.isCABundleSecret(secret) { + queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) + return + } + + if c.isOwnedByAzureKeyVaultSecret(secret) { log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret added. Adding to queue.", secret.Namespace, secret.Name) - c.enqueueSecret(obj) + queue.Enqueue(c.akvsSecretQueue.GetQueue(), secret) } }, UpdateFunc: func(old, new interface{}) { - if newSecret, ok := new.(*corev1.Secret); ok { - oldSecret := old.(*corev1.Secret) - - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } - secret := new.(*corev1.Secret) - log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret changed. Handling.", secret.Namespace, secret.Name) - c.enqueueSecret(new) + newSecret, err := convertToSecret(new) + if err != nil { + log.Errorf("failed to convert to secret: %v", err) + } + + oldSecret, err := convertToSecret(old) + if err != nil { + log.Errorf("failed to convert to secret: %v", err) + } + + if newSecret.ResourceVersion == oldSecret.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } + + if c.isCABundleSecret(newSecret) { + queue.Enqueue(c.caBundleSecretQueue.GetQueue(), newSecret) + return + } + + if c.isOwnedByAzureKeyVaultSecret(newSecret) { + log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret changed. Handling.", newSecret.Namespace, newSecret.Name) + queue.Enqueue(c.akvsSecretQueue.GetQueue(), newSecret) } }, DeleteFunc: func(obj interface{}) { - if secret, ok := obj.(*corev1.Secret); ok { + secret, err := convertToSecret(obj) + if err != nil { + log.Errorf("failed to convert to secret: %v", err) + } + + if c.isCABundleSecret(secret) { + queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) + return + } + + if c.isOwnedByAzureKeyVaultSecret(secret) { log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret deleted. Handling.", secret.Namespace, secret.Name) - c.enqueueSecret(obj) + queue.Enqueue(c.akvsSecretQueue.GetQueue(), secret) } }, }) - } -func (c *Controller) enqueueSecret(obj interface{}) { - azureKeyVaultSecret, ignore, err := c.getAzureKeyVaultSecretFromSecret(obj) +func convertToSecret(obj interface{}) (*corev1.Secret, error) { + secret, ok := obj.(*corev1.Secret) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) + } + secret, ok = tombstone.Obj.(*corev1.Secret) + if !ok { + return nil, fmt.Errorf("tombstone contained object that is not a Secret %#v", obj) + } + } + return secret, nil +} +func (c *Controller) syncSecret(key string) error { + secret, err := c.getSecret(key) if err != nil { - utilruntime.HandleError(err) + return err } - if !ignore { + if ownerRef := metav1.GetControllerOf(secret); ownerRef != nil { + azureKeyVaultSecret, err := c.getAzureKeyVaultSecretFromSecret(secret, ownerRef) + if err != nil { + return err + } + queue.Enqueue(c.akvsCrdQueue.GetQueue(), azureKeyVaultSecret) } + return nil +} + +func (c *Controller) isCABundleSecret(secret *corev1.Secret) bool { + return secret.Namespace == c.caBundleSecretNamespaceName && secret.Name == c.caBundleSecretName +} + +func (c *Controller) isOwnedByAzureKeyVaultSecret(secret *corev1.Secret) bool { + if ownerRef := metav1.GetControllerOf(secret); ownerRef != nil { + if ownerRef.Kind == "AzureKeyVaultSecret" { + return true + } + } + return false } func (c *Controller) getSecret(key string) (*corev1.Secret, error) { @@ -152,41 +217,6 @@ func (c *Controller) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureK return secret, err } -func (c *Controller) getAzureKeyVaultSecretFromSecret(obj interface{}) (*akv.AzureKeyVaultSecret, bool, error) { - var object metav1.Object - var ok bool - - if object, ok = obj.(metav1.Object); !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - return nil, false, fmt.Errorf("error decoding object, invalid type") - } - object, ok = tombstone.Obj.(metav1.Object) - if !ok { - return nil, false, fmt.Errorf("error decoding object tombstone, invalid type") - } - log.Infof("Recovered deleted object '%s' from tombstone", object.GetName()) - } - - log.Debugf("Processing object: %s", object.GetName()) - if ownerRef := metav1.GetControllerOf(object); ownerRef != nil { - // If this object is not owned by a AzureKeyVaultSecret, we should not do anything more - // with it. - if ownerRef.Kind != "AzureKeyVaultSecret" { - return nil, true, nil - } - - azureKeyVaultSecret, err := c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(object.GetNamespace()).Get(ownerRef.Name) - if err != nil { - log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", object.GetSelfLink(), ownerRef.Name) - return nil, true, nil - } - - return azureKeyVaultSecret, false, nil - } - return nil, true, nil -} - // newSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. From d84fa6f392d2bbff043b474b6fbe35dbd23a551c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 4 Oct 2020 01:04:50 +0200 Subject: [PATCH 151/251] pkg: use heroku's docker-registry-client to download remote docker config - solves #129 --- cmd/azure-keyvault-env/main.go | 16 +- cmd/azure-keyvault-secrets-webhook/pod.go | 32 +-- .../registry.go | 177 +------------ .../registry_test.go | 121 ++++----- go.mod | 24 +- go.sum | 153 +++++++++++ pkg/azure/credentialprovider/acr.go | 12 +- pkg/docker/registry/container.go | 247 ++++++++++++++++++ pkg/docker/registry/registry.go | 110 ++++++++ pkg/docker/registry/regitstry_test.go | 129 +++++++++ 10 files changed, 732 insertions(+), 289 deletions(-) create mode 100644 pkg/docker/registry/container.go create mode 100644 pkg/docker/registry/registry.go create mode 100644 pkg/docker/registry/regitstry_test.go diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 94f70d02..9d55a1f3 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -222,7 +222,19 @@ func main() { creds, err := getCredentials(config.useAuthService, config.authServiceAddress, config.caCert) if err != nil { - log.Fatalf("failed to get credentials, error: %+v", err) + log.Warnf("failed to get credentials, will retry %d times", config.retryTimes) + err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { + creds, err = getCredentials(config.useAuthService, config.authServiceAddress, config.caCert) + if err != nil { + logger.Warnf("failed to get credentials, error: %+v", err) + return err + } + logger.Info("succeded getting credentials") + return nil + }) + if err != nil { + logger.Fatalf("failed to get credentials %d times, error: %+v", config.retryTimes, err) + } } vaultService := vault.NewService(creds) @@ -268,7 +280,7 @@ func main() { logger.Debugf("getting azurekeyvaultsecret resource '%s' from kubernetes", secretName) keyVaultSecretSpec, err := azureKeyVaultSecretClient.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { - logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error()) + logger.Warnf("failed to get azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error()) logger.Infof("will retry getting azurekeyvaultsecret resource up to %d times, waiting %d seconds between retries", config.retryTimes, config.waitTimeBetweenRetries) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index 9aed0685..34200665 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -26,7 +26,6 @@ import ( "strconv" "strings" - "github.com/containers/image/v5/types" log "github.com/sirupsen/logrus" "github.com/spf13/viper" corev1 "k8s.io/api/core/v1" @@ -73,7 +72,7 @@ func getVolumes() []corev1.Volume { return volumes } -func mutateContainers(containers []corev1.Container, imagePullSecrets map[string]*types.DockerAuthConfig) (bool, error) { +func mutateContainers(clientset kubernetes.Interface, ns string, containers []corev1.Container, podSpec *corev1.PodSpec) (bool, error) { mutated := false for i, container := range containers { @@ -105,25 +104,7 @@ func mutateContainers(containers []corev1.Container, imagePullSecrets map[string continue } - registryName := "" - imgParts := strings.Split(container.Image, "/") - if len(imgParts) >= 2 { - registryName = imgParts[0] - } - - var regCred *types.DockerAuthConfig - regCred, ok := imagePullSecrets[registryName] - - if ok { - log.Infof("found imagePullSecrets credentials to use with registry '%s'", registryName) - } else if config.runningInsideAzureAks && config.useAksCredentialsWithAcs { - log.Info("we are running inside azure aks, trying to get acr credentials") - regCred = getAcrCredentials(registryName, container.Image) - } else { - log.Debugf("not trying to get acr credentials, as we are not on aks or configured to not use aks credentials with acr") - } - - autoArgs, err := getContainerCmd(container, regCred) + autoArgs, err := getContainerCmd(clientset, ns, &container, podSpec) if err != nil { return false, fmt.Errorf("failed to get auto cmd, error: %+v", err) } @@ -232,17 +213,12 @@ func mutatePodSpec(pod *corev1.Pod) error { return err } - regCred, err := getRegistryCredsFromImagePullSecrets(*clientset, podSpec) - if err != nil { - return err - } - - initContainersMutated, err := mutateContainers(podSpec.InitContainers, regCred) + initContainersMutated, err := mutateContainers(clientset, pod.Namespace, podSpec.InitContainers, podSpec) if err != nil { return err } - containersMutated, err := mutateContainers(podSpec.Containers, regCred) + containersMutated, err := mutateContainers(clientset, pod.Namespace, podSpec.Containers, podSpec) if err != nil { return err } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 956329f6..322e5391 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -18,25 +18,13 @@ package main import ( - "context" - "encoding/base64" - "encoding/json" - "fmt" - "os" - "strings" - "time" - - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - "github.com/containers/image/v5/transports/alltransports" - "github.com/containers/image/v5/types" - v1 "github.com/opencontainers/image-spec/specs-go/v1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/docker/registry" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) -func getContainerCmd(container corev1.Container, creds *types.DockerAuthConfig) ([]string, error) { +func getContainerCmd(clientset kubernetes.Interface, ns string, container *corev1.Container, podSpec *corev1.PodSpec) ([]string, error) { log.Debugf("getting container command for container '%s'", container.Name) cmd := container.Command @@ -44,24 +32,16 @@ func getContainerCmd(container corev1.Container, creds *types.DockerAuthConfig) // https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes if len(cmd) == 0 { log.Debugf("no cmd override in kubernetes for container %s, checking docker image configuration for entrypoint and cmd for %s", container.Name, container.Image) - if creds == nil { - log.Warnf("no credentials provided/found to access remote docker image configuration for %s - going anonymous", container.Image) - } - - opts := imageOptions{ - image: container.Image, - credentials: *creds, - } - config, err := opts.getConfigFromManifest() + imgConfig, err := registry.GetImageConfig(clientset, ns, container, podSpec, config.cloudConfigHostPath) if err != nil { return nil, err } - cmd = append(cmd, config.Config.Entrypoint...) + cmd = append(cmd, imgConfig.Entrypoint...) if len(container.Args) == 0 { - cmd = append(cmd, config.Config.Cmd...) + cmd = append(cmd, imgConfig.Cmd...) } } else { log.Debugf("found cmd override in kubernetes for container %s, no need to inspect docker image configuration for %s", container.Name, container.Image) @@ -71,150 +51,3 @@ func getContainerCmd(container corev1.Container, creds *types.DockerAuthConfig) return cmd, nil } - -type imageOptions struct { - image string - credentials types.DockerAuthConfig - architecture string - osChoice string -} - -func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) { - log.Debugf("docker image inspection timeout: %d seconds", config.dockerImageInspectionTimeout) - timeout := time.Duration(config.dockerImageInspectionTimeout) * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - // TODO: what about others like OCI, OpenShift and so on? - if !strings.HasPrefix(opts.image, "docker://") { - opts.image = "docker://" + opts.image - } - - ref, err := alltransports.ParseImageName(opts.image) - if err != nil { - return nil, fmt.Errorf("failed to parse docker image name: %+v", err) - } - - sys := &types.SystemContext{ - OCISharedBlobDirPath: "/tmp", - DockerAuthConfig: &opts.credentials, - } - - if opts.osChoice != "" { - sys.OSChoice = opts.osChoice - } - - if opts.architecture != "" { - sys.ArchitectureChoice = opts.architecture - } - - abc, err := ref.NewImage(ctx, sys) - if err != nil { - return nil, fmt.Errorf("failed to get docker image %q: %+v", opts.image, err) - } - defer abc.Close() - - dockerConfig, err := abc.OCIConfig(ctx) - if err != nil { - return nil, fmt.Errorf("error reading OCI-formatted configuration data: %+v", err) - } - - return dockerConfig, nil -} - -func getRegistryCredsFromImagePullSecrets(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) (map[string]*types.DockerAuthConfig, error) { - creds := make(map[string]*types.DockerAuthConfig) - - var conf struct { - Auths map[string]struct { - Auth string - } - } - - var decoded []byte - var ok bool - if podSpec.ImagePullSecrets != nil { - for _, secret := range podSpec.ImagePullSecrets { - secret, err := clientset.CoreV1().Secrets(config.namespace).Get(secret.Name, metav1.GetOptions{}) - if err != nil { - return creds, err - } - - switch secret.Type { - case corev1.SecretTypeDockerConfigJson: - decoded, ok = secret.Data[corev1.DockerConfigJsonKey] - default: - return creds, fmt.Errorf("unable to load image pull secret '%s', only type '%s' is supported", secret.Name, secret.Type) - } - - if !ok { - continue - } - - if err := json.Unmarshal(decoded, &conf); err != nil { - return creds, err - } - - // If it's in k8s format, it won't have the surrounding "Auth". Try that too. - if len(conf.Auths) == 0 { - if err := json.Unmarshal(decoded, &conf.Auths); err != nil { - return creds, err - } - } - - for host, entry := range conf.Auths { - decodedAuth, err := base64.StdEncoding.DecodeString(entry.Auth) - if err != nil { - return creds, err - } - - authParts := strings.SplitN(string(decodedAuth), ":", 2) - if len(authParts) != 2 { - return creds, fmt.Errorf("decoded credential has wrong number of fields (expected 2, got %d)", len(authParts)) - } - - creds[host] = &types.DockerAuthConfig{ - Username: authParts[0], - Password: authParts[1], - } - } - } - } - return creds, nil -} - -func getAcrCredentials(host string, image string) *types.DockerAuthConfig { - //Check if cloud config file exists - _, err := os.Stat(config.cloudConfigHostPath) - if err != nil { - log.Debugf("did not find cloud config - most likely because we're not in Azure/AKS") - return &types.DockerAuthConfig{} - } - - f, err := os.Open(config.cloudConfigHostPath) - if err != nil { - log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) - return &types.DockerAuthConfig{} - } - defer f.Close() - - cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) - if err != nil { - log.Errorf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) - return &types.DockerAuthConfig{} - } - - if cloudCnfProvider.IsAcrRegistry(image) { - cred, err := cloudCnfProvider.GetAcrCredentials(image) - if err != nil { - log.Errorf("failed getting azure acr credentials, error: %+v", err) - return &types.DockerAuthConfig{} - } - - log.Debugf("found acr credentials to use in cloud config for '%s'", host) - return cred - } - - log.Warnf("no acr credentials found for %s", host) - return &types.DockerAuthConfig{} -} diff --git a/cmd/azure-keyvault-secrets-webhook/registry_test.go b/cmd/azure-keyvault-secrets-webhook/registry_test.go index 4b380793..94c6f0f2 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry_test.go +++ b/cmd/azure-keyvault-secrets-webhook/registry_test.go @@ -1,66 +1,59 @@ package main -import ( - "testing" - - "github.com/containers/image/v5/types" - "github.com/ghodss/yaml" -) - -func TestDockerPull(t *testing.T) { - config.dockerImageInspectionTimeout = 20 - - opts := imageOptions{ - image: "openjdk:slim", - credentials: types.DockerAuthConfig{}, - architecture: "amd64", - osChoice: "linux", - } - - manifest, err := opts.getConfigFromManifest() - - if err != nil { - t.Errorf("failed somewhere in get manifest %+v", err) - return - } - - var cmd []string - cmd = append(cmd, manifest.Config.Entrypoint...) - cmd = append(cmd, manifest.Config.Cmd...) - - if len(cmd) == 0 { - t.Errorf("no entrypoint nor cmd found there is something wrong.") - t.Log(yaml.Marshal(manifest.Config)) - } - - t.Logf("cmd found: %v", cmd) -} - -func TestDockerPullWithShaImageNotation(t *testing.T) { - config.dockerImageInspectionTimeout = 20 - - opts := imageOptions{ - image: "spvest/azure-keyvault-webhook@sha256:38a78fde88bd3bf023606ac3a2219b0803457734cb2e7bb80b55d36450cc71f1", - credentials: types.DockerAuthConfig{}, - architecture: "amd64", - osChoice: "linux", - } - - manifest, err := opts.getConfigFromManifest() - - if err != nil { - t.Errorf("failed somewhere in get manifest %+v", err) - return - } - - var cmd []string - cmd = append(cmd, manifest.Config.Entrypoint...) - cmd = append(cmd, manifest.Config.Cmd...) - - if len(cmd) == 0 { - t.Errorf("no entrypoint nor cmd found there is something wrong.") - t.Log(yaml.Marshal(manifest.Config)) - } - - t.Logf("cmd found: %v", cmd) -} +// func TestDockerPull(t *testing.T) { +// config.dockerImageInspectionTimeout = 20 + +// opts := imageOptions{ +// image: "openjdk:slim", +// credentials: dockerTypes.AuthConfig{}, +// architecture: "amd64", +// osChoice: "linux", +// } + +// manifest, err := opts.getConfigFromManifest() + +// if err != nil { +// t.Errorf("failed somewhere in get manifest %+v", err) +// return +// } + +// var cmd []string +// cmd = append(cmd, manifest.Config.Entrypoint...) +// cmd = append(cmd, manifest.Config.Cmd...) + +// if len(cmd) == 0 { +// t.Errorf("no entrypoint nor cmd found there is something wrong.") +// t.Log(yaml.Marshal(manifest.Config)) +// } + +// t.Logf("cmd found: %v", cmd) +// } + +// func TestDockerPullWithShaImageNotation(t *testing.T) { +// config.dockerImageInspectionTimeout = 20 + +// opts := imageOptions{ +// image: "spvest/azure-keyvault-webhook@sha256:38a78fde88bd3bf023606ac3a2219b0803457734cb2e7bb80b55d36450cc71f1", +// credentials: dockerTypes.AuthConfig{}, +// architecture: "amd64", +// osChoice: "linux", +// } + +// manifest, err := opts.getConfigFromManifest() + +// if err != nil { +// t.Errorf("failed somewhere in get manifest %+v", err) +// return +// } + +// var cmd []string +// cmd = append(cmd, manifest.Config.Entrypoint...) +// cmd = append(cmd, manifest.Config.Cmd...) + +// if len(cmd) == 0 { +// t.Errorf("no entrypoint nor cmd found there is something wrong.") +// t.Log(yaml.Marshal(manifest.Config)) +// } + +// t.Logf("cmd found: %v", cmd) +// } diff --git a/go.mod b/go.mod index e5acf4e7..23522830 100644 --- a/go.mod +++ b/go.mod @@ -3,38 +3,28 @@ module github.com/SparebankenVest/azure-key-vault-to-kubernetes go 1.13 require ( + emperror.dev/errors v0.8.0 github.com/Azure/aad-pod-identity v1.6.3 github.com/Azure/azure-sdk-for-go v40.5.0+incompatible github.com/Azure/go-autorest/autorest v0.11.4 github.com/Azure/go-autorest/autorest/adal v0.9.0 github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 - github.com/Azure/go-autorest/autorest/to v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.2.0 // indirect github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc - github.com/containers/image/v5 v5.3.0 - github.com/ghodss/yaml v1.0.0 - github.com/google/go-cmp v0.5.2 // indirect + github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 + github.com/docker/go-connections v0.4.0 // indirect github.com/gorilla/mux v1.7.4 - github.com/klauspost/compress v1.10.10 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/mattn/go-colorable v0.1.7 // indirect - github.com/morikuni/aec v1.0.0 // indirect - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/onsi/ginkgo v1.13.0 // indirect - github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 + github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5 + github.com/opencontainers/image-spec v1.0.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.1.0 github.com/sirupsen/logrus v1.6.0 github.com/slok/kubewebhook v0.4.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.1 - github.com/stretchr/testify v1.6.1 // indirect + github.com/stretchr/testify v1.6.1 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect - golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v2 v2.3.0 + istio.io/pkg v0.0.0-20201002213810-7a3a61d8b48a k8s.io/api v0.17.2 k8s.io/apimachinery v0.17.2 k8s.io/client-go v0.17.2 diff --git a/go.sum b/go.sum index 1af74685..2f93a424 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR 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.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -14,6 +15,8 @@ contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRq contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +emperror.dev/errors v0.8.0 h1:4lycVEx0sdJkwDUfQ9pdu6SR0x7rgympt5f4+ok8jDk= +emperror.dev/errors v0.8.0/go.mod h1:YcRvLPh626Ubn2xqtoprejnA5nFha+TJ+2vew48kWuE= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= github.com/Azure/aad-pod-identity v1.6.3 h1:S9ucEc0Fjlj3nLJhEItjxhHySgYzU5i+mer9fo+Fu4M= @@ -57,9 +60,11 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtO github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.0 h1:z20OWOSG5aCye0HEkDp6TPmP17ZcfeMxPi6HnSALa8c= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0 h1:nQOZzFCudTh+TvquAtCRjM01VEYx85e9qbwt5ncW4L8= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0 h1:ISSNzGUh+ZSzizJWOWzs8bwpXIePbGLW4z/AmUFGH5A= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= @@ -81,6 +86,7 @@ github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZ github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= github.com/PuerkitoBio/purell v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -90,6 +96,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdko github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 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/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -105,6 +112,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.35.2 h1:qK+noh6b9KW+5CP1NmmWsQCUbnzucSGrjHEs69MEl6A= +github.com/aws/aws-sdk-go v1.35.2/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= 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= @@ -170,6 +179,10 @@ github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TR github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65 h1:4zlOyrJUbYnrvlzChJ+jP2J3i77Jbhm336NEuCv7kZo= github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af h1:ujR+JcSHkOZMctuIgvi+a/VHpTn0nSy0W7eV5p34xjg= +github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bPlG8QMY64VeXtVfjmjIlzaQok5Q= github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U= @@ -178,6 +191,9 @@ github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGl github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969 h1:p2WzwcFof6KwsloLgCiAKkU5DJSVgOKGdevswAmskvY= github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -198,6 +214,7 @@ github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -213,11 +230,16 @@ github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= 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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -256,7 +278,22 @@ github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= 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= @@ -264,12 +301,15 @@ github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34= +github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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= @@ -286,12 +326,30 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.17.2-0.20190909185456-6163a8a79084/go.mod h1:jXakAOSd+FMU9dP3D6IfBK7HyD1q/RLHI9NOY8veycY= +github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -323,10 +381,12 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285 h1:pBGAMRKP7Tpv4mOq+RgzKz+jAj+ylo9O8PiNoMmCuu8= github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 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.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 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/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -357,12 +417,16 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5 h1:6ZR6HQ+P9ZUwHlYq+bU7e9wqAImxKUguq8fp2gZSgCo= +github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5/go.mod h1:Yho0S7KhsnHQRCC5lDraYF1SsLMeWtf/tKdufKu3TJA= +github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -371,7 +435,11 @@ github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +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/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/go-ogle-analytics v0.0.0-20161213085824-14b04e0594ef/go.mod h1:PlwhC7q1VSK73InDzdDatVetQrTsQHIbOvcJAZzitY0= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -388,12 +456,17 @@ github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQ github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= 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/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I= github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/pgzip v1.2.2 h1:8d4I0LDiieuGngsqlqOih9ker/NS0LX4V0i+EhiFWg0= github.com/klauspost/pgzip v1.2.2/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= @@ -411,6 +484,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -429,6 +504,7 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -438,10 +514,12 @@ github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceT github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= 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 v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -454,10 +532,15 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= +github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= +github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= @@ -475,6 +558,7 @@ github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 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.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= @@ -502,7 +586,10 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= @@ -526,6 +613,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= 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 v0.9.4/go.mod h1:oCXIBxdI62A4cR6aTRJCgetEjecSIYzOEaeAn4iYEpM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= @@ -549,19 +637,30 @@ github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURm github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/prom2json v1.1.0/go.mod h1:v7OY1795b9fEUZgq4UU2+15YjRv0LfpxKejIQCy3L7o= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= @@ -577,23 +676,32 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= 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.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= 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.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -617,16 +725,23 @@ github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= 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/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +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.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE= @@ -653,15 +768,21 @@ go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/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.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 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-20190211182817-74369b46fc67/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-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -697,9 +818,11 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc 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/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -713,6 +836,7 @@ golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn 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 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -722,6 +846,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -734,7 +859,9 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ 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-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/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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= @@ -744,6 +871,7 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h 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-20181206074257-70b957f3b65e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -758,11 +886,13 @@ golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -775,6 +905,7 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -782,21 +913,28 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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-20181011042414-1f849cf54d09/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-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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 h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/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-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/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-20190521203540-521d6ed310dd/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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -845,7 +983,9 @@ google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= @@ -856,6 +996,7 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= 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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= @@ -867,11 +1008,13 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= 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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -883,6 +1026,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/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.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= @@ -897,6 +1041,9 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh 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= +istio.io/api v0.0.0-20190515205759-982e5c3888c6/go.mod h1:hhLFQmpHia8zgaM37vb2ml9iS5NfNfqZGRt1pS9aVEo= +istio.io/pkg v0.0.0-20201002213810-7a3a61d8b48a h1:TGdNrwOIo6HGql49hw8ZiHyxUHK2MuKrtrs/ESGI8lY= +istio.io/pkg v0.0.0-20201002213810-7a3a61d8b48a/go.mod h1:p6wktGBjkjL3spRSsyfOh0XkuKb8IuBX61rERHfmSbU= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b h1:38Nx0U83WjBqn1hUWxlgKc7mvH7WhyHfypxeW3zWwCQ= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/api v0.0.0-20191114100352-16d7abae0d2a/go.mod h1:qetVJgs5i8jwdFIdoOZ70ks0ecgU+dYwqZ2uD1srwOU= @@ -927,6 +1074,8 @@ k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.3.0 h1:WmkrnW7fdrm0/DMClc+HIxtftvxVIPAhlVwMQo5yLco= +k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-aggregator v0.0.0-20191114103820-f023614fb9ea/go.mod h1:LlqyQuTxPHvUzmEgT71Cl/BB86o5+UcbN1LiGgSz94U= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= @@ -943,6 +1092,9 @@ modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= @@ -952,3 +1104,4 @@ sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index 030b89e4..b774d106 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -22,7 +22,7 @@ import ( "github.com/Azure/go-autorest/autorest/adal" "github.com/Azure/go-autorest/autorest/azure" - docker "github.com/containers/image/v5/types" + dockerTypes "github.com/docker/docker/api/types" log "github.com/sirupsen/logrus" ) @@ -34,8 +34,8 @@ var ( // GetAcrCredentials will get Docker credentials for Azure Container Registry // It will either get a exact match to the login server for the image (eg xxx.azureacr.io) or // get credentials for a wildcard match (eg *.azureacr.io* or *.azureacr.cn*) -func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*docker.DockerAuthConfig, error) { - cred := &docker.DockerAuthConfig{ +func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*dockerTypes.AuthConfig, error) { + cred := &dockerTypes.AuthConfig{ Username: "", Password: "", } @@ -56,7 +56,7 @@ func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*docker. } } } else { - return &docker.DockerAuthConfig{ + return &dockerTypes.AuthConfig{ Username: c.config.AADClientID, Password: c.config.AADClientSecret, }, nil @@ -70,7 +70,7 @@ func (c CloudConfigCredentialProvider) IsAcrRegistry(image string) bool { return parseACRLoginServerFromImage(image, c.environment) != "" } -func getACRDockerEntryFromARMToken(config *AzureCloudConfig, env azure.Environment, token *adal.ServicePrincipalToken, loginServer string) (*docker.DockerAuthConfig, error) { +func getACRDockerEntryFromARMToken(config *AzureCloudConfig, env azure.Environment, token *adal.ServicePrincipalToken, loginServer string) (*dockerTypes.AuthConfig, error) { // Run EnsureFresh to make sure the token is valid and does not expire // if err := token.EnsureFresh(); err != nil { // return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err) @@ -98,7 +98,7 @@ func getACRDockerEntryFromARMToken(config *AzureCloudConfig, env azure.Environme } log.Debugf("adding ACR docker config entry for: %s", loginServer) - return &docker.DockerAuthConfig{ + return &dockerTypes.AuthConfig{ Username: dockerTokenLoginUsernameGUID, Password: registryRefreshToken, }, nil diff --git a/pkg/docker/registry/container.go b/pkg/docker/registry/container.go new file mode 100644 index 00000000..564f3f0e --- /dev/null +++ b/pkg/docker/registry/container.go @@ -0,0 +1,247 @@ +// Copyright © 2019 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on bank-vaults from Banzai Cloud +// (https://github.com/banzaicloud/bank-vaults) + +package registry + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "os" + "strings" + + "emperror.dev/errors" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" + "istio.io/pkg/log" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +// K8s structure keeps information retrieved from POD definition +type ContainerInfo struct { + clientset kubernetes.Interface + Namespace string + ImagePullSecrets string + RegistryAddress string + RegistryName string + Image string + RegistryUsername string + RegistryPassword string +} + +// Collect reads information from k8s and load them into the structure +func (k *ContainerInfo) Collect(container *corev1.Container, podSpec *corev1.PodSpec, cloudConfigPath string) error { + k.Image = k.fixDockerHubImage(container.Image) + + var err error + found := false + // Check for registry credentials in imagePullSecrets attached to the pod + // ImagePullSecrets attached to ServiceAccounts do not have to be considered + // explicitly as ServiceAccount ImagePullSecrets are automatically attached + // to a pod. + for _, imagePullSecret := range podSpec.ImagePullSecrets { + found, err = k.checkImagePullSecret(k.Namespace, imagePullSecret.Name) + if err != nil { + return err + } + + if found { + log.Infof("found credentials for registry %s in pod imagePullSecret: %s/%s", k.RegistryName, k.Namespace, imagePullSecret.Name) + break + } + } + + // In case of other docker registry + if k.RegistryName == "" && k.RegistryAddress == "" { + registryName := container.Image + if strings.HasPrefix(registryName, "https://") { + registryName = strings.TrimPrefix(registryName, "https://") + } + + registryName = strings.Split(registryName, "/")[0] + k.RegistryName = registryName + k.RegistryAddress = fmt.Sprintf("https://%s", registryName) + } + + // Clean registry from image + k.Image = strings.TrimPrefix(k.Image, fmt.Sprintf("%s/", k.RegistryName)) + + if !found { + // if still no credentials and it is an ACR image, try to get credentials from Azure + if found, err = getAcrCredentials(k, cloudConfigPath); err != nil { + return err + } + + if !found { + log.Infof("found no credentials for registry %s, assuming it is public", k.RegistryAddress) + } + } + return nil +} + +func (k *ContainerInfo) checkImagePullSecret(namespace string, secret string) (bool, error) { + data, err := k.readDockerSecret(namespace, secret) + if err != nil { + return false, errors.Wrapf(err, "cannot read imagePullSecret %s.%s", secret, namespace) + } + + var dockercfg []byte + keys := []string{corev1.DockerConfigJsonKey, corev1.DockerConfigKey} + for _, key := range keys { + if dockercfg = data[key]; dockercfg != nil { + break + } + } + + if dockercfg == nil { + return false, errors.Errorf("cannot find any dockercfg key %v in imagePullSecret: %s.%s", keys, secret, namespace) + } + + var dockerCreds DockerCreds + err = json.Unmarshal(dockercfg, &dockerCreds) + if err != nil { + return false, errors.Wrap(err, "cannot unmarshal docker configuration from imagePullSecret") + } + + found, err := k.parseDockerConfig(dockerCreds) + return found, err +} + +func getAcrCredentials(k *ContainerInfo, cloudConfigPath string) (bool, error) { + //Check if cloud config file exists + _, err := os.Stat(cloudConfigPath) + if err != nil { + return false, nil + } + + f, err := os.Open(cloudConfigPath) + if err != nil { + return false, fmt.Errorf("Failed reading azure config from %s, error: %w", cloudConfigPath, err) + } + defer f.Close() + + cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) + if err != nil { + return false, fmt.Errorf("Failed reading azure config from %s, error: %w", cloudConfigPath, err) + } + + if cloudCnfProvider.IsAcrRegistry(k.RegistryAddress) { + cred, err := cloudCnfProvider.GetAcrCredentials(k.Image) + if err != nil { + return false, fmt.Errorf("failed getting azure acr credentials, error: %w", err) + } + + log.Debugf("found acr credentials to use in cloud config for '%s'", k.Image) + k.RegistryUsername = cred.Username + k.RegistryPassword = cred.Password + return true, nil + } + + log.Debugf("no acr credentials found for %s", k.RegistryAddress) + return false, nil +} + +func (k *ContainerInfo) readDockerSecret(namespace, secretName string) (map[string][]byte, error) { + secret, err := k.clientset.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{}) + if err != nil { + return nil, err + } + return secret.Data, nil +} + +func (k *ContainerInfo) parseDockerConfig(dockerCreds DockerCreds) (bool, error) { + for registryName, registryAuth := range dockerCreds.Auths { + if strings.HasPrefix(registryName, "https://") { + registryName = strings.TrimPrefix(registryName, "https://") + } + + // kubectl create secret docker-registry for DockerHub creates + // registry credentials with API version suffixes, trim it! + if strings.HasSuffix(registryName, "/v1/") { + registryName = strings.TrimSuffix(registryName, "/v1/") + } else if strings.HasSuffix(registryName, "/v2/") { + registryName = strings.TrimSuffix(registryName, "/v2/") + } + + registryName = strings.TrimSuffix(registryName, "/") + + if strings.HasPrefix(k.Image, registryName) { + k.RegistryName = registryName + if registryAuth.ServerAddress != "" { + k.RegistryAddress = registryAuth.ServerAddress + } else { + k.RegistryAddress = fmt.Sprintf("https://%s", registryName) + } + if len(registryAuth.Username) > 0 && len(registryAuth.Password) > 0 { + // auths..username and auths..username are present + // in the config.json, use them + k.RegistryUsername = registryAuth.Username + k.RegistryPassword = registryAuth.Password + } else if len(registryAuth.Auth) > 0 { + // auths..username and auths..username are not present + // in the config.json, fall back to the base64 encoded auths..auth field + // The registry.Auth field contains a base64 encoded string of the format : + decodedAuth, err := base64.StdEncoding.DecodeString(registryAuth.Auth) + if err != nil { + return false, errors.Wrapf(err, "failed to decode auth field for registry %s", registryName) + } + auth := strings.Split(string(decodedAuth), ":") + if len(auth) != 2 { + return false, errors.Errorf("unexpected number of elements in auth field for registry %s: %d (expected 2)", registryName, len(auth)) + } + // decodedAuth is something like ":xxx" + if len(auth[0]) <= 0 { + return false, errors.Errorf("username element of auth field for registry %s missing", registryName) + } + // decodedAuth is something like "xxx:" + if len(auth[1]) <= 0 { + return false, errors.Errorf("password element of auth field for registry %s missing", registryName) + } + k.RegistryUsername = auth[0] + k.RegistryPassword = auth[1] + } else { + // the auths section has an entry for the registry, but it neither contains + // username/password fields nor an auth field, fail + return false, errors.Errorf("found %s in imagePullSecrets but it contains no usable credentials; either username/password fields or an auth field are required", registryName) + } + + return true, nil + } + } + + return false, nil +} + +func (k *ContainerInfo) fixDockerHubImage(image string) string { + slash := strings.Index(image, "/") + if slash == -1 { // Is it a DockerHub library repository? + image = "index.docker.io/library/" + image + } else if !strings.Contains(image[:slash], ".") { // DockerHub organization names can't contain '.' + image = "index.docker.io/" + image + } else if strings.HasPrefix(image, "docker.io/") { + image = "index." + image + } else { + return image + } + + // if in the end there is no RegistryAddress defined it should be a public DockerHub repository + k.RegistryAddress = "https://index.docker.io" + k.RegistryName = "index.docker.io" + + return image +} diff --git a/pkg/docker/registry/registry.go b/pkg/docker/registry/registry.go new file mode 100644 index 00000000..28d6a3bd --- /dev/null +++ b/pkg/docker/registry/registry.go @@ -0,0 +1,110 @@ +// Copyright © 2019 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on bank-vaults from Banzai Cloud +// (https://github.com/banzaicloud/bank-vaults) + +package registry + +import ( + "encoding/json" + "io/ioutil" + "strings" + + "emperror.dev/errors" + dockerTypes "github.com/docker/docker/api/types" + "github.com/heroku/docker-registry-client/registry" + imagev1 "github.com/opencontainers/image-spec/specs-go/v1" + log "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/kubernetes" +) + +type DockerCreds struct { + Auths map[string]dockerTypes.AuthConfig `json:"auths"` +} + +// GetImageConfig returns entrypoint and command of container +func GetImageConfig(clientset kubernetes.Interface, namespace string, container *corev1.Container, podSpec *corev1.PodSpec, cloudConfigPath string) (*imagev1.ImageConfig, error) { + containerInfo := ContainerInfo{Namespace: namespace, clientset: clientset} + + err := containerInfo.Collect(container, podSpec, cloudConfigPath) + if err != nil { + return nil, err + } + + log.Infoln("using registry", containerInfo.RegistryAddress) + + imageConfig, err := getImageBlob(containerInfo) + return imageConfig, err +} + +// GetImageBlob download image blob from registry +func getImageBlob(container ContainerInfo) (*imagev1.ImageConfig, error) { + imageName, reference := parseContainerImage(container.Image) + + hub, err := registry.New(container.RegistryAddress, container.RegistryUsername, container.RegistryPassword) + if err != nil { + return nil, errors.Wrap(err, "cannot create client for doker registry") + } + + manifest, err := hub.ManifestV2(imageName, reference) + if err != nil { + return nil, errors.Wrap(err, "cannot download manifest for docker image") + } + + reader, err := hub.DownloadBlob(imageName, manifest.Config.Digest) + if err != nil { + return nil, errors.Wrap(err, "cannot download blob from docker manifest") + } + + defer reader.Close() + + b, err := ioutil.ReadAll(reader) + if err != nil { + return nil, errors.Wrap(err, "cannot read blob from docker manifest") + } + + var imageMetadata imagev1.Image + err = json.Unmarshal(b, &imageMetadata) + if err != nil { + return nil, errors.Wrap(err, "cannot unmarshal BlobResponse JSON from docker manifest") + } + + return &imageMetadata.Config, nil +} + +// parseContainerImage returns image and reference +func parseContainerImage(image string) (string, string) { + var split []string + + if strings.Contains(image, "@") { + split = strings.SplitN(image, "@", 2) + subsplit := strings.SplitN(split[0], ":", 2) + if len(subsplit) > 1 { + split[0] = subsplit[0] + } + } else { + split = strings.SplitN(image, ":", 2) + } + + imageName := split[0] + reference := "latest" + + if len(split) > 1 { + reference = split[1] + } + + return imageName, reference +} diff --git a/pkg/docker/registry/regitstry_test.go b/pkg/docker/registry/regitstry_test.go new file mode 100644 index 00000000..6f58b908 --- /dev/null +++ b/pkg/docker/registry/regitstry_test.go @@ -0,0 +1,129 @@ +// Copyright © 2019 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on bank-vaults from Banzai Cloud +// (https://github.com/banzaicloud/bank-vaults) + +package registry + +import ( + "testing" + + "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" +) + +func TestParsingRegistryAddress(t *testing.T) { + tests := []struct { + container *corev1.Container + podSpec *corev1.PodSpec + registryAddress string + }{ + { + container: &corev1.Container{ + Image: "foo:bar", + }, + podSpec: &corev1.PodSpec{}, + registryAddress: "https://index.docker.io", + }, + { + container: &corev1.Container{ + Image: "foo", + }, + podSpec: &corev1.PodSpec{}, + registryAddress: "https://index.docker.io", + }, + { + container: &corev1.Container{ + Image: "library/foo:latest", + }, + podSpec: &corev1.PodSpec{}, + registryAddress: "https://index.docker.io", + }, + { + container: &corev1.Container{ + Image: "index.docker.io/foo:latest", + }, + podSpec: &corev1.PodSpec{}, + registryAddress: "https://index.docker.io", + }, + { + container: &corev1.Container{ + Image: "foo:bar", + }, + podSpec: &corev1.PodSpec{}, + registryAddress: "https://index.docker.io", + }, + { + container: &corev1.Container{ + Image: "docker.io/foo:bar", + }, + podSpec: &corev1.PodSpec{}, + registryAddress: "https://index.docker.io", + }, + { + container: &corev1.Container{ + Image: "docker.pkg.github.com/banzaicloud/bank-vaults/vault-env:0.6.0", + }, + podSpec: &corev1.PodSpec{}, + registryAddress: "https://docker.pkg.github.com", + }, + } + + for _, test := range tests { + containerInfo := ContainerInfo{} + + err := containerInfo.Collect(test.container, test.podSpec, "") + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, test.registryAddress, containerInfo.RegistryAddress) + } +} + +func TestParseContainerImage(t *testing.T) { + tests := []struct { + image string + repo string + tag string + }{ + { + image: "docker-repo.banana.xyz/testing/skaffold-python-example:508954f-dirty@sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7", + repo: "docker-repo.banana.xyz/testing/skaffold-python-example", + tag: "sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7", + }, + { + image: "docker-repo.banana.xyz/testing/skaffold-python-example@sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7", + repo: "docker-repo.banana.xyz/testing/skaffold-python-example", + tag: "sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7", + }, + { + image: "alpine:latest", + repo: "alpine", + tag: "latest", + }, + { + image: "alpine", + repo: "alpine", + tag: "latest", + }, + } + + for _, test := range tests { + repo, tag := parseContainerImage(test.image) + assert.Equal(t, test.repo, repo, test.image) + assert.Equal(t, test.tag, tag, test.image) + } +} From 56f69dcee333a0fe26a3a95c2134efa8219a62f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 4 Oct 2020 08:03:36 +0200 Subject: [PATCH 152/251] controller: only add akvs changes to queue when resource version differs --- cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 88ff5e92..83de3bd1 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -61,7 +61,7 @@ func (c *Controller) initAzureKeyVaultSecret() { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } - if newSecret.ResourceVersion != oldSecret.ResourceVersion { + if newSecret.ResourceVersion == oldSecret.ResourceVersion { return } // if newSecret.ResourceVersion == oldSecret.ResourceVersion { From a2111813360e82df4ce34b4dbb5cd8bb9c258ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 4 Oct 2020 11:03:54 +0200 Subject: [PATCH 153/251] controller: remove fast/slow worker for azure key vault, and use default rate limiter --- .../controller/azureKeyVaultSecret.go | 17 ++- .../controller/controller.go | 22 ++-- .../controller/fastSlowWorker.go | 110 ------------------ 3 files changed, 19 insertions(+), 130 deletions(-) delete mode 100644 cmd/azure-keyvault-controller/controller/fastSlowWorker.go diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 83de3bd1..df3e08fb 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -47,7 +47,7 @@ func (c *Controller) initAzureKeyVaultSecret() { if c.akvsHasSecretOutput(secret) { log.Debugf("AzureKeyVaultSecret %s/%s added. Adding to queue.", secret.Namespace, secret.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) - queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), obj) + // queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), obj) } }, UpdateFunc: func(old, new interface{}) { @@ -61,14 +61,12 @@ func (c *Controller) initAzureKeyVaultSecret() { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } + // If akvs has not changed, add to akv queue to check if secret has changed in akv if newSecret.ResourceVersion == oldSecret.ResourceVersion { + log.Debugf("AzureKeyVaultSecret not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newSecret.Namespace, newSecret.Name) + queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } - // if newSecret.ResourceVersion == oldSecret.ResourceVersion { - // log.Debugf("AzureKeyVaultSecret %s/%s changed and diffs in resource version. Adding to Azure Key Vault queue.", newSecret.Namespace, newSecret.Name) - // queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) - // return - // } if c.akvsHasSecretOutput(newSecret) || c.akvsHasSecretOutput(oldSecret) { log.Debugf("AzureKeyVaultSecret %s/%s changed. Adding to queue.", newSecret.Namespace, newSecret.Name) @@ -269,14 +267,15 @@ func (c *Controller) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.Az func handleKeyVaultError(err error, key string) bool { log.Debugf("Handling error for '%s' in AzureKeyVaultSecret: %s", key, err.Error()) + exit := false if err != nil { // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. if errors.IsNotFound(err) { log.Debugf("Error for '%s' was 'Not Found'", key) - utilruntime.HandleError(fmt.Errorf("AzureKeyVaultSecret '%s' in work queue no longer exists", key)) - return true + log.Errorf("AzureKeyVaultSecret '%s' in work queue no longer exists", key) + exit = true } } - return false + return exit } diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 07888838..c358a616 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -84,13 +84,13 @@ type Controller struct { // Secret secretsLister corelisters.SecretLister secretInformerFactory informers.SharedInformerFactory - akvsSecretQueue *queue.Worker //workqueue.RateLimitingInterface + akvsSecretQueue *queue.Worker // AzureKeyVaultSecret azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister akvsInformerFactory akvInformers.SharedInformerFactory - akvsCrdQueue *queue.Worker //workqueue.RateLimitingInterface - azureKeyVaultQueue *FastSlowWorker //workqueue.RateLimitingInterface + akvsCrdQueue *queue.Worker + azureKeyVaultQueue *queue.Worker // CA Bundle caBundleSecretQueue *queue.Worker @@ -101,12 +101,12 @@ type Controller struct { // Namespace namespaceLister corelisters.NamespaceLister namespaceInformerFactory informers.SharedInformerFactory - namespaceQueue *queue.Worker //workqueue.RateLimitingInterface + namespaceQueue *queue.Worker // ConfigMap configMapLister corelisters.ConfigMapLister configMapInformerFactory informers.SharedInformerFactory - configMapQueue *queue.Worker //workqueue.RateLimitingInterface + configMapQueue *queue.Worker options *Options clock Timer @@ -158,7 +158,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) controller.akvsSecretQueue = queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, controller.syncSecret) - controller.azureKeyVaultQueue = NewFastSlowWorker("AzureKeyVault", azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown, options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) + controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) controller.caBundleSecretQueue = queue.New("CABundleSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleSecret) log.Info("Setting up event handlers") @@ -191,14 +191,14 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } } - log.Debug("Starting Azure Key Vault queue") - c.azureKeyVaultQueue.Run(stopCh) - log.Debug("Starting Azure Key Vault Secret queue") c.akvsCrdQueue.Run(stopCh) - log.Debug("Starting CA Bundle Secret queue") - c.caBundleSecretQueue.Run(stopCh) + log.Debug("Starting Secret queue for Azure Key Vault Secrets") + c.akvsSecretQueue.Run(stopCh) + + log.Debug("Starting Azure Key Vault queue") + c.azureKeyVaultQueue.Run(stopCh) log.Info("Started workers") <-stopCh diff --git a/cmd/azure-keyvault-controller/controller/fastSlowWorker.go b/cmd/azure-keyvault-controller/controller/fastSlowWorker.go deleted file mode 100644 index 8e60b823..00000000 --- a/cmd/azure-keyvault-controller/controller/fastSlowWorker.go +++ /dev/null @@ -1,110 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "time" - - "github.com/appscode/go/runtime" - "github.com/appscode/go/wait" - log "github.com/sirupsen/logrus" - - "k8s.io/client-go/util/workqueue" -) - -type FastSlowWorker struct { - name string - queue workqueue.RateLimitingInterface - maxRetries int - threadiness int - reconcile func(key string) error -} - -func NewFastSlowWorker(name string, normalFreq time.Duration, slowFreq time.Duration, maxFailSlow int, maxRetries, threadiness int, fn func(key string) error) *FastSlowWorker { - rl := workqueue.NewItemFastSlowRateLimiter(normalFreq, slowFreq, maxFailSlow) - q := workqueue.NewNamedRateLimitingQueue(rl, name) - return &FastSlowWorker{name, q, maxRetries, threadiness, fn} -} - -func (w *FastSlowWorker) GetQueue() workqueue.RateLimitingInterface { - return w.queue -} - -func (w *FastSlowWorker) processQueue() { - for w.processNextEntry() { - } -} - -// ProcessMessage tries to process the next message in the Queue, and requeues on an error -func (w *FastSlowWorker) processNextEntry() bool { - // Wait until there is a new item in the working queue - key, quit := w.queue.Get() - if quit { - return false - } - // Tell the queue that we are done with processing this key. This unblocks the key for other workers - // This allows safe parallel processing because two deployments with the same key are never processed in - // parallel. - defer w.queue.Done(key) - - // Invoke the method containing the business logic - err := w.reconcile(key.(string)) - if err == nil { - // Forget about the #AddRateLimited history of the key on every successful synchronization. - // This ensures that future processing of updates for this key is not delayed because of - // an outdated error history. - w.queue.Forget(key) - return true - } - log.Errorf("Failed to process key %v. Reason: %s", key, err) - - // This controller retries 5 times if something goes wrong. After that, it stops trying. - if w.queue.NumRequeues(key) < w.maxRetries { - log.Infof("Error syncing key %v: %v", key, err) - - // Re-enqueue the key rate limited. Based on the rate limiter on the - // queue and the re-enqueue history, the key will be processed later again. - w.queue.AddRateLimited(key) - return true - } - - w.queue.Forget(key) - // Report to an external entity that, even after several retries, we could not successfully process this key - runtime.HandleError(err) - log.Infof("Dropping key %q out of the queue: %v", key, err) - return true -} - -func (w *FastSlowWorker) Run(shutdown <-chan struct{}) { - defer runtime.HandleCrash() - - // Every second, process all messages in the Queue until it is time to shutdown - for i := 0; i < w.threadiness; i++ { - go wait.Until(w.processQueue, time.Second, shutdown) - } - - go func() { - <-shutdown - - // Stop accepting messages into the Queue - log.Infof("Shutting down %s Queue\n", w.name) - w.queue.ShutDown() - }() -} From bb0be5f3dfe52c478bc3b29779bb4552f411e4ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 4 Oct 2020 11:10:13 +0200 Subject: [PATCH 154/251] controller: add missing mormatting directive --- cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index df3e08fb..eac0b866 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -63,7 +63,7 @@ func (c *Controller) initAzureKeyVaultSecret() { // If akvs has not changed, add to akv queue to check if secret has changed in akv if newSecret.ResourceVersion == oldSecret.ResourceVersion { - log.Debugf("AzureKeyVaultSecret not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newSecret.Namespace, newSecret.Name) + log.Debugf("AzureKeyVaultSecret %s/%s not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newSecret.Namespace, newSecret.Name) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } From 23ee273270fe98d1d110f17119fc96d04460cbea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 4 Oct 2020 12:51:48 +0200 Subject: [PATCH 155/251] controller: validate akvs has secret output name in crd, on akvs found referenced by secret --- .../controller/azureeKeyVaultSecret_test.go | 38 +++++++++++++++++++ .../controller/secret.go | 4 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go diff --git a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go new file mode 100644 index 00000000..d707e687 --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go @@ -0,0 +1,38 @@ +/* +Copyright Sparebanken Vest + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "testing" + + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" +) + +func TestNullLookup(t *testing.T) { + secret := akv.AzureKeyVaultSecret{ + Spec: akv.AzureKeyVaultSecretSpec{ + Output: akv.AzureKeyVaultOutput{ + Secret: akv.AzureKeyVaultOutputSecret{ + // Name: "laskjdflj", + }, + }, + }, + } + if secret.Spec.Output.Secret.Name != "" { + t.Fail() + } +} diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 7e455dbd..c284c787 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -129,7 +129,9 @@ func (c *Controller) syncSecret(key string) error { return err } - queue.Enqueue(c.akvsCrdQueue.GetQueue(), azureKeyVaultSecret) + if c.akvsHasSecretOutput(azureKeyVaultSecret) { + queue.Enqueue(c.akvsCrdQueue.GetQueue(), azureKeyVaultSecret) + } } return nil } From f8181a5a2fbc1f5dcd75dcea9ff9b99f5ff28613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 4 Oct 2020 13:17:24 +0200 Subject: [PATCH 156/251] pkg/docker: handle secret lookup when no namespace is set by using default --- pkg/docker/registry/container.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/docker/registry/container.go b/pkg/docker/registry/container.go index 564f3f0e..5f5bacd9 100644 --- a/pkg/docker/registry/container.go +++ b/pkg/docker/registry/container.go @@ -157,7 +157,12 @@ func getAcrCredentials(k *ContainerInfo, cloudConfigPath string) (bool, error) { } func (k *ContainerInfo) readDockerSecret(namespace, secretName string) (map[string][]byte, error) { - secret, err := k.clientset.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{}) + ns := "default" + if namespace != "" { + ns = namespace + } + + secret, err := k.clientset.CoreV1().Secrets(ns).Get(secretName, metav1.GetOptions{}) if err != nil { return nil, err } From 9b76d24f0cee027f84b055c30ec9997064ce5fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 5 Oct 2020 11:51:26 +0200 Subject: [PATCH 157/251] pkg/docker: handle default namespace for image pull secrets --- pkg/docker/registry/container.go | 7 +------ pkg/docker/registry/registry.go | 6 +++++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pkg/docker/registry/container.go b/pkg/docker/registry/container.go index 5f5bacd9..564f3f0e 100644 --- a/pkg/docker/registry/container.go +++ b/pkg/docker/registry/container.go @@ -157,12 +157,7 @@ func getAcrCredentials(k *ContainerInfo, cloudConfigPath string) (bool, error) { } func (k *ContainerInfo) readDockerSecret(namespace, secretName string) (map[string][]byte, error) { - ns := "default" - if namespace != "" { - ns = namespace - } - - secret, err := k.clientset.CoreV1().Secrets(ns).Get(secretName, metav1.GetOptions{}) + secret, err := k.clientset.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{}) if err != nil { return nil, err } diff --git a/pkg/docker/registry/registry.go b/pkg/docker/registry/registry.go index 28d6a3bd..15be202f 100644 --- a/pkg/docker/registry/registry.go +++ b/pkg/docker/registry/registry.go @@ -37,7 +37,11 @@ type DockerCreds struct { // GetImageConfig returns entrypoint and command of container func GetImageConfig(clientset kubernetes.Interface, namespace string, container *corev1.Container, podSpec *corev1.PodSpec, cloudConfigPath string) (*imagev1.ImageConfig, error) { - containerInfo := ContainerInfo{Namespace: namespace, clientset: clientset} + ns := "default" + if namespace != "" { + ns = namespace + } + containerInfo := ContainerInfo{Namespace: ns, clientset: clientset} err := containerInfo.Collect(container, podSpec, cloudConfigPath) if err != nil { From bf39c3746ab2dacd6111b17703d885833225f77f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 6 Oct 2020 00:14:39 +0200 Subject: [PATCH 158/251] controller: make sure akvs updates has secret output before passing on to akv sync --- .../controller/azureKeyVaultSecret.go | 6 +++--- cmd/azure-keyvault-controller/controller/secret.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index eac0b866..7078db1c 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -61,8 +61,8 @@ func (c *Controller) initAzureKeyVaultSecret() { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } - // If akvs has not changed, add to akv queue to check if secret has changed in akv - if newSecret.ResourceVersion == oldSecret.ResourceVersion { + // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv + if newSecret.ResourceVersion == oldSecret.ResourceVersion && c.akvsHasSecretOutput(newSecret) { log.Debugf("AzureKeyVaultSecret %s/%s not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newSecret.Namespace, newSecret.Name) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return @@ -115,7 +115,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { var secret *corev1.Secret var err error - log.Infof("Processing AzureKeyVaultSecret %s", key) + log.Debugf("Processing AzureKeyVaultSecret %s", key) if azureKeyVaultSecret, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index c284c787..d245f488 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -174,7 +174,7 @@ func (c *Controller) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureK return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name") } - log.Infof("Get or create secret %s in namespace %s", secretName, azureKeyVaultSecret.Namespace) + log.Debugf("Get or create secret %s in namespace %s", secretName, azureKeyVaultSecret.Namespace) if secret, err = c.secretsLister.Secrets(azureKeyVaultSecret.Namespace).Get(secretName); err != nil { if errors.IsNotFound(err) { secretValues, err = c.getSecretFromKeyVault(azureKeyVaultSecret) From a2b20d038364e0f8eb20d3ac7a21bcf92ce09b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 6 Oct 2020 00:23:35 +0200 Subject: [PATCH 159/251] controller: enabled CA Bundle in main controller --- cmd/azure-keyvault-controller/controller/controller.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index c358a616..a24b6d27 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -191,15 +191,18 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } } - log.Debug("Starting Azure Key Vault Secret queue") + log.Info("Starting Azure Key Vault Secret queue") c.akvsCrdQueue.Run(stopCh) - log.Debug("Starting Secret queue for Azure Key Vault Secrets") + log.Info("Starting Secret queue for Azure Key Vault Secrets") c.akvsSecretQueue.Run(stopCh) - log.Debug("Starting Azure Key Vault queue") + log.Info("Starting Azure Key Vault queue") c.azureKeyVaultQueue.Run(stopCh) + log.Info("Starting CA Bundle queue") + c.caBundleSecretQueue.Run(stopCh) + log.Info("Started workers") <-stopCh log.Info("Shutting down workers") From 8c4646a836ec5c2859e5da7bf17fa03d49c32b29 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 28 Aug 2020 23:12:03 +0000 Subject: [PATCH 160/251] fix: upgrade algoliasearch from 4.3.1 to 4.4.0 Snyk has created this PR to upgrade algoliasearch from 4.3.1 to 4.4.0. See this package in npm: https://www.npmjs.com/package/algoliasearch See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 166 ++++++++++++++++++++--------------------- docs/package.json | 2 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 17c0d97d..0dbd3608 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3,118 +3,118 @@ "lockfileVersion": 1, "dependencies": { "@algolia/cache-browser-local-storage": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.3.1.tgz", - "integrity": "sha512-pNelJomUeeQS5ZagEeUti8HltrfJbqXHnZXB1fez4Ycdm7GsEQm0r6fRCfx+1/6hqQJNo5zQUSA4ZgWi8VMs4Q==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.4.0.tgz", + "integrity": "sha512-2AiKgN7DpFypkRCRkpqH7waXXyFdcnsPWzmN8sLHrB/FfXqgmsQb3pGft+9YHZIDQ0vAnfgMxSGgMhMGW+0Qnw==", "requires": { - "@algolia/cache-common": "4.3.1" + "@algolia/cache-common": "4.4.0" } }, "@algolia/cache-common": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.3.1.tgz", - "integrity": "sha512-BgZVQKfQ3rYSKHDbEuYeIHgQ7cIqbDVUe8gPib/YI6hB2FWdt3hQyDqKslulBt65MxZ5CLSrWg8mq/qL077Bog==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.4.0.tgz", + "integrity": "sha512-PrIgoMnXaDWUfwOekahro543pgcJfgRu/nd/ZQS5ffem3+Ow725eZY6HDpPaQ1k3cvLii9JH6V2sNJConjqUKA==" }, "@algolia/cache-in-memory": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.3.1.tgz", - "integrity": "sha512-bd2Aqn8efGJpR8snjUvBJIONyQ2uqYQSbFH9rTrLPmJPMYdoTKTcVLrtpOhOlmvTTfguhqlv+zIjYdJcraeBvg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.4.0.tgz", + "integrity": "sha512-9+XlUB0baDU/Dp9URRHPp6Q37YmTO0QmgPWt9+n+wqZrRL0jR3Jezr4jCT7RemqGMxBiR+YpnqaUv0orpb0ptw==", "requires": { - "@algolia/cache-common": "4.3.1" + "@algolia/cache-common": "4.4.0" } }, "@algolia/client-account": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.3.1.tgz", - "integrity": "sha512-062Cxw61llvkeHS2bWghufNI0munw5fKGZBhUfDdnC7lsJpzYJwQdkdchzLqqIOXZa8k9vdLlnlKHk8f53E5fQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.4.0.tgz", + "integrity": "sha512-Kynu3cMEs0clTLf674rtrCF+FWR/JwlQxKlIWsPzvLBRmNXdvYej9YBcNaOr4OTQFCCZn9JVE8ib91Z7J4IL1Q==", "requires": { - "@algolia/client-common": "4.3.1", - "@algolia/client-search": "4.3.1", - "@algolia/transporter": "4.3.1" + "@algolia/client-common": "4.4.0", + "@algolia/client-search": "4.4.0", + "@algolia/transporter": "4.4.0" } }, "@algolia/client-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.3.1.tgz", - "integrity": "sha512-+/gn1z3oAh2CE0xox7/Df9SseHcOuqgm4ngSXGh1cWpldsF+gioA9HWSh/4RSydViASKu3YIk5O61zFzVTKbOA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.4.0.tgz", + "integrity": "sha512-GQyjQimKAc9sZbafxln9Wk7j4pEYiORv28MZkZ+0Bjt7WNXIeO7OgOOECVpQHm9buyV6hCKpNtJcbb5/syRzdQ==", "requires": { - "@algolia/client-common": "4.3.1", - "@algolia/client-search": "4.3.1", - "@algolia/requester-common": "4.3.1", - "@algolia/transporter": "4.3.1" + "@algolia/client-common": "4.4.0", + "@algolia/client-search": "4.4.0", + "@algolia/requester-common": "4.4.0", + "@algolia/transporter": "4.4.0" } }, "@algolia/client-common": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.3.1.tgz", - "integrity": "sha512-1dcADKy3F/gMN+s+p5yvYdF6A4L5YEY0ll4JjSHGKXvZyWLDxKjyu/ToeUuHlrutWQu9w8UT2X7urES8BZU5WQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.4.0.tgz", + "integrity": "sha512-a3yr6UhzjWPHDG/8iGp9UvrDOm1aeHVWJIf0Nj/cIvqX5tNCEIo4IMe59ovApkDgLOIpt/cLsyhn9/FiPXRhJA==", "requires": { - "@algolia/requester-common": "4.3.1", - "@algolia/transporter": "4.3.1" + "@algolia/requester-common": "4.4.0", + "@algolia/transporter": "4.4.0" } }, "@algolia/client-recommendation": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.3.1.tgz", - "integrity": "sha512-4WZ9Pa2waOkpqv5acom4f8XBBlrnafeEwcSK4R0msubHJpUdkvD/+rxT5Ya1/0FAGvBPhOvtOJqsauaJYKM2Dw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.4.0.tgz", + "integrity": "sha512-sBszbQH46rko6w2fdEG77ma8+fAg0SDkLZGxWhv4trgcnYGUBFl2dcpEPt/6koto9b4XYlf+eh+qi6iGvYqRPg==", "requires": { - "@algolia/client-common": "4.3.1", - "@algolia/requester-common": "4.3.1", - "@algolia/transporter": "4.3.1" + "@algolia/client-common": "4.4.0", + "@algolia/requester-common": "4.4.0", + "@algolia/transporter": "4.4.0" } }, "@algolia/client-search": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.3.1.tgz", - "integrity": "sha512-BGI8+8Gi3OELHtyXHflGz0Ms0DQLUQFu2Hs4us3L9gidyYhuvjl76x8EOOQRkXhQcWzEeqx+L2c2InTKtNfQfg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.4.0.tgz", + "integrity": "sha512-jqWcxCUyPPHnHreoMb2PnN9iHTP+V/nL62R84XuTRDE3VgTnhm4ZnqyuRdzZQqaz+gNy5znav64TmQ9FN9WW5g==", "requires": { - "@algolia/client-common": "4.3.1", - "@algolia/requester-common": "4.3.1", - "@algolia/transporter": "4.3.1" + "@algolia/client-common": "4.4.0", + "@algolia/requester-common": "4.4.0", + "@algolia/transporter": "4.4.0" } }, "@algolia/logger-common": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.3.1.tgz", - "integrity": "sha512-HOY89EkxFFR0LjeqE+fqaF3EeQUAYFdVdrAXsnrWhm/OsAlXiy+vsoHL4EaJLXvTQlJRBbgNyyQv8ZPAN9JLCw==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.4.0.tgz", + "integrity": "sha512-2vjmSENLaKNuF+ytRDysfWxxgFG95WXCHwHbueThdPMCK3hskkwqJ0Y/pugKfzl+54mZxegb4BYfgcCeuaHVUw==" }, "@algolia/logger-console": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.3.1.tgz", - "integrity": "sha512-aIJ2N++eTVLkwGFxb1AY60hxYIrNf3FgaEMkokPOAV7sPoWThITSQPj/2vruRLJsYZS2EnD8jxiETrCwSet7mw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.4.0.tgz", + "integrity": "sha512-st/GUWyKvr6YM72OOfF+RmpdVGda3BPXbQ+chpntUq1WyVkyZXGjSmH1IcBVlua27GzxabwOUYON39cF3x10/g==", "requires": { - "@algolia/logger-common": "4.3.1" + "@algolia/logger-common": "4.4.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.3.1.tgz", - "integrity": "sha512-aSkBWqt9IjZYzmJpP14ISO9tizjyumwAmGxnx2t/QuE3LUh/sJG2FL3Vvq44wjNk9yTPC/c1yiQA85IqeqGZ7g==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.4.0.tgz", + "integrity": "sha512-V3a4hXlNch355GnWaT1f5QfXhROpsjT6sd0Znq29gAhwLqfBExhLW6Khdkv5pENC0Qy7ClVhdXFrBL9QCQer1g==", "requires": { - "@algolia/requester-common": "4.3.1" + "@algolia/requester-common": "4.4.0" } }, "@algolia/requester-common": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.3.1.tgz", - "integrity": "sha512-2lu0gOB2Rt4mn9gKDxjB8rY2IvU4usDA8bZVGl5tf/E81kRovtDZcgZjuKQ5zMyJ/xuIYXjx+ECXAxjUnNhieA==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.4.0.tgz", + "integrity": "sha512-jPinHlFJEFokxQ5b3JWyjQKKn+FMy0hH99PApzOgQAYOSiFRXiPEZp6LeIexDeLLu7Y3eRt/3nHvjPKa6PmRRw==" }, "@algolia/requester-node-http": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.3.1.tgz", - "integrity": "sha512-CnVQ5fHJVsvOZjOIagAIWW315NwGF/spBT5o8/+9ZFTuKQTeLk8/jdj7OXKZ2+vbWkqDM1sKMFXH2jyHOlZjtQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.4.0.tgz", + "integrity": "sha512-b7HC9C/GHxiV4+0GpCRTtjscvwarPr3dGm4CAhb6AkNjgjRcFUNr1NfsF75w3WVmzmt79/7QZihddztDdVMGjw==", "requires": { - "@algolia/requester-common": "4.3.1" + "@algolia/requester-common": "4.4.0" } }, "@algolia/transporter": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.3.1.tgz", - "integrity": "sha512-fbA/XHjdVoO+sp+rPVe/+oK/mCac0S6VugMycg7Etujb4+6nv3STIZxtPiC+Xppbouh5tEEOE81F1aALHXBkBQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.4.0.tgz", + "integrity": "sha512-Xxzq91DEEeKIzT3DU46n4LEyTGAKZNtSHc2H9wvIY5MYwhZwEribmXXZ6k8W1FvBvzggv3juu0SP+xwGoR7F0w==", "requires": { - "@algolia/cache-common": "4.3.1", - "@algolia/logger-common": "4.3.1", - "@algolia/requester-common": "4.3.1" + "@algolia/cache-common": "4.4.0", + "@algolia/logger-common": "4.4.0", + "@algolia/requester-common": "4.4.0" } }, "@apollo/client": { @@ -5147,24 +5147,24 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "algoliasearch": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.3.1.tgz", - "integrity": "sha512-q8aIYgdZZWOMzmvlIwxcbktVa8+M5cyI8hIrgd/NcSz/XKHfVTKdNYbnsmPqmYrssAmepx8C8vHnJrPuumUnYA==", - "requires": { - "@algolia/cache-browser-local-storage": "4.3.1", - "@algolia/cache-common": "4.3.1", - "@algolia/cache-in-memory": "4.3.1", - "@algolia/client-account": "4.3.1", - "@algolia/client-analytics": "4.3.1", - "@algolia/client-common": "4.3.1", - "@algolia/client-recommendation": "4.3.1", - "@algolia/client-search": "4.3.1", - "@algolia/logger-common": "4.3.1", - "@algolia/logger-console": "4.3.1", - "@algolia/requester-browser-xhr": "4.3.1", - "@algolia/requester-common": "4.3.1", - "@algolia/requester-node-http": "4.3.1", - "@algolia/transporter": "4.3.1" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.4.0.tgz", + "integrity": "sha512-Ag3wxe/nSodNl/1KbHibtkh7TNLptKE300/wnGVtszRjXivaWD6333nUpCumrYObHym/fHMHyLcmQYezXbAIWQ==", + "requires": { + "@algolia/cache-browser-local-storage": "4.4.0", + "@algolia/cache-common": "4.4.0", + "@algolia/cache-in-memory": "4.4.0", + "@algolia/client-account": "4.4.0", + "@algolia/client-analytics": "4.4.0", + "@algolia/client-common": "4.4.0", + "@algolia/client-recommendation": "4.4.0", + "@algolia/client-search": "4.4.0", + "@algolia/logger-common": "4.4.0", + "@algolia/logger-console": "4.4.0", + "@algolia/requester-browser-xhr": "4.4.0", + "@algolia/requester-common": "4.4.0", + "@algolia/requester-node-http": "4.4.0", + "@algolia/transporter": "4.4.0" } }, "algoliasearch-helper": { diff --git a/docs/package.json b/docs/package.json index 5f6af777..25930ac2 100644 --- a/docs/package.json +++ b/docs/package.json @@ -6,7 +6,7 @@ "serve": "gatsby serve" }, "dependencies": { - "algoliasearch": "^4.3.1", + "algoliasearch": "^4.4.0", "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.7.1", From 4e16cbf5793dd297c9f6a1875a099d3c69f71360 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 16 Sep 2020 23:20:39 +0000 Subject: [PATCH 161/251] fix: upgrade instantsearch.css from 7.4.3 to 7.4.4 Snyk has created this PR to upgrade instantsearch.css from 7.4.3 to 7.4.4. See this package in npm: https://www.npmjs.com/package/instantsearch.css See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 6 +++--- docs/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 0dbd3608..bd0300fd 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -14709,9 +14709,9 @@ } }, "instantsearch.css": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/instantsearch.css/-/instantsearch.css-7.4.3.tgz", - "integrity": "sha512-Ywwf5QMKXpaoWsEPZbDHIcyka9ocyhxuSp8HgRK8v05DiyKz2kv0K3ysinshtAqAd1ut8HEh36dviWD/Z/+w2A==" + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/instantsearch.css/-/instantsearch.css-7.4.4.tgz", + "integrity": "sha512-JmqgJD3HUxH5N2Cw5Utzz1G+W1Dsg1Fuf6UNfln7ptnRT3TguPRKBAIKuxnaGmdNdjAAsuWoohvgtgo66+MaoQ==" }, "internal-ip": { "version": "4.3.0", diff --git a/docs/package.json b/docs/package.json index 25930ac2..2928fc0e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -12,7 +12,7 @@ "gatsby-source-graphql": "^2.7.1", "gatsby-source-git": "1.1.0", "gatsby-theme-apollo-docs": "4.3.6", - "instantsearch.css": "^7.4.3", + "instantsearch.css": "^7.4.4", "react": "16.13.1", "react-dom": "16.13.1", "react-instantsearch-dom": "^6.7.0" From 1cb213475a4ac76226a61ac7de34aaaadf4aa268 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 18 Sep 2020 23:14:10 +0000 Subject: [PATCH 162/251] fix: upgrade gatsby-source-graphql from 2.7.1 to 2.7.2 Snyk has created this PR to upgrade gatsby-source-graphql from 2.7.1 to 2.7.2. See this package in npm: https://www.npmjs.com/package/gatsby-source-graphql See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr --- docs/package-lock.json | 365 ++++++++++++++++++++++++++++++++++++----- docs/package.json | 2 +- 2 files changed, 328 insertions(+), 39 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index bd0300fd..867b0c14 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -118,10 +118,11 @@ } }, "@apollo/client": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.1.3.tgz", - "integrity": "sha512-zXMiaj+dX0sgXIwEV5d/PI6B8SZT2bqlKNjZWcEXRY7NjESF5J3nd4v8KOsrhHe+A3YhNv63tIl35Sq7uf41Pg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.2.0.tgz", + "integrity": "sha512-6ISMYW9QpEykJAkN6ZZteTkXXwtYSPGbh+4iBZ478p/Eox1JOMGYlqosGgMGv2oduug9SnsR65y0iCAxKOFGiQ==", "requires": { + "@graphql-typed-document-node/core": "^3.0.0", "@types/zen-observable": "^0.8.0", "@wry/context": "^0.5.2", "@wry/equality": "^0.2.0", @@ -130,7 +131,8 @@ "hoist-non-react-statics": "^3.3.2", "optimism": "^0.12.1", "prop-types": "^15.7.2", - "symbol-observable": "^1.2.0", + "symbol-observable": "^2.0.0", + "terser": "^5.2.0", "ts-invariant": "^0.4.4", "tslib": "^1.10.0", "zen-observable": "^0.8.14" @@ -143,6 +145,26 @@ "requires": { "tslib": "^1.9.3" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "symbol-observable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.1.tgz", + "integrity": "sha512-QrfHrrEUMadQCgMijc3YpfA4ncwgqGv58Xgvdu3JZVQB7iY7cAkiqobZEZbaA863jof8AdpR01CPnZ5UWeqZBQ==" + }, + "terser": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.2.tgz", + "integrity": "sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } } } }, @@ -3410,17 +3432,113 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@graphql-tools/delegate": { - "version": "6.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.0.18.tgz", - "integrity": "sha512-CmNTD60qcTEZM3bvOV2t3Zdj7veY0zgXXVXNgMC9Fx+D2dNdJFCwXdcPAF0SKqlJoj/alBDSl1U6nqYKT9fQOA==", - "requires": { - "@ardatan/aggregate-error": "0.0.1", - "@graphql-tools/schema": "6.0.18", - "@graphql-tools/utils": "6.0.18", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.2.2.tgz", + "integrity": "sha512-8VycfZYQ+m4HgajewQT6v6BzAEFxc6mh6rO+uqewnvh143nvv3ud4nXEAfOddUm0PrE6iD3Ng2BZtPSWF5mt+w==", + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "@graphql-tools/schema": "6.2.2", + "@graphql-tools/utils": "6.2.2", + "dataloader": "2.0.0", "is-promise": "4.0.0", - "tslib": "~2.0.0" + "tslib": "~2.0.1" }, "dependencies": { + "@ardatan/aggregate-error": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", + "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", + "requires": { + "tslib": "~2.0.1" + } + }, + "@graphql-tools/schema": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.2.tgz", + "integrity": "sha512-KITlyr//1oKyxIOlGvNZDl4c6bLj2Gc+3eJXyUKWfSmgsmAZPudpQNa/8VbiVujpm7UaX0cyM3FdeCaxWFeBgg==", + "requires": { + "@graphql-tools/utils": "6.2.2", + "tslib": "~2.0.1" + } + }, + "@graphql-tools/utils": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.2.tgz", + "integrity": "sha512-a0SSYF76dnKHs8te4Igfnrrq1VOO4sFG8yx3ehO7464eGUfUUYo2QmNRjhxny2HRMvqzX40xuQikyg6LBXDNLQ==", + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.1", + "tslib": "~2.0.1" + } + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "dataloader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, "tslib": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", @@ -3429,19 +3547,53 @@ } }, "@graphql-tools/links": { - "version": "6.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.0.18.tgz", - "integrity": "sha512-r1unH0UqlUNT985zGfajhq5iysFDCeHB5I2mu+fdaAoIWQB+1dizUpwVkYarWX+u9W4OSNFrF9Hw8IwzKS+51Q==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.2.2.tgz", + "integrity": "sha512-x1B75Flc10PSmF1hzar1kty9q9wfWjlwlPXYC5AYGmRIVfzbZui3SEZcEPP8cviedBCI84l9O+dX5S4dE2Oz6Q==", "requires": { - "@graphql-tools/utils": "6.0.18", + "@graphql-tools/utils": "6.2.2", "apollo-link": "1.2.14", "apollo-upload-client": "14.1.1", "cross-fetch": "3.0.5", "form-data": "3.0.0", "is-promise": "4.0.0", - "tslib": "~2.0.0" + "tslib": "~2.0.1" }, "dependencies": { + "@ardatan/aggregate-error": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", + "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", + "requires": { + "tslib": "~2.0.1" + } + }, + "@graphql-tools/utils": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.2.tgz", + "integrity": "sha512-a0SSYF76dnKHs8te4Igfnrrq1VOO4sFG8yx3ehO7464eGUfUUYo2QmNRjhxny2HRMvqzX40xuQikyg6LBXDNLQ==", + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.1", + "tslib": "~2.0.1" + } + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, "cross-fetch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.5.tgz", @@ -3460,11 +3612,58 @@ "mime-types": "^2.1.12" } }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, "tslib": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", @@ -3535,25 +3734,105 @@ } }, "@graphql-tools/wrap": { - "version": "6.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.0.18.tgz", - "integrity": "sha512-AHegxtawd+ivpUhI1gP4xQWWYPl5GvCmvzaas03DfrGlGcV/LyKJIzdZDEs2E4oCgwCU7F9UQMxgTsq+Dttn5Q==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.2.2.tgz", + "integrity": "sha512-FjCE+NvMwcCiAlt9EAw9uDi2zblE4Z5CEkY+z4NRO1AmCB5THoWJKG+csPh8tGuU80mAJI51Wy9FQGyUo/EU0g==", "requires": { - "@graphql-tools/delegate": "6.0.18", - "@graphql-tools/schema": "6.0.18", - "@graphql-tools/utils": "6.0.18", - "aggregate-error": "3.0.1", + "@graphql-tools/delegate": "6.2.2", + "@graphql-tools/schema": "6.2.2", + "@graphql-tools/utils": "6.2.2", "is-promise": "4.0.0", - "tslib": "~2.0.0" + "tslib": "~2.0.1" }, "dependencies": { - "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==", + "@ardatan/aggregate-error": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", + "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", + "requires": { + "tslib": "~2.0.1" + } + }, + "@graphql-tools/schema": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.2.tgz", + "integrity": "sha512-KITlyr//1oKyxIOlGvNZDl4c6bLj2Gc+3eJXyUKWfSmgsmAZPudpQNa/8VbiVujpm7UaX0cyM3FdeCaxWFeBgg==", + "requires": { + "@graphql-tools/utils": "6.2.2", + "tslib": "~2.0.1" + } + }, + "@graphql-tools/utils": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.2.tgz", + "integrity": "sha512-a0SSYF76dnKHs8te4Igfnrrq1VOO4sFG8yx3ehO7464eGUfUUYo2QmNRjhxny2HRMvqzX40xuQikyg6LBXDNLQ==", + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.1", + "tslib": "~2.0.1" + } + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "tslib": { @@ -3563,6 +3842,11 @@ } } }, + "@graphql-typed-document-node/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", + "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==" + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -4802,9 +5086,9 @@ "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, "@types/zen-observable": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz", - "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.1.tgz", + "integrity": "sha512-wmk0xQI6Yy7Fs/il4EpOcflG4uonUpYGqvZARESLc2oy4u69fkatFLbJOeW4Q6awO15P4rduAe6xkwHevpXcUQ==" }, "@typescript-eslint/eslint-plugin": { "version": "2.34.0", @@ -12719,9 +13003,9 @@ } }, "gatsby-source-graphql": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.7.1.tgz", - "integrity": "sha512-fTmAWeBLG/ZshmlPRC5Pc4KyihfamfnugqHT4IRKcjnBT9GYH/+W7XWD520EHu+4vYLCubs0qRdYqgh4K5/pkA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.7.2.tgz", + "integrity": "sha512-PVSVMduO/QToW9v9lB+uEatrwnVN2eTwnQ9CxqJh9Wlupf26xJwHZR4IAktTXtKXen+pdJ5zkqyaEvY7O1HsIA==", "requires": { "@babel/runtime": "^7.10.3", "@graphql-tools/links": "^6.0.9", @@ -12733,7 +13017,7 @@ "graphql": "^14.6.0", "invariant": "^2.2.4", "node-fetch": "^1.7.3", - "uuid": "^3.4.0" + "uuid": "^8.3.0" }, "dependencies": { "@babel/runtime": { @@ -12762,6 +13046,11 @@ "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" } } }, diff --git a/docs/package.json b/docs/package.json index 2928fc0e..d0a8d02e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,7 +9,7 @@ "algoliasearch": "^4.4.0", "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", - "gatsby-source-graphql": "^2.7.1", + "gatsby-source-graphql": "^2.7.2", "gatsby-source-git": "1.1.0", "gatsby-theme-apollo-docs": "4.3.6", "instantsearch.css": "^7.4.4", From 2440d3beeb5e3a9215fcafc3fe22a9932510ad2e Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Thu, 8 Oct 2020 10:27:14 +0300 Subject: [PATCH 163/251] fix: upgrade gatsby-theme-apollo-docs from 4.3.6 to 4.3.7 (#117) Snyk has created this PR to upgrade gatsby-theme-apollo-docs from 4.3.6 to 4.3.7. See this package in npm: https://www.npmjs.com/package/gatsby-theme-apollo-docs See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr Co-authored-by: Jon Arild Torresdal --- docs/package-lock.json | 193 ++++++++++++++++++++++++++++++----------- docs/package.json | 4 +- 2 files changed, 142 insertions(+), 55 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 867b0c14..c8eb07e6 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -5537,11 +5537,6 @@ "color-convert": "^1.9.0" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -11604,9 +11599,9 @@ } }, "gatsby-plugin-mdx": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.2.36.tgz", - "integrity": "sha512-fmspqK7WrJaITIgQrKmv6Ds1mtK+6Q+hKblpojhQEek39UeuG1Ku+qjpgP1T5qOVK6ehfeW0RzFqOCUvWR0McA==", + "version": "1.2.37", + "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.2.37.tgz", + "integrity": "sha512-vQ/j6XiK8KMeva/dujQRjweSlOC1kSU5ggg8AV1rmFVgC/S2GEtTNpjTprzfQchNwmxrqhOWL2YaEScjNLPikA==", "requires": { "@babel/core": "^7.10.3", "@babel/generator": "^7.10.3", @@ -11623,7 +11618,7 @@ "escape-string-regexp": "^1.0.5", "eval": "^0.1.4", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.17", + "gatsby-core-utils": "^1.3.18", "gray-matter": "^4.0.2", "json5": "^2.1.3", "loader-utils": "^1.4.0", @@ -11647,13 +11642,13 @@ }, "dependencies": { "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.5.tgz", + "integrity": "sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g==", "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "source-map": "^0.6.1" } }, "@babel/helper-plugin-utils": { @@ -11662,9 +11657,9 @@ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -11685,9 +11680,9 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "gatsby-core-utils": { - "version": "1.3.17", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.17.tgz", - "integrity": "sha512-nRKsoR4Y0N/O8U9xSnSbNlEtny1LEPQDl3IKru7JKwCu82nTeC4L4HSZATqXeRzadMlqmpY8j8Z6wblTewjnjg==", + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.18.tgz", + "integrity": "sha512-B7ixQb4H0e2yB0nNfM2zshOAUw3nW9MvcNsRskVFwIPJY+ngh8Srla4XWXVMJ60Fyt103+jPVZTxGq72/u5HuQ==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", @@ -11723,6 +11718,11 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, "unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", @@ -12689,9 +12689,9 @@ } }, "gatsby-remark-copy-linked-files": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-2.3.12.tgz", - "integrity": "sha512-heDSTfvzrfWWr3Itxk7TFdaObXv6i0wjmdgPKXchMPV2nUHTGGuoe3aLRLHrFXD/XsWpG/YI4Z57W0meyHMzFQ==", + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-2.3.13.tgz", + "integrity": "sha512-Qra6CpN6CChCsR5Eq2+FWF/7VyGjA7ozi/2jCO42AGrkGHfttyP07EhDq7ebk3VCtWT0tR7Zxerdq4dCnmyfFg==", "requires": { "@babel/runtime": "^7.10.3", "cheerio": "^1.0.0-rc.3", @@ -12699,7 +12699,7 @@ "is-relative-url": "^3.0.0", "lodash": "^4.17.15", "path-is-inside": "^1.0.2", - "probe-image-size": "^4.1.1", + "probe-image-size": "^5.0.0", "unist-util-visit": "^1.4.1" }, "dependencies": { @@ -12862,17 +12862,17 @@ } }, "gatsby-source-filesystem": { - "version": "2.3.26", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.3.26.tgz", - "integrity": "sha512-dQJoZ4MLEHInGMThLBkiJ6N49r1VkRFoOo01Qga3LgB6hBlrfRWbzPg8yh/WN6o5lnwtbMHHKnuumnuke4kHWQ==", + "version": "2.3.27", + "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.3.27.tgz", + "integrity": "sha512-lNWRVDkaC2g6mSPTGuE9bsXawS0GkkwV/X8l8ZJnqbcMBl8p+h3zYoKXQ2u00pmQRqjwp4lvlaTarLRxD0tGDQ==", "requires": { "@babel/runtime": "^7.10.3", "better-queue": "^3.8.10", "bluebird": "^3.7.2", - "chokidar": "3.4.0", + "chokidar": "^3.4.2", "file-type": "^12.4.2", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.17", + "gatsby-core-utils": "^1.3.18", "got": "^9.6.0", "md5-file": "^3.2.3", "mime": "^2.4.6", @@ -12891,10 +12891,61 @@ "regenerator-runtime": "^0.13.4" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, "gatsby-core-utils": { - "version": "1.3.17", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.17.tgz", - "integrity": "sha512-nRKsoR4Y0N/O8U9xSnSbNlEtny1LEPQDl3IKru7JKwCu82nTeC4L4HSZATqXeRzadMlqmpY8j8Z6wblTewjnjg==", + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.18.tgz", + "integrity": "sha512-B7ixQb4H0e2yB0nNfM2zshOAUw3nW9MvcNsRskVFwIPJY+ngh8Srla4XWXVMJ60Fyt103+jPVZTxGq72/u5HuQ==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", @@ -12905,6 +12956,14 @@ "xdg-basedir": "^4.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -12923,15 +12982,44 @@ "url-parse-lax": "^3.0.0" } }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, "mime": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -13141,16 +13229,16 @@ } }, "gatsby-theme-apollo-docs": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.3.6.tgz", - "integrity": "sha512-JzPfEVU0mSyol8eGCR82F4GLioh81F47xt6j4z8hIYMBQGME4fUpJ9NwNMPoD02hh9jiFydOiGCjXh9fXBSPJQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.3.7.tgz", + "integrity": "sha512-c1dhi4raNi9XS+5h42Q1kE3OUDjbWwCG2fsjsHHvawPYb6He2mfptB781NVYN3aRPY3aYgEwlKKI527qglRmJw==", "requires": { "@mdx-js/mdx": "^1.1.0", "@mdx-js/react": "^1.0.27", "gatsby-plugin-google-analytics": "^2.2.5", "gatsby-plugin-mdx": "^1.0.23", "gatsby-plugin-printer": "1.0.x", - "gatsby-remark-autolink-headers": "^2.0.16", + "gatsby-remark-autolink-headers": "^2.3.11", "gatsby-remark-check-links": "^2.1.0", "gatsby-remark-code-titles": "^1.1.0", "gatsby-remark-copy-linked-files": "^2.0.12", @@ -13175,13 +13263,13 @@ } }, "gatsby-transformer-remark": { - "version": "2.8.30", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.8.30.tgz", - "integrity": "sha512-xqPPtYmLOWp6vnEWnbJ+Ic11LoFpCkFvj7DL+58P7yJ6GHB6ax5XqPsc1acjcH4JCmaP1MXV3aQGe8KlwiAc2w==", + "version": "2.8.32", + "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.8.32.tgz", + "integrity": "sha512-aWwSKeIG03l+DtIWulyB0TxuzN0+u1K2X2ispprTtrr/8BH1BBd6MnK5JjZfsOTnTMCKtUi2z11LrPk4TOkQGA==", "requires": { "@babel/runtime": "^7.10.3", "bluebird": "^3.7.2", - "gatsby-core-utils": "^1.3.17", + "gatsby-core-utils": "^1.3.18", "gray-matter": "^4.0.2", "hast-util-raw": "^4.0.0", "hast-util-to-html": "^4.0.1", @@ -13211,9 +13299,9 @@ } }, "gatsby-core-utils": { - "version": "1.3.17", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.17.tgz", - "integrity": "sha512-nRKsoR4Y0N/O8U9xSnSbNlEtny1LEPQDl3IKru7JKwCu82nTeC4L4HSZATqXeRzadMlqmpY8j8Z6wblTewjnjg==", + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.18.tgz", + "integrity": "sha512-B7ixQb4H0e2yB0nNfM2zshOAUw3nW9MvcNsRskVFwIPJY+ngh8Srla4XWXVMJ60Fyt103+jPVZTxGq72/u5HuQ==", "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", @@ -18770,9 +18858,9 @@ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" }, "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", + "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" }, "pretty-error": { "version": "2.1.1", @@ -18837,11 +18925,10 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "probe-image-size": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-4.1.1.tgz", - "integrity": "sha512-42LqKZqTLxH/UvAZ2/cKhAsR4G/Y6B7i7fI2qtQu9hRBK4YjS6gqO+QRtwTjvojUx4+/+JuOMzLoFyRecT9qRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-5.0.0.tgz", + "integrity": "sha512-V6uBYw5eBc5UVIE7MUZD6Nxg0RYuGDWLDenEn0B1WC6PcTvn1xdQ6HLDDuznefsiExC6rNrCz7mFRBo0f3Xekg==", "requires": { - "any-promise": "^1.3.0", "deepmerge": "^4.0.0", "inherits": "^2.0.3", "next-tick": "^1.0.0", @@ -22786,9 +22873,9 @@ "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" }, "uglify-js": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.2.tgz", - "integrity": "sha512-GXCYNwqoo0MbLARghYjxVBxDCnU0tLqN7IPLdHHbibCb1NI5zBkU2EPcy/GaVxc0BtTjqyGXJCINe6JMR2Dpow==" + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.3.tgz", + "integrity": "sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g==" }, "unc-path-regex": { "version": "0.1.2", diff --git a/docs/package.json b/docs/package.json index d0a8d02e..b4ce7674 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,9 +10,9 @@ "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.7.2", - "gatsby-source-git": "1.1.0", - "gatsby-theme-apollo-docs": "4.3.6", + "gatsby-theme-apollo-docs": "4.3.7", "instantsearch.css": "^7.4.4", + "gatsby-source-git": "1.1.0", "react": "16.13.1", "react-dom": "16.13.1", "react-instantsearch-dom": "^6.7.0" From 5c129eec029ecca29f8f29e0d34d73fbb084b670 Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Thu, 8 Oct 2020 10:34:33 +0300 Subject: [PATCH 164/251] fix: upgrade gatsby from 2.24.50 to 2.24.51 (#122) Snyk has created this PR to upgrade gatsby from 2.24.50 to 2.24.51. See this package in npm: https://www.npmjs.com/package/gatsby See this project in Snyk: https://app.snyk.io/org/torresdal/project/37ebc223-f981-40d3-b305-c304ab720bc7?utm_source=github&utm_medium=upgrade-pr Co-authored-by: Jon Arild Torresdal --- docs/package-lock.json | 2111 ++++++++++++++++++++++++++++++++-------- docs/package.json | 2 +- 2 files changed, 1732 insertions(+), 381 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c8eb07e6..9c801ed4 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -2763,9 +2763,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", - "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz", + "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==", "requires": { "@babel/helper-module-imports": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", @@ -2787,9 +2787,9 @@ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -3250,7 +3250,8 @@ "@babel/standalone": { "version": "7.11.4", "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.4.tgz", - "integrity": "sha512-OHOugVBx/LrhbCxaRVUviICe0SlC7zLYueYiMLsJk6qoCAC8RXpOxpwOxeps5YXWWmGmbombDkOFq6iDK1xQSA==" + "integrity": "sha512-OHOugVBx/LrhbCxaRVUviICe0SlC7zLYueYiMLsJk6qoCAC8RXpOxpwOxeps5YXWWmGmbombDkOFq6iDK1xQSA==", + "dev": true }, "@babel/template": { "version": "7.8.3", @@ -4585,6 +4586,22 @@ "lodash.deburr": "^4.1.0" } }, + "@sindresorhus/transliterate": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.1.tgz", + "integrity": "sha512-QSdIQ5keUFAZ3KLbfbsntW39ox0Ym8183RqTwBq/ZEFoN3NQAtGV+qWaNdzKpIDHgj9J2CQ2iNDRVU11Zyr7MQ==", + "requires": { + "escape-string-regexp": "^2.0.0", + "lodash.deburr": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, "@styled-system/css": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", @@ -4863,9 +4880,9 @@ } }, "@types/history": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.7.tgz", - "integrity": "sha512-2xtoL22/3Mv6a70i4+4RB7VgbDDORoWwjcqeNysojZA0R7NK17RbY5Gof/2QiFfJgX+KkWghbwJ+d/2SB8Ndzg==" + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", + "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" }, "@types/http-proxy": { "version": "1.17.4", @@ -4898,9 +4915,9 @@ } }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" }, "@types/json5": { "version": "0.0.29", @@ -4997,9 +5014,9 @@ } }, "@types/react": { - "version": "16.9.47", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.47.tgz", - "integrity": "sha512-dAJO4VbrjYqTUwFiQqAKjLyHHl4RSTNnRyPdX3p16MPbDKvow51wxATUPxoe2QsiXNMEYrOjc2S6s92VjG+1VQ==", + "version": "16.9.49", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", + "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -5894,14 +5911,14 @@ }, "dependencies": { "caniuse-lite": { - "version": "1.0.30001118", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001118.tgz", - "integrity": "sha512-RNKPLojZo74a0cP7jFMidQI7nvLER40HgNfgKQEJ2PFm225L0ectUungNQoK3Xk3StQcFbpBPNEvoWD59436Hg==" + "version": "1.0.30001131", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz", + "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==" }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.33.tgz", + "integrity": "sha512-L3CKJMGkaTmz+/1AvXyOKpD7wPoUV0rBa2AdUXrsPBp8KLl5X99rY6gr4wQyMaeTo4wV+JdY7RaxlA5JsLaeig==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -6181,9 +6198,9 @@ "integrity": "sha512-JrB9ZASlMAfkRF+5NdgoQxgenhJxzXFEO1vrqsSDJdzLrC38L2wrvXF9mm1YLbrehkZxcrNz9UYDyARP4jaY9g==" }, "babel-plugin-remove-graphql-queries": { - "version": "2.9.17", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.17.tgz", - "integrity": "sha512-ThFGZlxD+U4H+aSX4DRpz7pdJq6Y7wob0rDDx7Q2rZPp9lbNfnGACUjPyTiCIy8EsBMpPYvT4WZjb4Gd0Xq6zQ==" + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.19.tgz", + "integrity": "sha512-s8Ar5NtJD5JXsRntMFKBMjIauWaGCOTTyZO4XdaktRA7JW1gzzN0p1uyiW9QaNenVbzV+RR4ceObCwlfH8e/xA==" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", @@ -6196,26 +6213,160 @@ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "babel-preset-gatsby": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.5.6.tgz", - "integrity": "sha512-RdOLErYh3mUxCm+Udsbn5v0a6vha3THGlodDZ2+kQSJqdMa3FQi7yejlJXk2VcnyqOwtKyss32BdYy4LM/JsBw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.5.10.tgz", + "integrity": "sha512-vusxdVDj3kF4lNjF5Fkm/S800WOaMLZYnRiLEEHK5c+9kqXX4wKoqE629i7TGgx9j9u/4ZwmuLJ4cXa0iqDnQQ==", "requires": { - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.3", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.10.3", - "@babel/plugin-transform-spread": "^7.10.1", - "@babel/preset-env": "^7.10.3", - "@babel/preset-react": "^7.10.1", - "@babel/runtime": "^7.10.3", + "@babel/plugin-transform-runtime": "^7.11.5", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/preset-env": "^7.11.5", + "@babel/preset-react": "^7.10.4", + "@babel/runtime": "^7.11.2", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-macros": "^2.8.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "gatsby-core-utils": "^1.3.16", - "gatsby-legacy-polyfills": "^0.0.2" + "gatsby-core-utils": "^1.3.20", + "gatsby-legacy-polyfills": "^0.0.4" }, "dependencies": { + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.5", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, "@babel/runtime": { "version": "7.11.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", @@ -6224,10 +6375,97 @@ "regenerator-runtime": "^0.13.4" } }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "gatsby-core-utils": { + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.20.tgz", + "integrity": "sha512-tTry2Iz7QKfMEkYiqXOEbMhR96hpttkKeUCQAj7syC9tQwFGd1nkGlpbD4n8lBa22cXKLlL9J2edhDo1xwnfGQ==", + "requires": { + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" + } + }, + "gatsby-legacy-polyfills": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-0.0.4.tgz", + "integrity": "sha512-BDlY9jkhEhqpQN5yvfnJYt8wTRzBOEtIQZnWHzuE7b6tYHsngxbfIMLN3UBOs9t5ZUqcPKc1C0J0NKG6NhC4Qw==", + "requires": { + "core-js-compat": "^3.6.5" + }, + "dependencies": { + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + } + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" } } }, @@ -8953,6 +9191,30 @@ } } }, + "detect-port-alt": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", + "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "devcert": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.1.3.tgz", @@ -8993,9 +9255,9 @@ } }, "@types/node": { - "version": "8.10.62", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz", - "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw==" + "version": "8.10.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.64.tgz", + "integrity": "sha512-/EwBIb+imu8Qi/A3NF9sJ9iuKo7yV+pryqjmeRqaU0C4wBAOhas5mdvoYeJ5PCKrh6thRSJHdoasFqh3BQGILA==" }, "rimraf": { "version": "2.7.1", @@ -9819,11 +10081,11 @@ "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -9871,11 +10133,18 @@ } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, "estraverse": { @@ -9907,9 +10176,9 @@ } }, "event-source-polyfill": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.17.tgz", - "integrity": "sha512-eLZQQpKZahOH5sFaqfrbLNXJKz+JawiDQVrl6lZmQHHSamIn5PlNV3HXAY9+ZRaQC5YTIBRDd8jeTxjuEveJnQ==" + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.18.tgz", + "integrity": "sha512-4ooLMUkUYFNXjYl96twwoMkXrhwmue5aI5ayU4ORswP2b8F6bYGNsdkYqutWV77DKJLI+ZRRLvZZTSuZcUCVTA==" }, "eventemitter3": { "version": "3.1.2", @@ -10879,9 +11148,9 @@ } }, "gatsby": { - "version": "2.24.50", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.24.50.tgz", - "integrity": "sha512-7hCrRgEWdxfxy2/g6e8Yd0+KVkvoJ+XeJNX80gakJ16X3YIhBY3W2c+l+ZgpdQvQvuLkc1c3BugqV13eKw7Mgw==", + "version": "2.24.51", + "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.24.51.tgz", + "integrity": "sha512-z7Fkvg+sk9uSETmhsyml6eITWdvXCC8Q4JmLgBzDlKweZPTudwScO2HRUdXxQIANcdIu7u6NU3In52a3P3ZwLA==", "requires": { "@babel/code-frame": "^7.10.3", "@babel/core": "^7.10.3", @@ -10906,7 +11175,7 @@ "babel-plugin-add-module-exports": "^0.3.3", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-plugin-remove-graphql-queries": "^2.9.17", - "babel-preset-gatsby": "^0.5.6", + "babel-preset-gatsby": "^0.5.7", "better-opn": "1.0.0", "better-queue": "^3.8.10", "bluebird": "^3.7.2", @@ -10945,15 +11214,15 @@ "find-cache-dir": "^3.3.1", "fs-exists-cached": "1.0.0", "fs-extra": "^8.1.0", - "gatsby-cli": "^2.12.88", - "gatsby-core-utils": "^1.3.16", + "gatsby-cli": "^2.12.89", + "gatsby-core-utils": "^1.3.17", "gatsby-graphiql-explorer": "^0.4.12", - "gatsby-legacy-polyfills": "^0.0.2", + "gatsby-legacy-polyfills": "^0.0.3", "gatsby-link": "^2.4.13", - "gatsby-plugin-page-creator": "^2.3.23", + "gatsby-plugin-page-creator": "^2.3.24", "gatsby-plugin-typescript": "^2.4.18", "gatsby-react-router-scroll": "^3.0.12", - "gatsby-telemetry": "^1.3.28", + "gatsby-telemetry": "^1.3.29", "glob": "^7.1.6", "got": "8.3.2", "graphql": "^14.6.0", @@ -11037,11 +11306,11 @@ } }, "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -11064,6 +11333,11 @@ "@babel/types": "^7.10.4" } }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "@babel/helper-split-export-declaration": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", @@ -11083,9 +11357,9 @@ } }, "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" }, "@babel/runtime": { "version": "7.11.2", @@ -11095,6 +11369,11 @@ "regenerator-runtime": "^0.13.4" } }, + "@babel/standalone": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.6.tgz", + "integrity": "sha512-Ye1pj3fN76OWlJyi+Ocy1kTr1BNs5vFWHsq2oKPp3lB4Q0r2WrHi+n/Y2w3sZK+1QSKAkDXTp12tCuBprBHZ1w==" + }, "@babel/template": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", @@ -11106,16 +11385,16 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.11.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" @@ -11132,55 +11411,231 @@ } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "gatsby-cli": { - "version": "2.12.88", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.88.tgz", - "integrity": "sha512-LBV6j9FFwGMCmbjvutTInwJV+fSrIhqHTYw6TZjVcXzUuk5jj/llj4CDUep5iPLjCZJvvzwtG2kDpkFPOPfsoA==", + "@mdx-js/mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", + "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", "requires": { - "@babel/code-frame": "^7.10.3", - "@hapi/joi": "^15.1.1", - "@types/common-tags": "^1.8.0", - "better-opn": "^1.0.0", - "chalk": "^2.4.2", - "clipboardy": "^2.3.0", - "common-tags": "^1.8.0", - "configstore": "^5.0.1", - "convert-hrtime": "^3.0.0", - "envinfo": "^7.5.1", - "execa": "^3.4.0", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.16", - "gatsby-recipes": "^0.2.17", - "gatsby-telemetry": "^1.3.28", - "hosted-git-info": "^3.0.4", - "ink": "^2.7.1", - "ink-spinner": "^3.1.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.15", - "meant": "^1.0.1", - "node-fetch": "^2.6.0", - "opentracing": "^0.14.4", - "pretty-error": "^2.1.1", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "react": "^16.8.0", - "redux": "^4.0.5", - "resolve-cwd": "^3.0.0", + "@babel/core": "7.10.5", + "@babel/plugin-syntax-jsx": "7.10.4", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "^2.0.0-next.7", + "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", + "babel-plugin-extract-export-names": "^2.0.0-next.7", + "babel-plugin-extract-import-names": "^2.0.0-next.7", + "camelcase-css": "2.0.1", + "detab": "2.0.3", + "hast-to-hyperscript": "9.0.0", + "hast-util-raw": "6.0.0", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "9.1.0", + "remark-footnotes": "1.0.0", + "remark-mdx": "^2.0.0-next.7", + "remark-mdxjs": "^2.0.0-next.7", + "remark-parse": "8.0.2", + "remark-squeeze-paragraphs": "4.0.0", + "unified": "9.0.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "remark-parse": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", + "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "unified": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", + "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + } + } + }, + "@mdx-js/react": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", + "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" + }, + "@mdx-js/util": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", + "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", + "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "^2.0.0-next.7" + } + }, + "babel-plugin-extract-import-names": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", + "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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" + } + }, + "flatted": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.0.5.tgz", + "integrity": "sha512-bDEpEsHk2pHn4R+slxblk0N0gK5lQsK2aRwW6LJyIpX3o9qhoVkufDjDvU3fpSJbR7UgOl+icRoR9agYyjzMTw==" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "gatsby-cli": { + "version": "2.12.99", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.99.tgz", + "integrity": "sha512-LHPX8bRHye69LPS9OiLw9in2ypyEnsxcU2p1MiBEs542D7bGmNXvJW61vN1kcXB9t5kFs3Ka2LDJjSn+5LbhfQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@hapi/joi": "^15.1.1", + "@types/common-tags": "^1.8.0", + "better-opn": "^1.0.0", + "chalk": "^2.4.2", + "clipboardy": "^2.3.0", + "common-tags": "^1.8.0", + "configstore": "^5.0.1", + "convert-hrtime": "^3.0.0", + "envinfo": "^7.5.1", + "execa": "^3.4.0", + "fs-exists-cached": "^1.0.0", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.3.20", + "gatsby-recipes": "^0.2.27", + "gatsby-telemetry": "^1.3.35", + "hosted-git-info": "^3.0.4", + "ink": "^2.7.1", + "ink-spinner": "^3.1.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.20", + "meant": "^1.0.1", + "node-fetch": "^2.6.0", + "opentracing": "^0.14.4", + "pretty-error": "^2.1.1", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "react": "^16.8.0", + "redux": "^4.0.5", + "resolve-cwd": "^3.0.0", "semver": "^7.3.2", "signal-exit": "^3.0.3", "source-map": "0.7.3", @@ -11192,55 +11647,567 @@ "yurnalist": "^1.1.2" }, "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "gatsby-core-utils": { + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.20.tgz", + "integrity": "sha512-tTry2Iz7QKfMEkYiqXOEbMhR96hpttkKeUCQAj7syC9tQwFGd1nkGlpbD4n8lBa22cXKLlL9J2edhDo1xwnfGQ==", + "requires": { + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" + } + }, + "gatsby-recipes": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.27.tgz", + "integrity": "sha512-UaLmM4/+yyzQ/LSBu5kp8SrGe5ebOoiG/GU4z7UmKyL/rFaMdHPbWgc779b/LvJZX0159WxTHugeyQqT6JIjlg==", + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.11.6", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/standalone": "^7.11.6", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.5", + "@emotion/core": "^10.0.14", + "@emotion/styled": "^10.0.14", + "@graphql-tools/schema": "^6.0.14", + "@graphql-tools/utils": "^6.0.14", + "@hapi/hoek": "8.x.x", + "@hapi/joi": "^15.1.1", + "@mdx-js/mdx": "^2.0.0-next.4", + "@mdx-js/react": "^2.0.0-next.4", + "@mdx-js/runtime": "^2.0.0-next.4", + "acorn": "^7.2.0", + "acorn-jsx": "^5.2.0", + "ansi-html": "^0.0.7", + "babel-plugin-remove-export-keywords": "^1.6.5", + "better-queue": "^3.8.10", + "chokidar": "^3.4.2", + "concurrently": "^5.0.0", + "contentful-management": "^5.26.3", + "cors": "^2.8.5", + "cross-fetch": "^3.0.6", + "debug": "^4.1.1", + "detect-port": "^1.3.0", + "dotenv": "^8.2.0", + "execa": "^4.0.2", + "express": "^4.17.1", + "express-graphql": "^0.9.0", + "flatted": "^3.0.0", + "formik": "^2.0.8", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.3.20", + "gatsby-interface": "^0.0.166", + "gatsby-telemetry": "^1.3.35", + "glob": "^7.1.6", + "graphql": "^14.6.0", + "graphql-compose": "^6.3.8", + "graphql-subscriptions": "^1.1.0", + "graphql-type-json": "^0.3.2", + "hicat": "^0.7.0", + "html-tag-names": "^1.1.5", + "ink-box": "^1.0.0", + "is-binary-path": "^2.1.0", + "is-url": "^1.2.4", + "jest-diff": "^25.5.0", + "lock": "^1.0.0", + "lodash": "^4.17.20", + "mitt": "^1.2.0", + "mkdirp": "^0.5.1", + "node-fetch": "^2.5.0", + "normalize.css": "^8.0.1", + "pkg-dir": "^4.2.0", + "prettier": "^2.0.5", + "prop-types": "^15.6.1", + "property-information": "5.5.0", + "react-circular-progressbar": "^2.0.0", + "react-icons": "^3.0.1", + "react-reconciler": "^0.25.1", + "remark-mdx": "^2.0.0-next.4", + "remark-mdxjs": "^2.0.0-next.4", + "remark-parse": "^6.0.3", + "remark-stringify": "^8.1.0", + "resolve-cwd": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "single-trailing-newline": "^1.0.0", + "strip-ansi": "^6.0.0", + "style-to-object": "^0.3.0", + "subscriptions-transport-ws": "^0.9.16", + "svg-tag-names": "^2.0.1", + "unified": "^8.4.2", + "unist-util-remove": "^2.0.0", + "unist-util-visit": "^2.0.2", + "urql": "^1.9.7", + "uuid": "3.4.0", + "ws": "^7.3.0", + "xstate": "^4.9.1", + "yoga-layout-prebuilt": "^1.9.6", + "yup": "^0.27.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.6", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "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" + } + } + } + }, + "gatsby-telemetry": { + "version": "1.3.35", + "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.35.tgz", + "integrity": "sha512-MFMQl5KCOO6Xzlp2JMO4bRbsh1rjQDsbkJRZgYZB9izmPSK8AgNrHCjruxZC448ndtUfIVwjHnV+/K18XuPCHw==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.11.2", + "@turist/fetch": "^7.1.7", + "@turist/time": "^0.0.1", + "async-retry-ng": "^2.0.1", + "boxen": "^4.2.0", + "configstore": "^5.0.1", + "envinfo": "^7.7.3", + "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.3.20", + "git-up": "^4.0.2", + "is-docker": "^2.1.1", + "lodash": "^4.17.20", + "node-fetch": "^2.6.0", + "uuid": "3.4.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + } + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "git-up": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", + "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "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" + } + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "requires": { + "repeat-string": "^1.0.0" + } + }, + "mdast-util-compact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", + "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "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==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "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==", + "requires": { + "find-up": "^4.0.0" + } + }, + "prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==" + }, + "property-information": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", + "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "remark-mdx": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", + "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", + "requires": { + "parse-entities": "^2.0.0", + "remark-stringify": "^8.1.0", + "stringify-entities": "^3.0.1", + "strip-indent": "^3.0.0", + "unist-util-stringify-position": "^2.0.3" + } + }, + "remark-parse": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", + "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" } } }, - "hosted-git-info": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", - "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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==", + "remark-stringify": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", + "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", "requires": { - "yallist": "^4.0.0" + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^2.0.0", + "mdast-util-compact": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^3.0.0", + "unherit": "^1.0.4", + "xtend": "^4.0.1" } }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "stringify-entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", + "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", + "requires": { + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.2", + "is-hexadecimal": "^1.0.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "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==" + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" } }, "yallist": { @@ -11380,6 +12347,7 @@ "version": "1.3.16", "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", + "dev": true, "requires": { "ci-info": "2.0.0", "configstore": "^5.0.1", @@ -11399,11 +12367,11 @@ } }, "gatsby-graphiql-explorer": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.4.12.tgz", - "integrity": "sha512-kHVHzGvebZlUGeGOoAAJVdLWAXftZiYeOk6EitWFkXEZtYxpgXM5Pum9qDMCzUCJ6pzS8r9U5IBJncjMal3ScQ==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.4.14.tgz", + "integrity": "sha512-B8ChC4THCF0Aa+0F1jErKzTlUAdMAUtoJ0Ayi3+zVzlTk3LsRO+/PWecHeZa/DnFzds3libYuqskclKnRyAZWg==", "requires": { - "@babel/runtime": "^7.10.3" + "@babel/runtime": "^7.11.2" }, "dependencies": { "@babel/runtime": { @@ -11443,9 +12411,9 @@ } }, "gatsby-legacy-polyfills": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-0.0.2.tgz", - "integrity": "sha512-i8LLwvtupC92AjQMivLDKDCgN51sV6FLbtoNn0CRQJdLJY31P06k+5qKcjdprGLdPjCjkCsYLTYi08pdvqAuPw==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-0.0.3.tgz", + "integrity": "sha512-W604RjkTMxFaCatE0Khk3qvLSMrioIt9bXLv7/TtNsMXLMWBBbcK5QYHnDbHB8LSdhI6LcvWDVYjviwIpcTxLA==", "requires": { "core-js-compat": "^3.6.5" }, @@ -11467,11 +12435,11 @@ } }, "gatsby-link": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.4.13.tgz", - "integrity": "sha512-0qTM9JJvYZCsqAF/FLkChHwECbjl2DxUl8M0cYNgCDcaw5BI6PhF4FhuGUcr17dZ6KlpEMrpApaF5MMQqV0WSQ==", + "version": "2.4.14", + "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.4.14.tgz", + "integrity": "sha512-JLF7pb5E8flmsH2oQvGmGV1mMEuaQCzLFOXFj6FZOcG/JuOEXSb5N/Z/cp2MAlAVCyLLeYI7Ru/+o0TOpQMwkQ==", "requires": { - "@babel/runtime": "^7.10.3", + "@babel/runtime": "^7.11.2", "@types/reach__router": "^1.3.3", "prop-types": "^15.7.2" }, @@ -11492,17 +12460,17 @@ } }, "gatsby-page-utils": { - "version": "0.2.21", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.2.21.tgz", - "integrity": "sha512-3i1OAuFdZNXbHUpcve1y1Gq2WO5TS7QJvxnT1ZALJ05adCmXwslKX6UxMziZGRue1pw4Bo9gaaQRqkay7mOOow==", + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.2.25.tgz", + "integrity": "sha512-0npo/wjYO94nqcjl0aMkL65LvJuVnaieJzlxpA6Fdj2s90RjKI0mCj/3VPvRBz3p0aDp5+gas4kUa5KE4B3b0Q==", "requires": { - "@babel/runtime": "^7.10.3", + "@babel/runtime": "^7.11.2", "bluebird": "^3.7.2", - "chokidar": "3.4.0", + "chokidar": "^3.4.2", "fs-exists-cached": "^1.0.0", - "gatsby-core-utils": "^1.3.16", + "gatsby-core-utils": "^1.3.20", "glob": "^7.1.6", - "lodash": "^4.17.15", + "lodash": "^4.17.20", "micromatch": "^3.1.10" }, "dependencies": { @@ -11514,10 +12482,117 @@ "regenerator-runtime": "^0.13.4" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "gatsby-core-utils": { + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.20.tgz", + "integrity": "sha512-tTry2Iz7QKfMEkYiqXOEbMhR96hpttkKeUCQAj7syC9tQwFGd1nkGlpbD4n8lBa22cXKLlL9J2edhDo1xwnfGQ==", + "requires": { + "ci-info": "2.0.0", + "configstore": "^5.0.1", + "fs-extra": "^8.1.0", + "node-object-hash": "^2.0.0", + "proper-lockfile": "^4.1.1", + "tmp": "^0.2.1", + "xdg-basedir": "^4.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -11741,31 +12816,317 @@ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "requires": { - "unist-util-visit-parents": "^2.0.0" + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + } + } + }, + "gatsby-plugin-page-creator": { + "version": "2.3.28", + "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.28.tgz", + "integrity": "sha512-AS1e44tF6ahADXTVvgTRcSWAzowbO7aPxg6RbX5BuUBpAnbQgXVTISVztk5ZVPA6/tESbfrkeEEoMHHcZmbPmA==", + "requires": { + "@babel/traverse": "^7.11.5", + "@sindresorhus/slugify": "^1.1.0", + "chokidar": "^3.4.2", + "fs-exists-cached": "^1.0.0", + "gatsby-page-utils": "^0.2.25", + "globby": "^11.0.1", + "graphql": "^14.6.0", + "lodash": "^4.17.20" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "requires": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@sindresorhus/slugify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.0.tgz", + "integrity": "sha512-ujZRbmmizX26yS/HnB3P9QNlNa4+UvHh+rIse3RbOXLp8yl6n1TxB4t7NHggtVgS8QmmOtzXo48kCxZGACpkPw==", + "requires": { + "@sindresorhus/transliterate": "^0.1.1", + "escape-string-regexp": "^4.0.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "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==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "gatsby-plugin-printer": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz", + "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==", + "requires": { + "@sindresorhus/slugify": "^0.9.1", + "babel-plugin-preval": "^3.0.1", + "fs-extra": "^8.1.0", + "puppeteer": "^1.19.0", + "rollup": "1.23.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-commonjs": "^10.0.1", + "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-globals": "^1.4.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-replace": "^2.2.0" + } + }, + "gatsby-plugin-react-helmet": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.3.10.tgz", + "integrity": "sha512-AcXYwmS3r298JWs6iQ3OLNxIe8L8i5a2iSdLr/SDMpHqumYm7q/vB9kCX0et5wM7DIuZ7aPXDrdi5yDCAvU5lg==", + "requires": { + "@babel/runtime": "^7.10.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" } }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, - "gatsby-plugin-page-creator": { - "version": "2.3.23", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.23.tgz", - "integrity": "sha512-cpluob5yQdrY1W2THnVtiaWUHBDNTqDU0fhfwSf9CIZHIJkHamqk8Q+YzDGFFs+2/3U4+PKhcvWh0hl/g9c3ug==", + "gatsby-plugin-svgr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", + "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg==" + }, + "gatsby-plugin-typescript": { + "version": "2.4.20", + "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.20.tgz", + "integrity": "sha512-GqjbK/tchTq4yT4yJWRCfbvBAaYn3fKd1w0z9YQywx26yELe8+aM1CrGSErnuTP4rQ7xmfbK+0ASh2PUb2cSwg==", "requires": { - "@babel/traverse": "^7.10.2", - "fs-exists-cached": "^1.0.0", - "gatsby-page-utils": "^0.2.21", - "globby": "^11.0.1", - "graphql": "^14.6.0", - "lodash": "^4.17.15", - "slugify": "^1.4.4" + "@babel/core": "^7.11.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/preset-typescript": "^7.10.4", + "@babel/runtime": "^7.11.2", + "babel-plugin-remove-graphql-queries": "^2.9.19" }, "dependencies": { "@babel/code-frame": { @@ -11776,12 +13137,35 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/core": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.6", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -11823,9 +13207,17 @@ } }, "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } }, "@babel/template": { "version": "7.10.4", @@ -11838,25 +13230,25 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.11.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -11871,89 +13263,6 @@ "ms": "^2.1.1" } }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - } - } - }, - "gatsby-plugin-printer": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz", - "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==", - "requires": { - "@sindresorhus/slugify": "^0.9.1", - "babel-plugin-preval": "^3.0.1", - "fs-extra": "^8.1.0", - "puppeteer": "^1.19.0", - "rollup": "1.23.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-commonjs": "^10.0.1", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0" - } - }, - "gatsby-plugin-react-helmet": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.3.10.tgz", - "integrity": "sha512-AcXYwmS3r298JWs6iQ3OLNxIe8L8i5a2iSdLr/SDMpHqumYm7q/vB9kCX0et5wM7DIuZ7aPXDrdi5yDCAvU5lg==", - "requires": { - "@babel/runtime": "^7.10.3" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-plugin-svgr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", - "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg==" - }, - "gatsby-plugin-typescript": { - "version": "2.4.18", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.18.tgz", - "integrity": "sha512-irFd9xu+LjEmL7olcuUziVSb2yRf0nVWFwgaDb+l5rfU6HeKr3zyHuxLqBMwvXWTxu6gVs8sAJVXCcxxM4DbeA==", - "requires": { - "@babel/core": "^7.10.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.3", - "@babel/preset-typescript": "^7.10.1", - "@babel/runtime": "^7.10.3", - "babel-plugin-remove-graphql-queries": "^2.9.17" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", @@ -11962,11 +13271,11 @@ } }, "gatsby-react-router-scroll": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-3.0.12.tgz", - "integrity": "sha512-rA7qe/LjKAPnwI4KdKjvx94XIV9a4hCPT+BzKBiifTkm5sFpQyXsfEWmaFfzIaxpKxOwrWsJGpW0OA39yunL8g==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-3.0.13.tgz", + "integrity": "sha512-x/qLvDmvSvKiyoqiTuPWQChtHt8vzEGb4Y9mE1qFoDzX392/KEkh5p8jT7z0XZfo/yB4cQqlQOFKxIMTUOhZvg==", "requires": { - "@babel/runtime": "^7.10.3" + "@babel/runtime": "^7.11.2" }, "dependencies": { "@babel/runtime": { @@ -11988,6 +13297,7 @@ "version": "0.2.17", "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.17.tgz", "integrity": "sha512-BwscTYe1d1wxVUrBt9DZSrDTAhZjjvCj5ncEdfxHXz5BgiJcz6KUb4AVBboI/frOtSGbcSNWBGRJbEWcBQMCvA==", + "dev": true, "requires": { "@babel/core": "^7.9.6", "@babel/generator": "^7.9.6", @@ -12078,6 +13388,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -12086,6 +13397,7 @@ "version": "7.11.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "dev": true, "requires": { "@babel/types": "^7.11.0", "jsesc": "^2.5.1", @@ -12096,6 +13408,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", @@ -12105,12 +13418,14 @@ "@babel/parser": { "version": "7.11.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==", + "dev": true }, "@babel/template": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/parser": "^7.10.4", @@ -12121,6 +13436,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -12131,6 +13447,7 @@ "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", + "dev": true, "requires": { "@babel/core": "7.10.5", "@babel/plugin-syntax-jsx": "7.10.4", @@ -12159,6 +13476,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", + "dev": true, "requires": { "ccount": "^1.0.0", "collapse-white-space": "^1.0.2", @@ -12182,6 +13500,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", + "dev": true, "requires": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -12195,6 +13514,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -12206,27 +13526,32 @@ "@mdx-js/react": { "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", - "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" + "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==", + "dev": true }, "@mdx-js/util": { "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", - "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" + "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==", + "dev": true }, "acorn": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "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==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "babel-plugin-apply-mdx-type-prop": { "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "7.10.4", "@mdx-js/util": "^2.0.0-next.7" @@ -12235,7 +13560,8 @@ "@babel/helper-plugin-utils": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true } } }, @@ -12243,6 +13569,7 @@ "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "7.10.4" }, @@ -12250,19 +13577,22 @@ "@babel/helper-plugin-utils": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true } } }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "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", @@ -12273,6 +13603,7 @@ "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" } @@ -12281,6 +13612,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, "requires": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -12297,6 +13629,7 @@ "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" @@ -12305,12 +13638,14 @@ "flatted": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.0.4.tgz", - "integrity": "sha512-4gZhsMc26tSiMgQ+0gRN818ST2KCkX/4EvqocCkE1+SRb7mapNk4KLSP+XAj02jc8rxuyD3DrmI3a0BQ/TNOpg==" + "integrity": "sha512-4gZhsMc26tSiMgQ+0gRN818ST2KCkX/4EvqocCkE1+SRb7mapNk4KLSP+XAj02jc8rxuyD3DrmI3a0BQ/TNOpg==", + "dev": true }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, "requires": { "pump": "^3.0.0" } @@ -12319,6 +13654,7 @@ "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" } @@ -12326,22 +13662,26 @@ "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -12350,6 +13690,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, "requires": { "repeat-string": "^1.0.0" } @@ -12358,6 +13699,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "dev": true, "requires": { "unist-util-visit": "^2.0.0" } @@ -12365,12 +13707,14 @@ "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "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" } @@ -12379,6 +13723,7 @@ "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" } @@ -12386,17 +13731,20 @@ "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==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "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" } @@ -12404,12 +13752,14 @@ "prettier": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz", - "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==" + "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==", + "dev": true }, "property-information": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", + "dev": true, "requires": { "xtend": "^4.0.0" } @@ -12418,6 +13768,7 @@ "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", + "dev": true, "requires": { "parse-entities": "^2.0.0", "remark-stringify": "^8.1.0", @@ -12430,6 +13781,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", + "dev": true, "requires": { "collapse-white-space": "^1.0.2", "is-alphabetical": "^1.0.0", @@ -12452,6 +13804,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "dev": true, "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -12464,12 +13817,14 @@ "unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true }, "unist-util-remove-position": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "dev": true, "requires": { "unist-util-visit": "^1.1.0" } @@ -12478,6 +13833,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dev": true, "requires": { "unist-util-visit-parents": "^2.0.0" } @@ -12486,6 +13842,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dev": true, "requires": { "unist-util-is": "^3.0.0" } @@ -12493,7 +13850,8 @@ "vfile-location": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", + "dev": true } } }, @@ -12501,6 +13859,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "dev": true, "requires": { "ccount": "^1.0.0", "is-alphanumeric": "^1.0.0", @@ -12521,12 +13880,14 @@ "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -12534,12 +13895,14 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "stringify-entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", + "dev": true, "requires": { "character-entities-html4": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -12552,6 +13915,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -12559,12 +13923,14 @@ "uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "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" } @@ -13146,6 +14512,7 @@ "version": "1.3.28", "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.28.tgz", "integrity": "sha512-nG0lQdY4h+2tbtvHoPEm7UNOu6x/lITFqT1lkXsDl1vkvTMB9sgM2IIoyjBndRH41rjYtaYnPLBGRdYLtTXoZw==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.3", "@babel/runtime": "^7.10.3", @@ -13168,6 +14535,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -13176,6 +14544,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", @@ -13186,6 +14555,7 @@ "version": "7.11.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -13193,17 +14563,20 @@ "is-docker": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true } } }, @@ -13932,19 +15305,19 @@ } }, "graphql-playground-html": { - "version": "1.6.25", - "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.25.tgz", - "integrity": "sha512-wMNvGsQ0OwBVhn72VVi7OdpI85IxiIZT43glRx7gQIwQ6NvhFnzMYBIVmcJAJ4UlXRYiWtrQhuOItDXObiR3kg==", + "version": "1.6.28", + "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.28.tgz", + "integrity": "sha512-22uwTEGjZg0h9rYcM7WspcMPVsixAE8m56tNzwjGr2Y3pNY7OctbsMkJ3EPtPcL6ZdUpzsa4rMgYR54BGmTrpQ==", "requires": { "xss": "^1.0.6" } }, "graphql-playground-middleware-express": { - "version": "1.7.18", - "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.18.tgz", - "integrity": "sha512-EywRL+iBa4u//5YbY1iJxrl0n4IKyomBKgLXrMbG8gHJUwxmFs5FCWJJ4Q6moSn5Q3RgMZvrWzXB27lKwN8Kgw==", + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.21.tgz", + "integrity": "sha512-CjPHDZqJ8ifS6v+JCyEZOEGrR8eKHWaUIUawggfUlW1xFFHCNcBhG4/S7EnSUspaUldSnL/cFcBp4yLhYkG53A==", "requires": { - "graphql-playground-html": "1.6.25" + "graphql-playground-html": "^1.6.28" } }, "graphql-request": { @@ -14483,9 +15856,9 @@ }, "dependencies": { "eventemitter3": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.6.tgz", - "integrity": "sha512-s3GJL04SQoM+gn2c14oyqxvZ3Pcq7cduSDqy3sBFXx6UPSUmgVYwQM9zwkTn9je0lrfg0gHEwR42pF3Q2dCQkQ==" + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" } } }, @@ -16513,9 +17886,9 @@ } }, "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" }, "longest-streak": { "version": "2.0.4", @@ -17085,9 +18458,9 @@ } }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz", + "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw==" }, "moment-mini": { "version": "2.24.0", @@ -17263,9 +18636,9 @@ "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==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-libs-browser": { "version": "2.2.1", @@ -17592,9 +18965,9 @@ } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" }, "is-regex": { "version": "1.1.1", @@ -17728,9 +19101,9 @@ } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "requires": { "cssnano": "^4.1.10", "last-call-webpack-plugin": "^3.0.0" @@ -18227,9 +19600,9 @@ } }, "postcss-calc": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", - "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", + "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -19153,9 +20526,9 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "query-string": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.1.tgz", - "integrity": "sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.2.tgz", + "integrity": "sha512-BMmDaUiLDFU1hlM38jTFcRt7HYiGP/zt1sRzrIWm5zpeEuO1rkbPS0ELI3uehoLuuhHDCS8u8lhFN3fEN4JzPQ==", "requires": { "decode-uri-component": "^0.2.0", "split-on-first": "^1.0.0", @@ -19345,23 +20718,6 @@ "which": "^1.2.9" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "detect-port-alt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", - "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -19451,11 +20807,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -20881,13 +22232,13 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "screenfull": { @@ -20926,11 +22277,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { @@ -21212,9 +22563,9 @@ } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", + "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" }, "is-regex": { "version": "1.1.1", @@ -21812,9 +23163,9 @@ }, "dependencies": { "bl": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", - "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", diff --git a/docs/package.json b/docs/package.json index b4ce7674..5681def9 100644 --- a/docs/package.json +++ b/docs/package.json @@ -6,8 +6,8 @@ "serve": "gatsby serve" }, "dependencies": { + "gatsby": "2.24.51", "algoliasearch": "^4.4.0", - "gatsby": "2.24.50", "gatsby-plugin-gtag": "^1.0.13", "gatsby-source-graphql": "^2.7.2", "gatsby-theme-apollo-docs": "4.3.7", From 76c6f2bfb1a6d820d49b94c71724c6caaa83b79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 9 Oct 2020 08:36:19 +0200 Subject: [PATCH 165/251] controller: * add queue for namespace to monitor ca bundles * clean up recorder events on successful syncs --- .../controller/azureKeyVaultSecret.go | 10 +- .../controller/caBundle.go | 117 +---------- .../controller/controller.go | 69 ++++--- .../controller/namespace.go | 187 ++++++++++++++++++ .../controller/secret.go | 2 +- cmd/azure-keyvault-controller/main.go | 1 + 6 files changed, 234 insertions(+), 152 deletions(-) create mode 100644 cmd/azure-keyvault-controller/controller/namespace.go diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 7078db1c..44a55b5f 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -134,8 +134,8 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return fmt.Errorf(msg) } - log.Infof("Successfully synced AzureKeyVaultSecret %s with Kubernetes Secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) - c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) + log.Debugf("Successfully synced AzureKeyVaultSecret %s with Kubernetes Secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) + c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) return nil } @@ -176,8 +176,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { return err } - log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secrets must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) - c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSyncedWithAzure) + log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secret must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) } log.Debugf("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) @@ -185,7 +184,8 @@ func (c *Controller) syncAzureKeyVault(key string) error { return err } - log.Infof("Successfully synced AzureKeyVaultSecret %s with Azure Key Vault", key) + log.Debugf("Successfully synced AzureKeyVaultSecret %s with Azure Key Vault", key) + c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) return nil } diff --git a/cmd/azure-keyvault-controller/controller/caBundle.go b/cmd/azure-keyvault-controller/controller/caBundle.go index 882908de..56690fe0 100644 --- a/cmd/azure-keyvault-controller/controller/caBundle.go +++ b/cmd/azure-keyvault-controller/controller/caBundle.go @@ -62,14 +62,14 @@ func (c *Controller) syncCABundleSecret(key string) error { labelledNamespaces, err := c.getAllAkvsLabelledNamespaces() - log.Infof("looping all labelled namespaces looking for config map '%s' to update", c.caBundleConfigMapName) + log.Debugf("looping all labelled namespaces looking for config map '%s' to update", c.caBundleConfigMapName) for _, ns := range labelledNamespaces { configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) // If the resource doesn't exist, we'll create it if errors.IsNotFound(err) { - log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating configmap now", c.caBundleConfigMapName, ns.Name) + log.Infof("configmap '%s' not found in labelled namespace '%s' - creating configmap now", c.caBundleConfigMapName, ns.Name) newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { @@ -119,121 +119,10 @@ func (c *Controller) syncCABundleSecret(key string) error { } } - c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) + c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, "CA Bundle successfully synced to to ConfigMap") return nil } -func (c *Controller) getAllAkvsLabelledNamespaces() ([]*corev1.Namespace, error) { - labelSelector := &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "azure-key-vault-env-injection": "enabled", - }, - } - - selector, err := metav1.LabelSelectorAsSelector(labelSelector) - if err != nil { - return nil, err - } - - return c.namespaceLister.List(selector) -} - -//syncHandler for new labelled namespaces -func (c *Controller) syncHandlerNewNamespace(key string) error { - ns, err := c.namespaceLister.Get(key) - if err != nil { - return err - } - - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, key) - cm, err := c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) - - if err != nil { - if errors.IsNotFound(err) { // if configmap does not exist, create it - log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating", c.caBundleConfigMapName, key) - - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) - if err != nil { - return err - } - return nil - } - - return err - } - - if cm != nil { - log.Debugf("configmap '%s' exists in namespace '%s' with old ca bundle - updating", c.caBundleConfigMapName, key) - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) - if err != nil { - return err - } - } - - c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) - return nil -} - -//syncHandler for changed namespaces -func (c *Controller) syncHandlerChangedNamespace(key string) error { - ns, err := c.namespaceLister.Get(key) - if err != nil { - return err - } - - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) - cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) - if err != nil { - if errors.IsNotFound(err) { - log.Debugf("configmap '%s' not found in updated namespace '%s' - creating", c.caBundleConfigMapName, key) - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) - if err != nil { - return err - } - return nil - } - return err - } - - //If the resource exists in a non-labelled namespace, we delete it - if !c.isNamespaceLabelled(ns) && cm != nil { - log.Infof("configmap '%s' exists in namespace '%s' which is no longer labelled to keep CA Bundle", c.caBundleConfigMapName, key) - err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) - if err != nil { - return err - } - } - - return nil -} - -func (c *Controller) isNamespaceLabelled(ns *corev1.Namespace) bool { - lbl := ns.Labels[c.options.NamespaceAkvsLabel] - if lbl == "enabled" { - return true - } - - return false -} - func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigMap { dataByte := secret.Data["ca.crt"] return &corev1.ConfigMap{ diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index a24b6d27..90f8fd7f 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -65,26 +65,27 @@ const ( // fails to sync due to a Deployment already existing MessageResourceExists = "Resource '%s' already exists and is not managed by AzureKeyVaultSecret" - // MessageResourceSynced is the message used for an Event fired when a AzureKeyVaultSecret + // MessageAzureKeyVaultSecretSynced is the message used for an Event fired when a AzureKeyVaultSecret // is synced successfully - MessageResourceSynced = "AzureKeyVaultSecret synced successfully" + MessageAzureKeyVaultSecretSynced = "AzureKeyVaultSecret synced to Kubernetes Secret successfully" - // MessageResourceSyncedWithAzure is the message used for an Event fired when a AzureKeyVaultSecret + // MessageAzureKeyVaultSecretSyncedWithAzureKeyVault is the message used for an Event fired when a AzureKeyVaultSecret // is synced successfully after getting updated secret from Azure Key Vault - MessageResourceSyncedWithAzure = "AzureKeyVaultSecret synced successfully with Azure Key Vault" + MessageAzureKeyVaultSecretSyncedWithAzureKeyVault = "AzureKeyVaultSecret synced to Kubernetes Secret successfully with change from Azure Key Vault" ) // Controller is the controller implementation for AzureKeyVaultSecret resources type Controller struct { - kubeclientset kubernetes.Interface - akvsClient akvcs.Interface - vaultService vault.Service - recorder record.EventRecorder + kubeclientset kubernetes.Interface + akvsClient akvcs.Interface + vaultService vault.Service + recorder record.EventRecorder + kubeInformerFactory informers.SharedInformerFactory + namespaceAkvsLabel string // Secret - secretsLister corelisters.SecretLister - secretInformerFactory informers.SharedInformerFactory - akvsSecretQueue *queue.Worker + secretsLister corelisters.SecretLister + akvsSecretQueue *queue.Worker // AzureKeyVaultSecret azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister @@ -99,14 +100,12 @@ type Controller struct { caBundleConfigMapName string // Namespace - namespaceLister corelisters.NamespaceLister - namespaceInformerFactory informers.SharedInformerFactory - namespaceQueue *queue.Worker + namespaceLister corelisters.NamespaceLister + namespaceQueue *queue.Worker // ConfigMap - configMapLister corelisters.ConfigMapLister - configMapInformerFactory informers.SharedInformerFactory - configMapQueue *queue.Worker + configMapLister corelisters.ConfigMapLister + configMapQueue *queue.Worker options *Options clock Timer @@ -114,11 +113,10 @@ type Controller struct { // Options contains options for the controller type Options struct { - NumThreads int - MaxNumRequeues int - ResyncPeriod time.Duration - AkvsRef corev1.ObjectReference - NamespaceAkvsLabel string + NumThreads int + MaxNumRequeues int + ResyncPeriod time.Duration + AkvsRef corev1.ObjectReference } // AzurePollFrequency controls time durations to wait between polls to Azure Key Vault for changes @@ -134,23 +132,26 @@ type AzurePollFrequency struct { } // NewController returns a new AzureKeyVaultSecret controller -func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, secretInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency, options *Options) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, namespaceAkvsLabel string, azureFrequency AzurePollFrequency, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) controller := &Controller{ - kubeclientset: client, - akvsClient: akvsClient, - recorder: recorder, - vaultService: vaultService, + kubeclientset: client, + akvsClient: akvsClient, + recorder: recorder, + vaultService: vaultService, + namespaceAkvsLabel: namespaceAkvsLabel, - akvsInformerFactory: akvInformerFactory, - secretInformerFactory: secretInformerFactory, + akvsInformerFactory: akvInformerFactory, + kubeInformerFactory: kubeInformerFactory, - secretsLister: secretInformerFactory.Core().V1().Secrets().Lister(), + secretsLister: kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretLister: akvInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), + configMapLister: kubeInformerFactory.Core().V1().ConfigMaps().Lister(), + namespaceLister: kubeInformerFactory.Core().V1().Namespaces().Lister(), options: options, clock: &Clock{}, @@ -160,6 +161,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI controller.akvsSecretQueue = queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, controller.syncSecret) controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) controller.caBundleSecretQueue = queue.New("CABundleSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleSecret) + controller.namespaceQueue = queue.New("Namespaces", options.MaxNumRequeues, options.NumThreads, controller.syncNamespace) log.Info("Setting up event handlers") controller.initAzureKeyVaultSecret() @@ -175,7 +177,7 @@ func (c *Controller) Run(stopCh <-chan struct{}) { // Start the informer factories to begin populating the informer caches log.Info("Starting AzureKeyVaultSecret controller") c.akvsInformerFactory.Start(stopCh) - c.secretInformerFactory.Start(stopCh) + c.kubeInformerFactory.Start(stopCh) // Wait for all involved caches to be synced, before processing items from the queue is started for _, v := range c.akvsInformerFactory.WaitForCacheSync(stopCh) { @@ -184,7 +186,7 @@ func (c *Controller) Run(stopCh <-chan struct{}) { return } } - for _, v := range c.secretInformerFactory.WaitForCacheSync(stopCh) { + for _, v := range c.kubeInformerFactory.WaitForCacheSync(stopCh) { if !v { runtime.HandleError(errors.Errorf("timed out waiting for caches to sync")) return @@ -200,6 +202,9 @@ func (c *Controller) Run(stopCh <-chan struct{}) { log.Info("Starting Azure Key Vault queue") c.azureKeyVaultQueue.Run(stopCh) + log.Info("Starting Namespace queue") + c.namespaceQueue.Run(stopCh) + log.Info("Starting CA Bundle queue") c.caBundleSecretQueue.Run(stopCh) diff --git a/cmd/azure-keyvault-controller/controller/namespace.go b/cmd/azure-keyvault-controller/controller/namespace.go new file mode 100644 index 00000000..1e7cc20e --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/namespace.go @@ -0,0 +1,187 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "fmt" + + log "github.com/sirupsen/logrus" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/tools/cache" + "kmodules.xyz/client-go/tools/queue" +) + +func (c *Controller) initNamespace() { + c.kubeInformerFactory.Core().V1().Namespaces().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { // When a new namespace gets added, that we should add ConfigMap to + ns, err := convertToNamespace(obj) + if err != nil { + log.Errorf("failed to convert to namespace: %v", err) + } + + if c.isInjectorEnabledForNamespace(ns) { + queue.Enqueue(c.namespaceQueue.GetQueue(), ns) + } + }, + UpdateFunc: func(old, new interface{}) { // When an existing namespace gets updated, that potentually have akv2k8s label on it + newNs, err := convertToNamespace(new) + if err != nil { + log.Errorf("failed to convert to namespace: %v", err) + } + + oldNs, err := convertToNamespace(old) + if err != nil { + log.Errorf("failed to convert to namespace: %v", err) + } + + if newNs.ResourceVersion == oldNs.ResourceVersion { + // Periodic resync will send update events for all known Secrets. + // Two different versions of the same Secret will always have different RVs. + return + } + + if c.isInjectorEnabledForNamespace(newNs) || c.isInjectorEnabledForNamespace(oldNs) { + if c.hasNamespaceLabelChanged(oldNs, newNs) { + queue.Enqueue(c.namespaceQueue.GetQueue(), newNs) + } + } + }, + }) +} + +func (c *Controller) syncNamespace(key string) error { + ns, err := c.namespaceLister.Get(key) + if err != nil { + return err + } + + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) + cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + + //If this is a non-labelled namespace, we delete ca bundle config map + if !c.isInjectorEnabledForNamespace(ns) && cm != nil { + log.Infof("configmap '%s' exists in namespace '%s' which is no longer labelled to keep CA Bundle - deleting now", c.caBundleConfigMapName, key) + err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) + if err != nil { + return err + } + msg := fmt.Sprintf("CA Bundle successfully deleted ConfigMap %s in namespace %s", c.caBundleConfigMapName, key) + c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) + return nil + } + + if err != nil { + if errors.IsNotFound(err) { // if configmap does not exist, create it + log.Infof("configmap '%s' not found in labelled namespace '%s' - creating now", c.caBundleConfigMapName, key) + + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + if err != nil { + return err + } + msg := fmt.Sprintf("CA Bundle successfully synced to ConfigMap %s in namespace %s", c.caBundleConfigMapName, key) + c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) + return nil + } + + return err + } + + //Get ca bundle from Secret + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + if err != nil { + return err + } + + dataByte := secret.Data["ca.crt"] + secretCaBundle := string(dataByte) + cmCaBundle, found := cm.Data["ca.crt"] + + if found && secretCaBundle != cmCaBundle { + log.Infof("configmap '%s' exists in namespace '%s' with old ca bundle - updating now", c.caBundleConfigMapName, key) + + newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) + if err != nil { + return err + } + msg := fmt.Sprintf("CA Bundle successfully synced to ConfigMap %s in namespace %s", c.caBundleConfigMapName, key) + c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) + } + + return nil +} + +func (c *Controller) getAllAkvsLabelledNamespaces() ([]*corev1.Namespace, error) { + labelSelector := &metav1.LabelSelector{ + MatchLabels: map[string]string{ + c.caBundleSecretNamespaceName: "enabled", + }, + } + + selector, err := metav1.LabelSelectorAsSelector(labelSelector) + if err != nil { + return nil, err + } + + return c.namespaceLister.List(selector) +} + +func convertToNamespace(obj interface{}) (*corev1.Namespace, error) { + ns, ok := obj.(*corev1.Namespace) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) + } + ns, ok = tombstone.Obj.(*corev1.Namespace) + if !ok { + return nil, fmt.Errorf("tombstone contained object that is not a Secret %#v", obj) + } + } + return ns, nil +} + +func (c *Controller) isInjectorEnabledForNamespace(ns *corev1.Namespace) bool { + lbl := ns.Labels[c.namespaceAkvsLabel] + if lbl == "enabled" { + return true + } + + return false +} + +func (c *Controller) hasNamespaceLabelChanged(oldNs, newNs *corev1.Namespace) bool { + newLbl, newLblExist := newNs.Labels[c.namespaceAkvsLabel] + oldLbl, oldLblExist := oldNs.Labels[c.namespaceAkvsLabel] + + if newLblExist == oldLblExist && newLbl == oldLbl { + return false + } + return true +} diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index d245f488..7bafcd44 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -39,7 +39,7 @@ import ( ) func (c *Controller) initSecret() { - c.secretInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + c.kubeInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { secret, err := convertToSecret(obj) if err != nil { diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index e985a73a..8e9c75a6 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -166,6 +166,7 @@ func main() { kubeInformerFactory, recorder, vaultService, + "azure-key-vault-env-injection", azurePollFrequency, options) From 392a5082d28a5996250188b8ce3256be52529b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 9 Oct 2020 08:53:53 +0200 Subject: [PATCH 166/251] docs: update auth options for aad-pod-identity --- .../source/content/security/authentication.md | 52 +++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md index 7b53b2bd..da97d4fc 100644 --- a/docs/source/content/security/authentication.md +++ b/docs/source/content/security/authentication.md @@ -39,13 +39,55 @@ The Env-Injector execute locally inside Pods and needs AKV credentials to downlo Fore more details, see the [Env Injector Helm Chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector/README.md) and which custom AKV authentication options are available below. -## Using custom authentication with AAD Pod Identity +### Using aad-pod-identity and MSI (System Assigned Managed Identity or User Assigned Managed Identity) -Requires Pod Identity: https://github.com/Azure/aad-pod-identity +If `aad-pod-identity` is installed in a cluster with MSI and akv2k8s, akv2k8s will not work out of the box, as documented by `aad-pod-identity`: -When deploying Pods, set the `aadpodidbinding` according to the -[AAD Pod Identity project docs](https://github.com/Azure/aad-pod-identity/blob/master/README.md) and -the env-injector will use these credentials when communicating with Azure Key Vault. +>The authorization request to fetch a Service Principal Token from an MSI endpoint is sent to Azure Instance Metadata Service (IMDS) endpoint (169.254.169.254), which is redirected to the NMI pod. + +This will prevent akv2k8s to do MSI authentication requests directly with the MSI endpoint, because requests gets delayed by 10-60 seconds: + +>Identity assignment on VM takes 10-20s and 40-60s in case of VMSS. + +Fortunately aad-pod-identity as the concept of application exceptions which will allow akv2k8s to handle MSI authentication requests directly: + +``` +apiVersion: "aadpodidentity.k8s.io/v1" +kind: AzurePodIdentityException +metadata: + name: akv2k8s-exception + namespace: akv2k8s # change if akv2k8s is installed in a different ns +spec: + podLabels: + foo: bar + app: custom +``` + +See https://github.com/Azure/aad-pod-identity/blob/master/docs/readmes/README.app-exception.md for more details. + +### Using custom authentication with AAD Pod Identity (aad-pod-identity) + +First decide on either option 1 or 2 from the [authentication decision tree](#akv-authentication-with-the-env-injector) above. + +#### Option 1 - pass aad-pod-identity to the env-injector + +When installing the env-injector using the official [`akv2k8s`](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s) Helm chart, set the following values: + +``` +--set env_injector.keyVault.customAuth.enabled=true +--set env_injector.webhook.podLabels.aadpodidbinding=[your aad identity] +``` + +...or using the deprecated [azure-key-vault-env-injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector) + +``` +--set keyVault.customAuth.enabled=true +--set webhook.podLabels.aadpodidbinding=[your aad identity] +``` + +#### Option 2 - pass aad-pod-identity to every application pod + +TBD ## Custom AKV Authentication Options From 9efcdb710a6c33ffe8c5c30e2d858aef468d20ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 9 Oct 2020 12:26:12 +0200 Subject: [PATCH 167/251] pkg: add api for azureidentity --- hack/update-codegen.sh | 2 +- pkg/k8s/apis/azureidentity/register.go | 21 +++ pkg/k8s/apis/azureidentity/v1beta1/doc.go | 21 +++ .../apis/azureidentity/v1beta1/register.go | 52 +++++ pkg/k8s/apis/azureidentity/v1beta1/types.go | 46 +++++ .../v1beta1/zz_generated.deepcopy.go | 104 ++++++++++ pkg/k8s/apis/azurekeyvault/v2alpha1/types.go | 38 +--- .../v2alpha1/zz_generated.deepcopy.go | 76 -------- .../client/clientset/versioned/clientset.go | 14 ++ .../versioned/fake/clientset_generated.go | 7 + .../clientset/versioned/fake/register.go | 2 + .../clientset/versioned/scheme/register.go | 2 + .../v1beta1/azureidentity_client.go | 92 +++++++++ .../v1beta1/azuremanagedidentity.go | 177 ++++++++++++++++++ .../typed/azureidentity/v1beta1/doc.go | 23 +++ .../typed/azureidentity/v1beta1/fake/doc.go | 23 +++ .../v1beta1/fake/fake_azureidentity_client.go | 43 +++++ .../v1beta1/fake/fake_azuremanagedidentity.go | 131 +++++++++++++ .../v1beta1/generated_expansion.go | 24 +++ .../v2alpha1/azurekeyvault_client.go | 5 - .../v2alpha1/azurekeyvaultsecretidentity.go | 177 ------------------ .../fake/fake_azurekeyvault_client.go | 4 - .../fake/fake_azurekeyvaultsecretidentity.go | 131 ------------- .../v2alpha1/generated_expansion.go | 2 - .../azureidentity/interface.go | 49 +++++ .../v1beta1/azuremanagedidentity.go | 92 +++++++++ .../azureidentity/v1beta1/interface.go | 48 +++++ .../v2alpha1/azurekeyvaultsecretidentity.go | 92 --------- .../azurekeyvault/v2alpha1/interface.go | 7 - .../informers/externalversions/factory.go | 6 + .../informers/externalversions/generic.go | 9 +- .../v1beta1/azuremanagedidentity.go | 97 ++++++++++ .../v1beta1/expansion_generated.go | 30 +++ .../v2alpha1/azurekeyvaultsecretidentity.go | 97 ---------- .../v2alpha1/expansion_generated.go | 8 - 35 files changed, 1114 insertions(+), 638 deletions(-) create mode 100644 pkg/k8s/apis/azureidentity/register.go create mode 100644 pkg/k8s/apis/azureidentity/v1beta1/doc.go create mode 100644 pkg/k8s/apis/azureidentity/v1beta1/register.go create mode 100644 pkg/k8s/apis/azureidentity/v1beta1/types.go create mode 100644 pkg/k8s/apis/azureidentity/v1beta1/zz_generated.deepcopy.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azuremanagedidentity.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/doc.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/doc.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azuremanagedidentity.go create mode 100644 pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/generated_expansion.go delete mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go delete mode 100644 pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go create mode 100644 pkg/k8s/client/informers/externalversions/azureidentity/interface.go create mode 100644 pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/azuremanagedidentity.go create mode 100644 pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/interface.go delete mode 100644 pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go create mode 100644 pkg/k8s/client/listers/azureidentity/v1beta1/azuremanagedidentity.go create mode 100644 pkg/k8s/client/listers/azureidentity/v1beta1/expansion_generated.go delete mode 100644 pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 74793e4d..f6cb4be2 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -27,7 +27,7 @@ CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ${GOPATH}/src/k8s.io/co # instead of the $GOPATH directly. For normal projects this can be dropped. ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis \ - azurekeyvault:v1alpha1,v1,v2alpha1 \ + "azurekeyvault:v1alpha1,v1,v2alpha1 azureidentity:v1beta1" \ --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt # Generate both v1alpha1 and v1 diff --git a/pkg/k8s/apis/azureidentity/register.go b/pkg/k8s/apis/azureidentity/register.go new file mode 100644 index 00000000..8ea59397 --- /dev/null +++ b/pkg/k8s/apis/azureidentity/register.go @@ -0,0 +1,21 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package azureidentity + +const ( + GroupName = "spv.no" +) diff --git a/pkg/k8s/apis/azureidentity/v1beta1/doc.go b/pkg/k8s/apis/azureidentity/v1beta1/doc.go new file mode 100644 index 00000000..f2ddbc35 --- /dev/null +++ b/pkg/k8s/apis/azureidentity/v1beta1/doc.go @@ -0,0 +1,21 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:deepcopy-gen=package +// +groupName=azureidentity.spv.no + +// Package v1 is the v1 version of the API. +package v1beta1 diff --git a/pkg/k8s/apis/azureidentity/v1beta1/register.go b/pkg/k8s/apis/azureidentity/v1beta1/register.go new file mode 100644 index 00000000..6d6b0481 --- /dev/null +++ b/pkg/k8s/apis/azureidentity/v1beta1/register.go @@ -0,0 +1,52 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: azureidentity.GroupName, Version: "v1beta1"} + +// Kind takes an unqualified kind and returns back a Group qualified GroupKind +func Kind(kind string) schema.GroupKind { + return SchemeGroupVersion.WithKind(kind).GroupKind() +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToScheme +) + +// Adds the list of known types to Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &AzureManagedIdentity{}, + &AzureManagedIdentityList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/pkg/k8s/apis/azureidentity/v1beta1/types.go b/pkg/k8s/apis/azureidentity/v1beta1/types.go new file mode 100644 index 00000000..4120e2b6 --- /dev/null +++ b/pkg/k8s/apis/azureidentity/v1beta1/types.go @@ -0,0 +1,46 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AzureManagedIdentity is an optional MSI identity to use when accessing Azure Key Vault +type AzureManagedIdentity struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec AzureManagedIdentitySpec `json:"spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// AzureManagedIdentityList is a list of AzureKeyVaultSecretIdentity resources +type AzureManagedIdentityList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []AzureManagedIdentity `json:"items"` +} + +type AzureManagedIdentitySpec struct { + Name string `json:"name"` +} diff --git a/pkg/k8s/apis/azureidentity/v1beta1/zz_generated.deepcopy.go b/pkg/k8s/apis/azureidentity/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 00000000..f114073b --- /dev/null +++ b/pkg/k8s/apis/azureidentity/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,104 @@ +// +build !ignore_autogenerated + +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1beta1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureManagedIdentity) DeepCopyInto(out *AzureManagedIdentity) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureManagedIdentity. +func (in *AzureManagedIdentity) DeepCopy() *AzureManagedIdentity { + if in == nil { + return nil + } + out := new(AzureManagedIdentity) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AzureManagedIdentity) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureManagedIdentityList) DeepCopyInto(out *AzureManagedIdentityList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]AzureManagedIdentity, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureManagedIdentityList. +func (in *AzureManagedIdentityList) DeepCopy() *AzureManagedIdentityList { + if in == nil { + return nil + } + out := new(AzureManagedIdentityList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AzureManagedIdentityList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureManagedIdentitySpec) DeepCopyInto(out *AzureManagedIdentitySpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureManagedIdentitySpec. +func (in *AzureManagedIdentitySpec) DeepCopy() *AzureManagedIdentitySpec { + if in == nil { + return nil + } + out := new(AzureManagedIdentitySpec) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go index 63ad0a1a..3acfb574 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go @@ -43,39 +43,6 @@ type AzureKeyVaultSecretList struct { Items []AzureKeyVaultSecret `json:"items"` } -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// AzureKeyVaultSecretIdentity is an optional MSI identity to use when accessing Azure Key Vault -type AzureKeyVaultSecretIdentity struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec AzureKeyVaultSecretIdentitySpec `json:"spec"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// AzureKeyVaultSecretIdentityList is a list of AzureKeyVaultSecretIdentity resources -type AzureKeyVaultSecretIdentityList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []AzureKeyVaultSecretIdentity `json:"items"` -} - -type AzureKeyVaultSecretIdentitySpec struct { - Name string `json:"name"` - Type AzureKeyVaultSecretIdentityType `json:"type"` -} - -type AzureKeyVaultSecretIdentityType string - -const ( - // AzureKeyVaultSecretIdentityTypeAzureIdentity - get Secret object type from Azure Key Vault - AzureKeyVaultSecretIdentityTypeAzureIdentity AzureKeyVaultSecretIdentityType = "azureIdentity" -) - // AzureKeyVaultSecretSpec is the spec for a AzureKeyVaultSecret resource type AzureKeyVaultSecretSpec struct { Vault AzureKeyVault `json:"vault"` @@ -85,8 +52,9 @@ type AzureKeyVaultSecretSpec struct { // AzureKeyVault contains information needed to get the // Azure Key Vault secret from Azure Key Vault type AzureKeyVault struct { - Name string `json:"name"` - Object AzureKeyVaultObject `json:"object"` + Name string `json:"name"` + Object AzureKeyVaultObject `json:"object"` + AzureIdentity string `json:"azureIdentity"` } // AzureKeyVaultObject has information about the Azure Key Vault diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go index 35e587a9..6adfc04e 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go @@ -126,82 +126,6 @@ func (in *AzureKeyVaultSecret) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureKeyVaultSecretIdentity) DeepCopyInto(out *AzureKeyVaultSecretIdentity) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretIdentity. -func (in *AzureKeyVaultSecretIdentity) DeepCopy() *AzureKeyVaultSecretIdentity { - if in == nil { - return nil - } - out := new(AzureKeyVaultSecretIdentity) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureKeyVaultSecretIdentity) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureKeyVaultSecretIdentityList) DeepCopyInto(out *AzureKeyVaultSecretIdentityList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]AzureKeyVaultSecretIdentity, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretIdentityList. -func (in *AzureKeyVaultSecretIdentityList) DeepCopy() *AzureKeyVaultSecretIdentityList { - if in == nil { - return nil - } - out := new(AzureKeyVaultSecretIdentityList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureKeyVaultSecretIdentityList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureKeyVaultSecretIdentitySpec) DeepCopyInto(out *AzureKeyVaultSecretIdentitySpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretIdentitySpec. -func (in *AzureKeyVaultSecretIdentitySpec) DeepCopy() *AzureKeyVaultSecretIdentitySpec { - if in == nil { - return nil - } - out := new(AzureKeyVaultSecretIdentitySpec) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AzureKeyVaultSecretList) DeepCopyInto(out *AzureKeyVaultSecretList) { *out = *in diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index d4c390a8..d4f59972 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -24,6 +24,7 @@ package versioned import ( "fmt" + azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1" azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" @@ -34,6 +35,7 @@ import ( type Interface interface { Discovery() discovery.DiscoveryInterface + AzureidentityV1beta1() azureidentityv1beta1.AzureidentityV1beta1Interface AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface AzurekeyvaultV2alpha1() azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Interface @@ -43,11 +45,17 @@ type Interface interface { // version included in a Clientset. type Clientset struct { *discovery.DiscoveryClient + azureidentityV1beta1 *azureidentityv1beta1.AzureidentityV1beta1Client azurekeyvaultV1alpha1 *azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Client azurekeyvaultV1 *azurekeyvaultv1.AzurekeyvaultV1Client azurekeyvaultV2alpha1 *azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Client } +// AzureidentityV1beta1 retrieves the AzureidentityV1beta1Client +func (c *Clientset) AzureidentityV1beta1() azureidentityv1beta1.AzureidentityV1beta1Interface { + return c.azureidentityV1beta1 +} + // AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface { return c.azurekeyvaultV1alpha1 @@ -84,6 +92,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { } var cs Clientset var err error + cs.azureidentityV1beta1, err = azureidentityv1beta1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.azurekeyvaultV1alpha1, err = azurekeyvaultv1alpha1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -108,6 +120,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset + cs.azureidentityV1beta1 = azureidentityv1beta1.NewForConfigOrDie(c) cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.NewForConfigOrDie(c) cs.azurekeyvaultV1 = azurekeyvaultv1.NewForConfigOrDie(c) cs.azurekeyvaultV2alpha1 = azurekeyvaultv2alpha1.NewForConfigOrDie(c) @@ -119,6 +132,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { // New creates a new Clientset for the given RESTClient. func New(c rest.Interface) *Clientset { var cs Clientset + cs.azureidentityV1beta1 = azureidentityv1beta1.New(c) cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.New(c) cs.azurekeyvaultV1 = azurekeyvaultv1.New(c) cs.azurekeyvaultV2alpha1 = azurekeyvaultv2alpha1.New(c) diff --git a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go index a9b4522f..2b765c38 100644 --- a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go +++ b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go @@ -23,6 +23,8 @@ package fake import ( clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1" + fakeazureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake" azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" fakeazurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" @@ -83,6 +85,11 @@ func (c *Clientset) Tracker() testing.ObjectTracker { var _ clientset.Interface = &Clientset{} +// AzureidentityV1beta1 retrieves the AzureidentityV1beta1Client +func (c *Clientset) AzureidentityV1beta1() azureidentityv1beta1.AzureidentityV1beta1Interface { + return &fakeazureidentityv1beta1.FakeAzureidentityV1beta1{Fake: &c.Fake} +} + // AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface { return &fakeazurekeyvaultv1alpha1.FakeAzurekeyvaultV1alpha1{Fake: &c.Fake} diff --git a/pkg/k8s/client/clientset/versioned/fake/register.go b/pkg/k8s/client/clientset/versioned/fake/register.go index a1df65d4..f9e44d62 100644 --- a/pkg/k8s/client/clientset/versioned/fake/register.go +++ b/pkg/k8s/client/clientset/versioned/fake/register.go @@ -22,6 +22,7 @@ limitations under the License. package fake import ( + azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" @@ -36,6 +37,7 @@ var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) var localSchemeBuilder = runtime.SchemeBuilder{ + azureidentityv1beta1.AddToScheme, azurekeyvaultv1alpha1.AddToScheme, azurekeyvaultv1.AddToScheme, azurekeyvaultv2alpha1.AddToScheme, diff --git a/pkg/k8s/client/clientset/versioned/scheme/register.go b/pkg/k8s/client/clientset/versioned/scheme/register.go index 50785996..ed623c17 100644 --- a/pkg/k8s/client/clientset/versioned/scheme/register.go +++ b/pkg/k8s/client/clientset/versioned/scheme/register.go @@ -22,6 +22,7 @@ limitations under the License. package scheme import ( + azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" @@ -36,6 +37,7 @@ var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) var localSchemeBuilder = runtime.SchemeBuilder{ + azureidentityv1beta1.AddToScheme, azurekeyvaultv1alpha1.AddToScheme, azurekeyvaultv1.AddToScheme, azurekeyvaultv2alpha1.AddToScheme, diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go new file mode 100644 index 00000000..00f1eb3d --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go @@ -0,0 +1,92 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + rest "k8s.io/client-go/rest" +) + +type AzureidentityV1beta1Interface interface { + RESTClient() rest.Interface + AzureManagedIdentitiesGetter +} + +// AzureidentityV1beta1Client is used to interact with features provided by the azureidentity.spv.no group. +type AzureidentityV1beta1Client struct { + restClient rest.Interface +} + +func (c *AzureidentityV1beta1Client) AzureManagedIdentities(namespace string) AzureManagedIdentityInterface { + return newAzureManagedIdentities(c, namespace) +} + +// NewForConfig creates a new AzureidentityV1beta1Client for the given config. +func NewForConfig(c *rest.Config) (*AzureidentityV1beta1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &AzureidentityV1beta1Client{client}, nil +} + +// NewForConfigOrDie creates a new AzureidentityV1beta1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *AzureidentityV1beta1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new AzureidentityV1beta1Client for the given RESTClient. +func New(c rest.Interface) *AzureidentityV1beta1Client { + return &AzureidentityV1beta1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1beta1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *AzureidentityV1beta1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azuremanagedidentity.go new file mode 100644 index 00000000..ae5cd2ff --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azuremanagedidentity.go @@ -0,0 +1,177 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + "time" + + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// AzureManagedIdentitiesGetter has a method to return a AzureManagedIdentityInterface. +// A group's client should implement this interface. +type AzureManagedIdentitiesGetter interface { + AzureManagedIdentities(namespace string) AzureManagedIdentityInterface +} + +// AzureManagedIdentityInterface has methods to work with AzureManagedIdentity resources. +type AzureManagedIdentityInterface interface { + Create(*v1beta1.AzureManagedIdentity) (*v1beta1.AzureManagedIdentity, error) + Update(*v1beta1.AzureManagedIdentity) (*v1beta1.AzureManagedIdentity, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1beta1.AzureManagedIdentity, error) + List(opts v1.ListOptions) (*v1beta1.AzureManagedIdentityList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.AzureManagedIdentity, err error) + AzureManagedIdentityExpansion +} + +// azureManagedIdentities implements AzureManagedIdentityInterface +type azureManagedIdentities struct { + client rest.Interface + ns string +} + +// newAzureManagedIdentities returns a AzureManagedIdentities +func newAzureManagedIdentities(c *AzureidentityV1beta1Client, namespace string) *azureManagedIdentities { + return &azureManagedIdentities{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the azureManagedIdentity, and returns the corresponding azureManagedIdentity object, and an error if there is any. +func (c *azureManagedIdentities) Get(name string, options v1.GetOptions) (result *v1beta1.AzureManagedIdentity, err error) { + result = &v1beta1.AzureManagedIdentity{} + err = c.client.Get(). + Namespace(c.ns). + Resource("azuremanagedidentities"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of AzureManagedIdentities that match those selectors. +func (c *azureManagedIdentities) List(opts v1.ListOptions) (result *v1beta1.AzureManagedIdentityList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1beta1.AzureManagedIdentityList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("azuremanagedidentities"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested azureManagedIdentities. +func (c *azureManagedIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("azuremanagedidentities"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch() +} + +// Create takes the representation of a azureManagedIdentity and creates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. +func (c *azureManagedIdentities) Create(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { + result = &v1beta1.AzureManagedIdentity{} + err = c.client.Post(). + Namespace(c.ns). + Resource("azuremanagedidentities"). + Body(azureManagedIdentity). + Do(). + Into(result) + return +} + +// Update takes the representation of a azureManagedIdentity and updates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. +func (c *azureManagedIdentities) Update(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { + result = &v1beta1.AzureManagedIdentity{} + err = c.client.Put(). + Namespace(c.ns). + Resource("azuremanagedidentities"). + Name(azureManagedIdentity.Name). + Body(azureManagedIdentity). + Do(). + Into(result) + return +} + +// Delete takes name of the azureManagedIdentity and deletes it. Returns an error if one occurs. +func (c *azureManagedIdentities) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("azuremanagedidentities"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *azureManagedIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + var timeout time.Duration + if listOptions.TimeoutSeconds != nil { + timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("azuremanagedidentities"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Timeout(timeout). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched azureManagedIdentity. +func (c *azureManagedIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.AzureManagedIdentity, err error) { + result = &v1beta1.AzureManagedIdentity{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("azuremanagedidentities"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/doc.go b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/doc.go new file mode 100644 index 00000000..b53c05c9 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/doc.go @@ -0,0 +1,23 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1beta1 diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/doc.go new file mode 100644 index 00000000..d55229c6 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/doc.go @@ -0,0 +1,23 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// Package fake has the automatically generated clients. +package fake diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go new file mode 100644 index 00000000..44084c1d --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go @@ -0,0 +1,43 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakeAzureidentityV1beta1 struct { + *testing.Fake +} + +func (c *FakeAzureidentityV1beta1) AzureManagedIdentities(namespace string) v1beta1.AzureManagedIdentityInterface { + return &FakeAzureManagedIdentities{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeAzureidentityV1beta1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azuremanagedidentity.go b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azuremanagedidentity.go new file mode 100644 index 00000000..dd7d7365 --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azuremanagedidentity.go @@ -0,0 +1,131 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeAzureManagedIdentities implements AzureManagedIdentityInterface +type FakeAzureManagedIdentities struct { + Fake *FakeAzureidentityV1beta1 + ns string +} + +var azuremanagedidentitiesResource = schema.GroupVersionResource{Group: "azureidentity.spv.no", Version: "v1beta1", Resource: "azuremanagedidentities"} + +var azuremanagedidentitiesKind = schema.GroupVersionKind{Group: "azureidentity.spv.no", Version: "v1beta1", Kind: "AzureManagedIdentity"} + +// Get takes name of the azureManagedIdentity, and returns the corresponding azureManagedIdentity object, and an error if there is any. +func (c *FakeAzureManagedIdentities) Get(name string, options v1.GetOptions) (result *v1beta1.AzureManagedIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(azuremanagedidentitiesResource, c.ns, name), &v1beta1.AzureManagedIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.AzureManagedIdentity), err +} + +// List takes label and field selectors, and returns the list of AzureManagedIdentities that match those selectors. +func (c *FakeAzureManagedIdentities) List(opts v1.ListOptions) (result *v1beta1.AzureManagedIdentityList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(azuremanagedidentitiesResource, azuremanagedidentitiesKind, c.ns, opts), &v1beta1.AzureManagedIdentityList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1beta1.AzureManagedIdentityList{ListMeta: obj.(*v1beta1.AzureManagedIdentityList).ListMeta} + for _, item := range obj.(*v1beta1.AzureManagedIdentityList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested azureManagedIdentities. +func (c *FakeAzureManagedIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(azuremanagedidentitiesResource, c.ns, opts)) + +} + +// Create takes the representation of a azureManagedIdentity and creates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. +func (c *FakeAzureManagedIdentities) Create(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(azuremanagedidentitiesResource, c.ns, azureManagedIdentity), &v1beta1.AzureManagedIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.AzureManagedIdentity), err +} + +// Update takes the representation of a azureManagedIdentity and updates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. +func (c *FakeAzureManagedIdentities) Update(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(azuremanagedidentitiesResource, c.ns, azureManagedIdentity), &v1beta1.AzureManagedIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.AzureManagedIdentity), err +} + +// Delete takes name of the azureManagedIdentity and deletes it. Returns an error if one occurs. +func (c *FakeAzureManagedIdentities) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(azuremanagedidentitiesResource, c.ns, name), &v1beta1.AzureManagedIdentity{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeAzureManagedIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(azuremanagedidentitiesResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &v1beta1.AzureManagedIdentityList{}) + return err +} + +// Patch applies the patch and returns the patched azureManagedIdentity. +func (c *FakeAzureManagedIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.AzureManagedIdentity, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(azuremanagedidentitiesResource, c.ns, name, pt, data, subresources...), &v1beta1.AzureManagedIdentity{}) + + if obj == nil { + return nil, err + } + return obj.(*v1beta1.AzureManagedIdentity), err +} diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/generated_expansion.go new file mode 100644 index 00000000..9793ecec --- /dev/null +++ b/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/generated_expansion.go @@ -0,0 +1,24 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +type AzureManagedIdentityExpansion interface{} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go index 1a6ee9db..b17ac47b 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go @@ -30,7 +30,6 @@ import ( type AzurekeyvaultV2alpha1Interface interface { RESTClient() rest.Interface AzureKeyVaultSecretsGetter - AzureKeyVaultSecretIdentitiesGetter } // AzurekeyvaultV2alpha1Client is used to interact with features provided by the azurekeyvault.spv.no group. @@ -42,10 +41,6 @@ func (c *AzurekeyvaultV2alpha1Client) AzureKeyVaultSecrets(namespace string) Azu return newAzureKeyVaultSecrets(c, namespace) } -func (c *AzurekeyvaultV2alpha1Client) AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityInterface { - return newAzureKeyVaultSecretIdentities(c, namespace) -} - // NewForConfig creates a new AzurekeyvaultV2alpha1Client for the given config. func NewForConfig(c *rest.Config) (*AzurekeyvaultV2alpha1Client, error) { config := *c diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go deleted file mode 100644 index d0258b3f..00000000 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go +++ /dev/null @@ -1,177 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - "time" - - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// AzureKeyVaultSecretIdentitiesGetter has a method to return a AzureKeyVaultSecretIdentityInterface. -// A group's client should implement this interface. -type AzureKeyVaultSecretIdentitiesGetter interface { - AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityInterface -} - -// AzureKeyVaultSecretIdentityInterface has methods to work with AzureKeyVaultSecretIdentity resources. -type AzureKeyVaultSecretIdentityInterface interface { - Create(*v2alpha1.AzureKeyVaultSecretIdentity) (*v2alpha1.AzureKeyVaultSecretIdentity, error) - Update(*v2alpha1.AzureKeyVaultSecretIdentity) (*v2alpha1.AzureKeyVaultSecretIdentity, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v2alpha1.AzureKeyVaultSecretIdentity, error) - List(opts v1.ListOptions) (*v2alpha1.AzureKeyVaultSecretIdentityList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) - AzureKeyVaultSecretIdentityExpansion -} - -// azureKeyVaultSecretIdentities implements AzureKeyVaultSecretIdentityInterface -type azureKeyVaultSecretIdentities struct { - client rest.Interface - ns string -} - -// newAzureKeyVaultSecretIdentities returns a AzureKeyVaultSecretIdentities -func newAzureKeyVaultSecretIdentities(c *AzurekeyvaultV2alpha1Client, namespace string) *azureKeyVaultSecretIdentities { - return &azureKeyVaultSecretIdentities{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the azureKeyVaultSecretIdentity, and returns the corresponding azureKeyVaultSecretIdentity object, and an error if there is any. -func (c *azureKeyVaultSecretIdentities) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - result = &v2alpha1.AzureKeyVaultSecretIdentity{} - err = c.client.Get(). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of AzureKeyVaultSecretIdentities that match those selectors. -func (c *azureKeyVaultSecretIdentities) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretIdentityList, err error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - result = &v2alpha1.AzureKeyVaultSecretIdentityList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested azureKeyVaultSecretIdentities. -func (c *azureKeyVaultSecretIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Watch() -} - -// Create takes the representation of a azureKeyVaultSecretIdentity and creates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. -func (c *azureKeyVaultSecretIdentities) Create(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - result = &v2alpha1.AzureKeyVaultSecretIdentity{} - err = c.client.Post(). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - Body(azureKeyVaultSecretIdentity). - Do(). - Into(result) - return -} - -// Update takes the representation of a azureKeyVaultSecretIdentity and updates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. -func (c *azureKeyVaultSecretIdentities) Update(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - result = &v2alpha1.AzureKeyVaultSecretIdentity{} - err = c.client.Put(). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - Name(azureKeyVaultSecretIdentity.Name). - Body(azureKeyVaultSecretIdentity). - Do(). - Into(result) - return -} - -// Delete takes name of the azureKeyVaultSecretIdentity and deletes it. Returns an error if one occurs. -func (c *azureKeyVaultSecretIdentities) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *azureKeyVaultSecretIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second - } - return c.client.Delete(). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Timeout(timeout). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched azureKeyVaultSecretIdentity. -func (c *azureKeyVaultSecretIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - result = &v2alpha1.AzureKeyVaultSecretIdentity{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("azurekeyvaultsecretidentities"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go index 35e260d0..0282b0e1 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go @@ -35,10 +35,6 @@ func (c *FakeAzurekeyvaultV2alpha1) AzureKeyVaultSecrets(namespace string) v2alp return &FakeAzureKeyVaultSecrets{c, namespace} } -func (c *FakeAzurekeyvaultV2alpha1) AzureKeyVaultSecretIdentities(namespace string) v2alpha1.AzureKeyVaultSecretIdentityInterface { - return &FakeAzureKeyVaultSecretIdentities{c, namespace} -} - // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. func (c *FakeAzurekeyvaultV2alpha1) RESTClient() rest.Interface { diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go deleted file mode 100644 index f0d03f84..00000000 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecretidentity.go +++ /dev/null @@ -1,131 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeAzureKeyVaultSecretIdentities implements AzureKeyVaultSecretIdentityInterface -type FakeAzureKeyVaultSecretIdentities struct { - Fake *FakeAzurekeyvaultV2alpha1 - ns string -} - -var azurekeyvaultsecretidentitiesResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Resource: "azurekeyvaultsecretidentities"} - -var azurekeyvaultsecretidentitiesKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Kind: "AzureKeyVaultSecretIdentity"} - -// Get takes name of the azureKeyVaultSecretIdentity, and returns the corresponding azureKeyVaultSecretIdentity object, and an error if there is any. -func (c *FakeAzureKeyVaultSecretIdentities) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(azurekeyvaultsecretidentitiesResource, c.ns, name), &v2alpha1.AzureKeyVaultSecretIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err -} - -// List takes label and field selectors, and returns the list of AzureKeyVaultSecretIdentities that match those selectors. -func (c *FakeAzureKeyVaultSecretIdentities) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretIdentityList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(azurekeyvaultsecretidentitiesResource, azurekeyvaultsecretidentitiesKind, c.ns, opts), &v2alpha1.AzureKeyVaultSecretIdentityList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v2alpha1.AzureKeyVaultSecretIdentityList{ListMeta: obj.(*v2alpha1.AzureKeyVaultSecretIdentityList).ListMeta} - for _, item := range obj.(*v2alpha1.AzureKeyVaultSecretIdentityList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested azureKeyVaultSecretIdentities. -func (c *FakeAzureKeyVaultSecretIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretidentitiesResource, c.ns, opts)) - -} - -// Create takes the representation of a azureKeyVaultSecretIdentity and creates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. -func (c *FakeAzureKeyVaultSecretIdentities) Create(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(azurekeyvaultsecretidentitiesResource, c.ns, azureKeyVaultSecretIdentity), &v2alpha1.AzureKeyVaultSecretIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err -} - -// Update takes the representation of a azureKeyVaultSecretIdentity and updates it. Returns the server's representation of the azureKeyVaultSecretIdentity, and an error, if there is any. -func (c *FakeAzureKeyVaultSecretIdentities) Update(azureKeyVaultSecretIdentity *v2alpha1.AzureKeyVaultSecretIdentity) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(azurekeyvaultsecretidentitiesResource, c.ns, azureKeyVaultSecretIdentity), &v2alpha1.AzureKeyVaultSecretIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err -} - -// Delete takes name of the azureKeyVaultSecretIdentity and deletes it. Returns an error if one occurs. -func (c *FakeAzureKeyVaultSecretIdentities) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(azurekeyvaultsecretidentitiesResource, c.ns, name), &v2alpha1.AzureKeyVaultSecretIdentity{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeAzureKeyVaultSecretIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(azurekeyvaultsecretidentitiesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v2alpha1.AzureKeyVaultSecretIdentityList{}) - return err -} - -// Patch applies the patch and returns the patched azureKeyVaultSecretIdentity. -func (c *FakeAzureKeyVaultSecretIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecretIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretidentitiesResource, c.ns, name, pt, data, subresources...), &v2alpha1.AzureKeyVaultSecretIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), err -} diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go index 4d37b892..db5561ea 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go @@ -22,5 +22,3 @@ limitations under the License. package v2alpha1 type AzureKeyVaultSecretExpansion interface{} - -type AzureKeyVaultSecretIdentityExpansion interface{} diff --git a/pkg/k8s/client/informers/externalversions/azureidentity/interface.go b/pkg/k8s/client/informers/externalversions/azureidentity/interface.go new file mode 100644 index 00000000..3675abd1 --- /dev/null +++ b/pkg/k8s/client/informers/externalversions/azureidentity/interface.go @@ -0,0 +1,49 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package azureidentity + +import ( + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" +) + +// Interface provides access to each of this group's versions. +type Interface interface { + // V1beta1 provides access to shared informers for resources in V1beta1. + V1beta1() v1beta1.Interface +} + +type group struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// V1beta1 returns a new v1beta1.Interface. +func (g *group) V1beta1() v1beta1.Interface { + return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/azuremanagedidentity.go new file mode 100644 index 00000000..a23d56f8 --- /dev/null +++ b/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/azuremanagedidentity.go @@ -0,0 +1,92 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1beta1 + +import ( + time "time" + + azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azureidentity/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// AzureManagedIdentityInformer provides access to a shared informer and lister for +// AzureManagedIdentities. +type AzureManagedIdentityInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1beta1.AzureManagedIdentityLister +} + +type azureManagedIdentityInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewAzureManagedIdentityInformer constructs a new informer for AzureManagedIdentity type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewAzureManagedIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredAzureManagedIdentityInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredAzureManagedIdentityInformer constructs a new informer for AzureManagedIdentity type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredAzureManagedIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AzureidentityV1beta1().AzureManagedIdentities(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AzureidentityV1beta1().AzureManagedIdentities(namespace).Watch(options) + }, + }, + &azureidentityv1beta1.AzureManagedIdentity{}, + resyncPeriod, + indexers, + ) +} + +func (f *azureManagedIdentityInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredAzureManagedIdentityInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *azureManagedIdentityInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&azureidentityv1beta1.AzureManagedIdentity{}, f.defaultInformer) +} + +func (f *azureManagedIdentityInformer) Lister() v1beta1.AzureManagedIdentityLister { + return v1beta1.NewAzureManagedIdentityLister(f.Informer().GetIndexer()) +} diff --git a/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/interface.go b/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/interface.go new file mode 100644 index 00000000..992f9301 --- /dev/null +++ b/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/interface.go @@ -0,0 +1,48 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1beta1 + +import ( + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // AzureManagedIdentities returns a AzureManagedIdentityInformer. + AzureManagedIdentities() AzureManagedIdentityInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// AzureManagedIdentities returns a AzureManagedIdentityInformer. +func (v *version) AzureManagedIdentities() AzureManagedIdentityInformer { + return &azureManagedIdentityInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go deleted file mode 100644 index affaf676..00000000 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - time "time" - - azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - cache "k8s.io/client-go/tools/cache" -) - -// AzureKeyVaultSecretIdentityInformer provides access to a shared informer and lister for -// AzureKeyVaultSecretIdentities. -type AzureKeyVaultSecretIdentityInformer interface { - Informer() cache.SharedIndexInformer - Lister() v2alpha1.AzureKeyVaultSecretIdentityLister -} - -type azureKeyVaultSecretIdentityInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewAzureKeyVaultSecretIdentityInformer constructs a new informer for AzureKeyVaultSecretIdentity type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewAzureKeyVaultSecretIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredAzureKeyVaultSecretIdentityInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredAzureKeyVaultSecretIdentityInformer constructs a new informer for AzureKeyVaultSecretIdentity type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredAzureKeyVaultSecretIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecretIdentities(namespace).List(options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecretIdentities(namespace).Watch(options) - }, - }, - &azurekeyvaultv2alpha1.AzureKeyVaultSecretIdentity{}, - resyncPeriod, - indexers, - ) -} - -func (f *azureKeyVaultSecretIdentityInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredAzureKeyVaultSecretIdentityInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *azureKeyVaultSecretIdentityInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&azurekeyvaultv2alpha1.AzureKeyVaultSecretIdentity{}, f.defaultInformer) -} - -func (f *azureKeyVaultSecretIdentityInformer) Lister() v2alpha1.AzureKeyVaultSecretIdentityLister { - return v2alpha1.NewAzureKeyVaultSecretIdentityLister(f.Informer().GetIndexer()) -} diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go index 85ae29b2..d1154e3a 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go @@ -29,8 +29,6 @@ import ( type Interface interface { // AzureKeyVaultSecrets returns a AzureKeyVaultSecretInformer. AzureKeyVaultSecrets() AzureKeyVaultSecretInformer - // AzureKeyVaultSecretIdentities returns a AzureKeyVaultSecretIdentityInformer. - AzureKeyVaultSecretIdentities() AzureKeyVaultSecretIdentityInformer } type version struct { @@ -48,8 +46,3 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList func (v *version) AzureKeyVaultSecrets() AzureKeyVaultSecretInformer { return &azureKeyVaultSecretInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } - -// AzureKeyVaultSecretIdentities returns a AzureKeyVaultSecretIdentityInformer. -func (v *version) AzureKeyVaultSecretIdentities() AzureKeyVaultSecretIdentityInformer { - return &azureKeyVaultSecretIdentityInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} diff --git a/pkg/k8s/client/informers/externalversions/factory.go b/pkg/k8s/client/informers/externalversions/factory.go index e2040ac8..4b647da0 100644 --- a/pkg/k8s/client/informers/externalversions/factory.go +++ b/pkg/k8s/client/informers/externalversions/factory.go @@ -27,6 +27,7 @@ import ( time "time" versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + azureidentity "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azureidentity" azurekeyvault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -175,9 +176,14 @@ type SharedInformerFactory interface { ForResource(resource schema.GroupVersionResource) (GenericInformer, error) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool + Azureidentity() azureidentity.Interface Azurekeyvault() azurekeyvault.Interface } +func (f *sharedInformerFactory) Azureidentity() azureidentity.Interface { + return azureidentity.New(f, f.namespace, f.tweakListOptions) +} + func (f *sharedInformerFactory) Azurekeyvault() azurekeyvault.Interface { return azurekeyvault.New(f, f.namespace, f.tweakListOptions) } diff --git a/pkg/k8s/client/informers/externalversions/generic.go b/pkg/k8s/client/informers/externalversions/generic.go index f9c2c288..903f801e 100644 --- a/pkg/k8s/client/informers/externalversions/generic.go +++ b/pkg/k8s/client/informers/externalversions/generic.go @@ -24,6 +24,7 @@ package externalversions import ( "fmt" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" @@ -57,7 +58,11 @@ func (f *genericInformer) Lister() cache.GenericLister { // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { - // Group=azurekeyvault.spv.no, Version=v1 + // Group=azureidentity.spv.no, Version=v1beta1 + case v1beta1.SchemeGroupVersion.WithResource("azuremanagedidentities"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Azureidentity().V1beta1().AzureManagedIdentities().Informer()}, nil + + // Group=azurekeyvault.spv.no, Version=v1 case v1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V1().AzureKeyVaultSecrets().Informer()}, nil @@ -68,8 +73,6 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource // Group=azurekeyvault.spv.no, Version=v2alpha1 case v2alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer()}, nil - case v2alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecretidentities"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V2alpha1().AzureKeyVaultSecretIdentities().Informer()}, nil } diff --git a/pkg/k8s/client/listers/azureidentity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/listers/azureidentity/v1beta1/azuremanagedidentity.go new file mode 100644 index 00000000..63308ea1 --- /dev/null +++ b/pkg/k8s/client/listers/azureidentity/v1beta1/azuremanagedidentity.go @@ -0,0 +1,97 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// AzureManagedIdentityLister helps list AzureManagedIdentities. +type AzureManagedIdentityLister interface { + // List lists all AzureManagedIdentities in the indexer. + List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) + // AzureManagedIdentities returns an object that can list and get AzureManagedIdentities. + AzureManagedIdentities(namespace string) AzureManagedIdentityNamespaceLister + AzureManagedIdentityListerExpansion +} + +// azureManagedIdentityLister implements the AzureManagedIdentityLister interface. +type azureManagedIdentityLister struct { + indexer cache.Indexer +} + +// NewAzureManagedIdentityLister returns a new AzureManagedIdentityLister. +func NewAzureManagedIdentityLister(indexer cache.Indexer) AzureManagedIdentityLister { + return &azureManagedIdentityLister{indexer: indexer} +} + +// List lists all AzureManagedIdentities in the indexer. +func (s *azureManagedIdentityLister) List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.AzureManagedIdentity)) + }) + return ret, err +} + +// AzureManagedIdentities returns an object that can list and get AzureManagedIdentities. +func (s *azureManagedIdentityLister) AzureManagedIdentities(namespace string) AzureManagedIdentityNamespaceLister { + return azureManagedIdentityNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// AzureManagedIdentityNamespaceLister helps list and get AzureManagedIdentities. +type AzureManagedIdentityNamespaceLister interface { + // List lists all AzureManagedIdentities in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) + // Get retrieves the AzureManagedIdentity from the indexer for a given namespace and name. + Get(name string) (*v1beta1.AzureManagedIdentity, error) + AzureManagedIdentityNamespaceListerExpansion +} + +// azureManagedIdentityNamespaceLister implements the AzureManagedIdentityNamespaceLister +// interface. +type azureManagedIdentityNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all AzureManagedIdentities in the indexer for a given namespace. +func (s azureManagedIdentityNamespaceLister) List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.AzureManagedIdentity)) + }) + return ret, err +} + +// Get retrieves the AzureManagedIdentity from the indexer for a given namespace and name. +func (s azureManagedIdentityNamespaceLister) Get(name string) (*v1beta1.AzureManagedIdentity, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1beta1.Resource("azuremanagedidentity"), name) + } + return obj.(*v1beta1.AzureManagedIdentity), nil +} diff --git a/pkg/k8s/client/listers/azureidentity/v1beta1/expansion_generated.go b/pkg/k8s/client/listers/azureidentity/v1beta1/expansion_generated.go new file mode 100644 index 00000000..da14c5c6 --- /dev/null +++ b/pkg/k8s/client/listers/azureidentity/v1beta1/expansion_generated.go @@ -0,0 +1,30 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1beta1 + +// AzureManagedIdentityListerExpansion allows custom methods to be added to +// AzureManagedIdentityLister. +type AzureManagedIdentityListerExpansion interface{} + +// AzureManagedIdentityNamespaceListerExpansion allows custom methods to be added to +// AzureManagedIdentityNamespaceLister. +type AzureManagedIdentityNamespaceListerExpansion interface{} diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go deleted file mode 100644 index e0f16ec6..00000000 --- a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecretidentity.go +++ /dev/null @@ -1,97 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v2alpha1 - -import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// AzureKeyVaultSecretIdentityLister helps list AzureKeyVaultSecretIdentities. -type AzureKeyVaultSecretIdentityLister interface { - // List lists all AzureKeyVaultSecretIdentities in the indexer. - List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) - // AzureKeyVaultSecretIdentities returns an object that can list and get AzureKeyVaultSecretIdentities. - AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityNamespaceLister - AzureKeyVaultSecretIdentityListerExpansion -} - -// azureKeyVaultSecretIdentityLister implements the AzureKeyVaultSecretIdentityLister interface. -type azureKeyVaultSecretIdentityLister struct { - indexer cache.Indexer -} - -// NewAzureKeyVaultSecretIdentityLister returns a new AzureKeyVaultSecretIdentityLister. -func NewAzureKeyVaultSecretIdentityLister(indexer cache.Indexer) AzureKeyVaultSecretIdentityLister { - return &azureKeyVaultSecretIdentityLister{indexer: indexer} -} - -// List lists all AzureKeyVaultSecretIdentities in the indexer. -func (s *azureKeyVaultSecretIdentityLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecretIdentity)) - }) - return ret, err -} - -// AzureKeyVaultSecretIdentities returns an object that can list and get AzureKeyVaultSecretIdentities. -func (s *azureKeyVaultSecretIdentityLister) AzureKeyVaultSecretIdentities(namespace string) AzureKeyVaultSecretIdentityNamespaceLister { - return azureKeyVaultSecretIdentityNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// AzureKeyVaultSecretIdentityNamespaceLister helps list and get AzureKeyVaultSecretIdentities. -type AzureKeyVaultSecretIdentityNamespaceLister interface { - // List lists all AzureKeyVaultSecretIdentities in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) - // Get retrieves the AzureKeyVaultSecretIdentity from the indexer for a given namespace and name. - Get(name string) (*v2alpha1.AzureKeyVaultSecretIdentity, error) - AzureKeyVaultSecretIdentityNamespaceListerExpansion -} - -// azureKeyVaultSecretIdentityNamespaceLister implements the AzureKeyVaultSecretIdentityNamespaceLister -// interface. -type azureKeyVaultSecretIdentityNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all AzureKeyVaultSecretIdentities in the indexer for a given namespace. -func (s azureKeyVaultSecretIdentityNamespaceLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecretIdentity, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecretIdentity)) - }) - return ret, err -} - -// Get retrieves the AzureKeyVaultSecretIdentity from the indexer for a given namespace and name. -func (s azureKeyVaultSecretIdentityNamespaceLister) Get(name string) (*v2alpha1.AzureKeyVaultSecretIdentity, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v2alpha1.Resource("azurekeyvaultsecretidentity"), name) - } - return obj.(*v2alpha1.AzureKeyVaultSecretIdentity), nil -} diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go index 6fbd0294..24f06b36 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go +++ b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go @@ -28,11 +28,3 @@ type AzureKeyVaultSecretListerExpansion interface{} // AzureKeyVaultSecretNamespaceListerExpansion allows custom methods to be added to // AzureKeyVaultSecretNamespaceLister. type AzureKeyVaultSecretNamespaceListerExpansion interface{} - -// AzureKeyVaultSecretIdentityListerExpansion allows custom methods to be added to -// AzureKeyVaultSecretIdentityLister. -type AzureKeyVaultSecretIdentityListerExpansion interface{} - -// AzureKeyVaultSecretIdentityNamespaceListerExpansion allows custom methods to be added to -// AzureKeyVaultSecretIdentityNamespaceLister. -type AzureKeyVaultSecretIdentityNamespaceListerExpansion interface{} From 825a8c89512096828177a0342a3e6af05d854a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 9 Oct 2020 12:31:38 +0200 Subject: [PATCH 168/251] pkg: remove AzureKeyVaultSecretIdentity from keyvault api --- pkg/k8s/apis/azurekeyvault/v2alpha1/register.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go index 44ccdb88..3ae19f64 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go @@ -46,8 +46,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &AzureKeyVaultSecret{}, &AzureKeyVaultSecretList{}, - &AzureKeyVaultSecretIdentity{}, - &AzureKeyVaultSecretIdentityList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil From fa636c713cd5db70d9b115719109b4004cf24760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 9 Oct 2020 13:01:29 +0200 Subject: [PATCH 169/251] moved azure key vault client into client/azure instead of just client --- .../controller/azureKeyVaultSecret.go | 8 +-- .../controller/azureeKeyVaultSecret_test.go | 2 +- .../controller/controller.go | 10 +-- .../controller/secret.go | 2 +- .../controller/secret_handler.go | 2 +- .../controller/secret_handler_test.go | 2 +- cmd/azure-keyvault-controller/main.go | 4 +- cmd/azure-keyvault-env/main.go | 8 +-- cmd/azure-keyvault-env/secret_handler.go | 2 +- pkg/akv2k8s/transformers/handler_test.go | 2 +- pkg/akv2k8s/transformers/transformator.go | 2 +- .../keyvault/client/azure_keyvault_service.go | 2 +- .../client/azure_keyvault_service_test.go | 2 +- .../identity}/register.go | 4 +- .../identity}/v1beta1/doc.go | 2 +- .../identity}/v1beta1/register.go | 4 +- .../identity}/v1beta1/types.go | 0 .../v1beta1/zz_generated.deepcopy.go | 0 .../keyvault}/register.go | 4 +- .../keyvault}/v1/doc.go | 2 +- .../keyvault}/v1/register.go | 4 +- .../keyvault}/v1/types.go | 0 .../keyvault}/v1/zz_generated.deepcopy.go | 0 .../keyvault}/v1alpha1/doc.go | 2 +- .../keyvault}/v1alpha1/register.go | 4 +- .../keyvault}/v1alpha1/types.go | 0 .../v1alpha1/zz_generated.deepcopy.go | 0 .../keyvault}/v2alpha1/doc.go | 2 +- .../keyvault}/v2alpha1/register.go | 4 +- .../keyvault}/v2alpha1/types.go | 0 .../v2alpha1/zz_generated.deepcopy.go | 0 .../clientset/versioned/clientset.go | 72 +++++++++---------- .../{ => azure}/clientset/versioned/doc.go | 0 .../versioned/fake/clientset_generated.go | 42 +++++------ .../clientset/versioned/fake/doc.go | 0 .../clientset/versioned/fake/register.go | 16 ++--- .../clientset/versioned/scheme/doc.go | 0 .../clientset/versioned/scheme/register.go | 16 ++--- .../identity}/v1beta1/azuremanagedidentity.go | 6 +- .../versioned/typed/identity}/v1beta1/doc.go | 0 .../typed/identity}/v1beta1/fake/doc.go | 0 .../v1beta1/fake/fake_azuremanagedidentity.go | 8 +-- .../v1beta1/fake/fake_identity_client.go} | 8 +-- .../identity}/v1beta1/generated_expansion.go | 0 .../identity/v1beta1/identity_client.go} | 30 ++++---- .../typed/keyvault}/v1/azurekeyvaultsecret.go | 6 +- .../versioned/typed/keyvault}/v1/doc.go | 0 .../versioned/typed/keyvault}/v1/fake/doc.go | 0 .../v1/fake/fake_azurekeyvaultsecret.go | 50 ++++++------- .../keyvault/v1/fake/fake_keyvault_client.go} | 8 +-- .../typed/keyvault}/v1/generated_expansion.go | 0 .../typed/keyvault/v1/keyvault_client.go} | 30 ++++---- .../keyvault}/v1alpha1/azurekeyvaultsecret.go | 6 +- .../versioned/typed/keyvault}/v1alpha1/doc.go | 0 .../typed/keyvault}/v1alpha1/fake/doc.go | 0 .../v1alpha1/fake/fake_azurekeyvaultsecret.go | 8 +-- .../v1alpha1/fake/fake_keyvault_client.go} | 8 +-- .../keyvault}/v1alpha1/generated_expansion.go | 0 .../keyvault/v1alpha1/keyvault_client.go} | 30 ++++---- .../keyvault}/v2alpha1/azurekeyvaultsecret.go | 6 +- .../versioned/typed/keyvault}/v2alpha1/doc.go | 0 .../typed/keyvault}/v2alpha1/fake/doc.go | 0 .../v2alpha1/fake/fake_azurekeyvaultsecret.go | 8 +-- .../v2alpha1/fake/fake_keyvault_client.go} | 8 +-- .../keyvault}/v2alpha1/generated_expansion.go | 0 .../keyvault/v2alpha1/keyvault_client.go} | 30 ++++---- .../informers/externalversions/factory.go | 20 +++--- .../informers/externalversions/generic.go | 24 +++---- .../externalversions/identity}/interface.go | 6 +- .../identity}/v1beta1/azuremanagedidentity.go | 16 ++--- .../identity}/v1beta1/interface.go | 2 +- .../internalinterfaces/factory_interfaces.go | 2 +- .../externalversions/keyvault}/interface.go | 10 +-- .../keyvault}/v1/azurekeyvaultsecret.go | 16 ++--- .../keyvault}/v1/interface.go | 2 +- .../keyvault}/v1alpha1/azurekeyvaultsecret.go | 16 ++--- .../keyvault}/v1alpha1/interface.go | 2 +- .../keyvault}/v2alpha1/azurekeyvaultsecret.go | 16 ++--- .../keyvault}/v2alpha1/interface.go | 2 +- .../identity}/v1beta1/azuremanagedidentity.go | 2 +- .../identity}/v1beta1/expansion_generated.go | 0 .../keyvault}/v1/azurekeyvaultsecret.go | 2 +- .../keyvault}/v1/expansion_generated.go | 0 .../keyvault}/v1alpha1/azurekeyvaultsecret.go | 2 +- .../keyvault}/v1alpha1/expansion_generated.go | 0 .../keyvault}/v2alpha1/azurekeyvaultsecret.go | 2 +- .../keyvault}/v2alpha1/expansion_generated.go | 0 87 files changed, 309 insertions(+), 309 deletions(-) rename pkg/k8s/apis/{azureidentity => azure/identity}/register.go (92%) rename pkg/k8s/apis/{azureidentity => azure/identity}/v1beta1/doc.go (94%) rename pkg/k8s/apis/{azureidentity => azure/identity}/v1beta1/register.go (93%) rename pkg/k8s/apis/{azureidentity => azure/identity}/v1beta1/types.go (100%) rename pkg/k8s/apis/{azureidentity => azure/identity}/v1beta1/zz_generated.deepcopy.go (100%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/register.go (92%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1/doc.go (94%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1/register.go (93%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1/types.go (100%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1/zz_generated.deepcopy.go (100%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1alpha1/doc.go (94%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1alpha1/register.go (93%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1alpha1/types.go (100%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v1alpha1/zz_generated.deepcopy.go (100%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v2alpha1/doc.go (94%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v2alpha1/register.go (93%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v2alpha1/types.go (100%) rename pkg/k8s/apis/{azurekeyvault => azure/keyvault}/v2alpha1/zz_generated.deepcopy.go (100%) rename pkg/k8s/client/{ => azure}/clientset/versioned/clientset.go (50%) rename pkg/k8s/client/{ => azure}/clientset/versioned/doc.go (100%) rename pkg/k8s/client/{ => azure}/clientset/versioned/fake/clientset_generated.go (53%) rename pkg/k8s/client/{ => azure}/clientset/versioned/fake/doc.go (100%) rename pkg/k8s/client/{ => azure}/clientset/versioned/fake/register.go (76%) rename pkg/k8s/client/{ => azure}/clientset/versioned/scheme/doc.go (100%) rename pkg/k8s/client/{ => azure}/clientset/versioned/scheme/register.go (76%) rename pkg/k8s/client/{clientset/versioned/typed/azureidentity => azure/clientset/versioned/typed/identity}/v1beta1/azuremanagedidentity.go (97%) rename pkg/k8s/client/{clientset/versioned/typed/azureidentity => azure/clientset/versioned/typed/identity}/v1beta1/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azureidentity => azure/clientset/versioned/typed/identity}/v1beta1/fake/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azureidentity => azure/clientset/versioned/typed/identity}/v1beta1/fake/fake_azuremanagedidentity.go (95%) rename pkg/k8s/client/{clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go => azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go} (79%) rename pkg/k8s/client/{clientset/versioned/typed/azureidentity => azure/clientset/versioned/typed/identity}/v1beta1/generated_expansion.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go => azure/clientset/versioned/typed/identity/v1beta1/identity_client.go} (64%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1/azurekeyvaultsecret.go (97%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1/fake/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1/fake/fake_azurekeyvaultsecret.go (66%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go => azure/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go} (80%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1/generated_expansion.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go => azure/clientset/versioned/typed/keyvault/v1/keyvault_client.go} (66%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1alpha1/azurekeyvaultsecret.go (97%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1alpha1/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1alpha1/fake/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1alpha1/fake/fake_azurekeyvaultsecret.go (95%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go => azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go} (78%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v1alpha1/generated_expansion.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go => azure/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go} (64%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v2alpha1/azurekeyvaultsecret.go (97%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v2alpha1/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v2alpha1/fake/doc.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v2alpha1/fake/fake_azurekeyvaultsecret.go (95%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go => azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go} (78%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault => azure/clientset/versioned/typed/keyvault}/v2alpha1/generated_expansion.go (100%) rename pkg/k8s/client/{clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go => azure/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go} (64%) rename pkg/k8s/client/{ => azure}/informers/externalversions/factory.go (89%) rename pkg/k8s/client/{ => azure}/informers/externalversions/generic.go (80%) rename pkg/k8s/client/{informers/externalversions/azureidentity => azure/informers/externalversions/identity}/interface.go (90%) rename pkg/k8s/client/{informers/externalversions/azureidentity => azure/informers/externalversions/identity}/v1beta1/azuremanagedidentity.go (85%) rename pkg/k8s/client/{informers/externalversions/azureidentity => azure/informers/externalversions/identity}/v1beta1/interface.go (95%) rename pkg/k8s/client/{ => azure}/informers/externalversions/internalinterfaces/factory_interfaces.go (96%) rename pkg/k8s/client/{informers/externalversions/azurekeyvault => azure/informers/externalversions/keyvault}/interface.go (88%) rename pkg/k8s/client/{informers/externalversions/azurekeyvault => azure/informers/externalversions/keyvault}/v1/azurekeyvaultsecret.go (86%) rename pkg/k8s/client/{informers/externalversions/azurekeyvault => azure/informers/externalversions/keyvault}/v1/interface.go (95%) rename pkg/k8s/client/{informers/externalversions/azurekeyvault => azure/informers/externalversions/keyvault}/v1alpha1/azurekeyvaultsecret.go (85%) rename pkg/k8s/client/{informers/externalversions/azurekeyvault => azure/informers/externalversions/keyvault}/v1alpha1/interface.go (95%) rename pkg/k8s/client/{informers/externalversions/azurekeyvault => azure/informers/externalversions/keyvault}/v2alpha1/azurekeyvaultsecret.go (85%) rename pkg/k8s/client/{informers/externalversions/azurekeyvault => azure/informers/externalversions/keyvault}/v2alpha1/interface.go (95%) rename pkg/k8s/client/{listers/azureidentity => azure/listers/identity}/v1beta1/azuremanagedidentity.go (98%) rename pkg/k8s/client/{listers/azureidentity => azure/listers/identity}/v1beta1/expansion_generated.go (100%) rename pkg/k8s/client/{listers/azurekeyvault => azure/listers/keyvault}/v1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/{listers/azurekeyvault => azure/listers/keyvault}/v1/expansion_generated.go (100%) rename pkg/k8s/client/{listers/azurekeyvault => azure/listers/keyvault}/v1alpha1/azurekeyvaultsecret.go (98%) rename pkg/k8s/client/{listers/azurekeyvault => azure/listers/keyvault}/v1alpha1/expansion_generated.go (100%) rename pkg/k8s/client/{listers/azurekeyvault => azure/listers/keyvault}/v2alpha1/azurekeyvaultsecret.go (98%) rename pkg/k8s/client/{listers/azurekeyvault => azure/listers/keyvault}/v2alpha1/expansion_generated.go (100%) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 44a55b5f..066e68c3 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -23,8 +23,8 @@ import ( "fmt" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -37,7 +37,7 @@ import ( ) func (c *Controller) initAzureKeyVaultSecret() { - c.akvsInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + c.akvsInformerFactory.Keyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { secret, err := convertToAzureKeyVaultSecret(obj) if err != nil { @@ -261,7 +261,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.Az // we must use Update instead of UpdateStatus to update the Status block of the AzureKeyVaultSecret resource. // UpdateStatus will not allow changes to the Spec of the resource, // which is ideal for ensuring nothing other than resource status has been updated. - _, err := c.akvsClient.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy) + _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy) return err } diff --git a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go index d707e687..ad17bacb 100644 --- a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go +++ b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go @@ -19,7 +19,7 @@ package controller import ( "testing" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" ) func TestNullLookup(t *testing.T) { diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 90f8fd7f..3f999393 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -36,10 +36,10 @@ import ( "kmodules.xyz/client-go/tools/queue" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" - akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" - listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" + akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" + akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions" + listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v2alpha1" ) const ( @@ -149,7 +149,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI kubeInformerFactory: kubeInformerFactory, secretsLister: kubeInformerFactory.Core().V1().Secrets().Lister(), - azureKeyVaultSecretLister: akvInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), + azureKeyVaultSecretLister: akvInformerFactory.Keyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), configMapLister: kubeInformerFactory.Core().V1().ConfigMaps().Lister(), namespaceLister: kubeInformerFactory.Core().V1().Namespaces().Lister(), diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 7bafcd44..82c6863b 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -26,7 +26,7 @@ import ( "fmt" "sort" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" log "github.com/sirupsen/logrus" "kmodules.xyz/client-go/tools/queue" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 8f370995..78d9af50 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go index bb9ee362..5906f3b3 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go @@ -22,7 +22,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 8e9c75a6..21bd49f8 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -39,8 +39,8 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" + clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals" ) diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 9d55a1f3..eae47a7d 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -28,8 +28,8 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" log "github.com/sirupsen/logrus" "github.com/spf13/viper" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -278,13 +278,13 @@ func main() { } logger.Debugf("getting azurekeyvaultsecret resource '%s' from kubernetes", secretName) - keyVaultSecretSpec, err := azureKeyVaultSecretClient.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + keyVaultSecretSpec, err := azureKeyVaultSecretClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { logger.Warnf("failed to get azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error()) logger.Infof("will retry getting azurekeyvaultsecret resource up to %d times, waiting %d seconds between retries", config.retryTimes, config.waitTimeBetweenRetries) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { - keyVaultSecretSpec, err = azureKeyVaultSecretClient.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + keyVaultSecretSpec, err = azureKeyVaultSecretClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %+v", secretName, err) return err diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go index fec73294..407543ac 100644 --- a/cmd/azure-keyvault-env/secret_handler.go +++ b/cmd/azure-keyvault-env/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/pkg/akv2k8s/transformers/handler_test.go b/pkg/akv2k8s/transformers/handler_test.go index da8749bc..707e03ed 100644 --- a/pkg/akv2k8s/transformers/handler_test.go +++ b/pkg/akv2k8s/transformers/handler_test.go @@ -19,7 +19,7 @@ package transformers import ( "testing" - akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" ) const ( diff --git a/pkg/akv2k8s/transformers/transformator.go b/pkg/akv2k8s/transformers/transformator.go index b2ac9716..da6a7563 100644 --- a/pkg/akv2k8s/transformers/transformator.go +++ b/pkg/akv2k8s/transformers/transformator.go @@ -19,7 +19,7 @@ package transformers import ( "fmt" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" ) // CreateTransformator creates a new Transformator ready to run transformation handlers diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index e407ec61..1a913374 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -24,7 +24,7 @@ import ( "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" ) const ( diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go index e68e7e6e..60a83742 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service_test.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go @@ -8,7 +8,7 @@ import ( akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing" auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/pkg/k8s/apis/azureidentity/register.go b/pkg/k8s/apis/azure/identity/register.go similarity index 92% rename from pkg/k8s/apis/azureidentity/register.go rename to pkg/k8s/apis/azure/identity/register.go index 8ea59397..3bfa8fbd 100644 --- a/pkg/k8s/apis/azureidentity/register.go +++ b/pkg/k8s/apis/azure/identity/register.go @@ -14,8 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -package azureidentity +package identity const ( - GroupName = "spv.no" + GroupName = "azure.spv.no" ) diff --git a/pkg/k8s/apis/azureidentity/v1beta1/doc.go b/pkg/k8s/apis/azure/identity/v1beta1/doc.go similarity index 94% rename from pkg/k8s/apis/azureidentity/v1beta1/doc.go rename to pkg/k8s/apis/azure/identity/v1beta1/doc.go index f2ddbc35..b819f7d1 100644 --- a/pkg/k8s/apis/azureidentity/v1beta1/doc.go +++ b/pkg/k8s/apis/azure/identity/v1beta1/doc.go @@ -15,7 +15,7 @@ limitations under the License. */ // +k8s:deepcopy-gen=package -// +groupName=azureidentity.spv.no +// +groupName=identity.azure.spv.no // Package v1 is the v1 version of the API. package v1beta1 diff --git a/pkg/k8s/apis/azureidentity/v1beta1/register.go b/pkg/k8s/apis/azure/identity/v1beta1/register.go similarity index 93% rename from pkg/k8s/apis/azureidentity/v1beta1/register.go rename to pkg/k8s/apis/azure/identity/v1beta1/register.go index 6d6b0481..2ed8b54f 100644 --- a/pkg/k8s/apis/azureidentity/v1beta1/register.go +++ b/pkg/k8s/apis/azure/identity/v1beta1/register.go @@ -17,14 +17,14 @@ limitations under the License. package v1beta1 import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: azureidentity.GroupName, Version: "v1beta1"} +var SchemeGroupVersion = schema.GroupVersion{Group: identity.GroupName, Version: "v1beta1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { diff --git a/pkg/k8s/apis/azureidentity/v1beta1/types.go b/pkg/k8s/apis/azure/identity/v1beta1/types.go similarity index 100% rename from pkg/k8s/apis/azureidentity/v1beta1/types.go rename to pkg/k8s/apis/azure/identity/v1beta1/types.go diff --git a/pkg/k8s/apis/azureidentity/v1beta1/zz_generated.deepcopy.go b/pkg/k8s/apis/azure/identity/v1beta1/zz_generated.deepcopy.go similarity index 100% rename from pkg/k8s/apis/azureidentity/v1beta1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azure/identity/v1beta1/zz_generated.deepcopy.go diff --git a/pkg/k8s/apis/azurekeyvault/register.go b/pkg/k8s/apis/azure/keyvault/register.go similarity index 92% rename from pkg/k8s/apis/azurekeyvault/register.go rename to pkg/k8s/apis/azure/keyvault/register.go index b644d6b8..15d2b452 100644 --- a/pkg/k8s/apis/azurekeyvault/register.go +++ b/pkg/k8s/apis/azure/keyvault/register.go @@ -14,8 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -package azurekeyvault +package keyvault const ( - GroupName = "spv.no" + GroupName = "azure.spv.no" ) diff --git a/pkg/k8s/apis/azurekeyvault/v1/doc.go b/pkg/k8s/apis/azure/keyvault/v1/doc.go similarity index 94% rename from pkg/k8s/apis/azurekeyvault/v1/doc.go rename to pkg/k8s/apis/azure/keyvault/v1/doc.go index b3b9b514..89d05a88 100644 --- a/pkg/k8s/apis/azurekeyvault/v1/doc.go +++ b/pkg/k8s/apis/azure/keyvault/v1/doc.go @@ -15,7 +15,7 @@ limitations under the License. */ // +k8s:deepcopy-gen=package -// +groupName=azurekeyvault.spv.no +// +groupName=keyvault.azure.spv.no // Package v1 is the v1 version of the API. package v1 diff --git a/pkg/k8s/apis/azurekeyvault/v1/register.go b/pkg/k8s/apis/azure/keyvault/v1/register.go similarity index 93% rename from pkg/k8s/apis/azurekeyvault/v1/register.go rename to pkg/k8s/apis/azure/keyvault/v1/register.go index 443fc9ed..1a5d5d7a 100644 --- a/pkg/k8s/apis/azurekeyvault/v1/register.go +++ b/pkg/k8s/apis/azure/keyvault/v1/register.go @@ -17,14 +17,14 @@ limitations under the License. package v1 import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v1"} +var SchemeGroupVersion = schema.GroupVersion{Group: keyvault.GroupName, Version: "v1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { diff --git a/pkg/k8s/apis/azurekeyvault/v1/types.go b/pkg/k8s/apis/azure/keyvault/v1/types.go similarity index 100% rename from pkg/k8s/apis/azurekeyvault/v1/types.go rename to pkg/k8s/apis/azure/keyvault/v1/types.go diff --git a/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go b/pkg/k8s/apis/azure/keyvault/v1/zz_generated.deepcopy.go similarity index 100% rename from pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azure/keyvault/v1/zz_generated.deepcopy.go diff --git a/pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go b/pkg/k8s/apis/azure/keyvault/v1alpha1/doc.go similarity index 94% rename from pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go rename to pkg/k8s/apis/azure/keyvault/v1alpha1/doc.go index 5f42e1de..02acd27e 100644 --- a/pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go +++ b/pkg/k8s/apis/azure/keyvault/v1alpha1/doc.go @@ -15,7 +15,7 @@ limitations under the License. */ // +k8s:deepcopy-gen=package -// +groupName=azurekeyvault.spv.no +// +groupName=keyvault.azure.spv.no // Package v1 is the v1 version of the API. package v1alpha1 diff --git a/pkg/k8s/apis/azurekeyvault/v1alpha1/register.go b/pkg/k8s/apis/azure/keyvault/v1alpha1/register.go similarity index 93% rename from pkg/k8s/apis/azurekeyvault/v1alpha1/register.go rename to pkg/k8s/apis/azure/keyvault/v1alpha1/register.go index d777c182..ab1a3d56 100644 --- a/pkg/k8s/apis/azurekeyvault/v1alpha1/register.go +++ b/pkg/k8s/apis/azure/keyvault/v1alpha1/register.go @@ -17,14 +17,14 @@ limitations under the License. package v1alpha1 import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v1alpha1"} +var SchemeGroupVersion = schema.GroupVersion{Group: keyvault.GroupName, Version: "v1alpha1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { diff --git a/pkg/k8s/apis/azurekeyvault/v1alpha1/types.go b/pkg/k8s/apis/azure/keyvault/v1alpha1/types.go similarity index 100% rename from pkg/k8s/apis/azurekeyvault/v1alpha1/types.go rename to pkg/k8s/apis/azure/keyvault/v1alpha1/types.go diff --git a/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azure/keyvault/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azure/keyvault/v1alpha1/zz_generated.deepcopy.go diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go b/pkg/k8s/apis/azure/keyvault/v2alpha1/doc.go similarity index 94% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go rename to pkg/k8s/apis/azure/keyvault/v2alpha1/doc.go index 3987d998..0f65208e 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go +++ b/pkg/k8s/apis/azure/keyvault/v2alpha1/doc.go @@ -15,7 +15,7 @@ limitations under the License. */ // +k8s:deepcopy-gen=package -// +groupName=azurekeyvault.spv.no +// +groupName=keyvault.azure.spv.no // Package v1 is the v1 version of the API. package v2alpha1 diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go b/pkg/k8s/apis/azure/keyvault/v2alpha1/register.go similarity index 93% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/register.go rename to pkg/k8s/apis/azure/keyvault/v2alpha1/register.go index 3ae19f64..a067d725 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go +++ b/pkg/k8s/apis/azure/keyvault/v2alpha1/register.go @@ -17,14 +17,14 @@ limitations under the License. package v2alpha1 import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v2alpha1"} +var SchemeGroupVersion = schema.GroupVersion{Group: keyvault.GroupName, Version: "v2alpha1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go b/pkg/k8s/apis/azure/keyvault/v2alpha1/types.go similarity index 100% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/types.go rename to pkg/k8s/apis/azure/keyvault/v2alpha1/types.go diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azure/keyvault/v2alpha1/zz_generated.deepcopy.go similarity index 100% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azure/keyvault/v2alpha1/zz_generated.deepcopy.go diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/azure/clientset/versioned/clientset.go similarity index 50% rename from pkg/k8s/client/clientset/versioned/clientset.go rename to pkg/k8s/client/azure/clientset/versioned/clientset.go index d4f59972..daab0c9d 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/azure/clientset/versioned/clientset.go @@ -24,10 +24,10 @@ package versioned import ( "fmt" - azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1" - azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" - azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" - azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" + identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -35,40 +35,40 @@ import ( type Interface interface { Discovery() discovery.DiscoveryInterface - AzureidentityV1beta1() azureidentityv1beta1.AzureidentityV1beta1Interface - AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface - AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface - AzurekeyvaultV2alpha1() azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Interface + IdentityV1beta1() identityv1beta1.IdentityV1beta1Interface + KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface + KeyvaultV1() keyvaultv1.KeyvaultV1Interface + KeyvaultV2alpha1() keyvaultv2alpha1.KeyvaultV2alpha1Interface } // Clientset contains the clients for groups. Each group has exactly one // version included in a Clientset. type Clientset struct { *discovery.DiscoveryClient - azureidentityV1beta1 *azureidentityv1beta1.AzureidentityV1beta1Client - azurekeyvaultV1alpha1 *azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Client - azurekeyvaultV1 *azurekeyvaultv1.AzurekeyvaultV1Client - azurekeyvaultV2alpha1 *azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Client + identityV1beta1 *identityv1beta1.IdentityV1beta1Client + keyvaultV1alpha1 *keyvaultv1alpha1.KeyvaultV1alpha1Client + keyvaultV1 *keyvaultv1.KeyvaultV1Client + keyvaultV2alpha1 *keyvaultv2alpha1.KeyvaultV2alpha1Client } -// AzureidentityV1beta1 retrieves the AzureidentityV1beta1Client -func (c *Clientset) AzureidentityV1beta1() azureidentityv1beta1.AzureidentityV1beta1Interface { - return c.azureidentityV1beta1 +// IdentityV1beta1 retrieves the IdentityV1beta1Client +func (c *Clientset) IdentityV1beta1() identityv1beta1.IdentityV1beta1Interface { + return c.identityV1beta1 } -// AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client -func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface { - return c.azurekeyvaultV1alpha1 +// KeyvaultV1alpha1 retrieves the KeyvaultV1alpha1Client +func (c *Clientset) KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface { + return c.keyvaultV1alpha1 } -// AzurekeyvaultV1 retrieves the AzurekeyvaultV1Client -func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface { - return c.azurekeyvaultV1 +// KeyvaultV1 retrieves the KeyvaultV1Client +func (c *Clientset) KeyvaultV1() keyvaultv1.KeyvaultV1Interface { + return c.keyvaultV1 } -// AzurekeyvaultV2alpha1 retrieves the AzurekeyvaultV2alpha1Client -func (c *Clientset) AzurekeyvaultV2alpha1() azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Interface { - return c.azurekeyvaultV2alpha1 +// KeyvaultV2alpha1 retrieves the KeyvaultV2alpha1Client +func (c *Clientset) KeyvaultV2alpha1() keyvaultv2alpha1.KeyvaultV2alpha1Interface { + return c.keyvaultV2alpha1 } // Discovery retrieves the DiscoveryClient @@ -92,19 +92,19 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { } var cs Clientset var err error - cs.azureidentityV1beta1, err = azureidentityv1beta1.NewForConfig(&configShallowCopy) + cs.identityV1beta1, err = identityv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } - cs.azurekeyvaultV1alpha1, err = azurekeyvaultv1alpha1.NewForConfig(&configShallowCopy) + cs.keyvaultV1alpha1, err = keyvaultv1alpha1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } - cs.azurekeyvaultV1, err = azurekeyvaultv1.NewForConfig(&configShallowCopy) + cs.keyvaultV1, err = keyvaultv1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } - cs.azurekeyvaultV2alpha1, err = azurekeyvaultv2alpha1.NewForConfig(&configShallowCopy) + cs.keyvaultV2alpha1, err = keyvaultv2alpha1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } @@ -120,10 +120,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset - cs.azureidentityV1beta1 = azureidentityv1beta1.NewForConfigOrDie(c) - cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.NewForConfigOrDie(c) - cs.azurekeyvaultV1 = azurekeyvaultv1.NewForConfigOrDie(c) - cs.azurekeyvaultV2alpha1 = azurekeyvaultv2alpha1.NewForConfigOrDie(c) + cs.identityV1beta1 = identityv1beta1.NewForConfigOrDie(c) + cs.keyvaultV1alpha1 = keyvaultv1alpha1.NewForConfigOrDie(c) + cs.keyvaultV1 = keyvaultv1.NewForConfigOrDie(c) + cs.keyvaultV2alpha1 = keyvaultv2alpha1.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) return &cs @@ -132,10 +132,10 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { // New creates a new Clientset for the given RESTClient. func New(c rest.Interface) *Clientset { var cs Clientset - cs.azureidentityV1beta1 = azureidentityv1beta1.New(c) - cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.New(c) - cs.azurekeyvaultV1 = azurekeyvaultv1.New(c) - cs.azurekeyvaultV2alpha1 = azurekeyvaultv2alpha1.New(c) + cs.identityV1beta1 = identityv1beta1.New(c) + cs.keyvaultV1alpha1 = keyvaultv1alpha1.New(c) + cs.keyvaultV1 = keyvaultv1.New(c) + cs.keyvaultV2alpha1 = keyvaultv2alpha1.New(c) cs.DiscoveryClient = discovery.NewDiscoveryClient(c) return &cs diff --git a/pkg/k8s/client/clientset/versioned/doc.go b/pkg/k8s/client/azure/clientset/versioned/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/doc.go rename to pkg/k8s/client/azure/clientset/versioned/doc.go diff --git a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/azure/clientset/versioned/fake/clientset_generated.go similarity index 53% rename from pkg/k8s/client/clientset/versioned/fake/clientset_generated.go rename to pkg/k8s/client/azure/clientset/versioned/fake/clientset_generated.go index 2b765c38..b871970c 100644 --- a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go +++ b/pkg/k8s/client/azure/clientset/versioned/fake/clientset_generated.go @@ -22,15 +22,15 @@ limitations under the License. package fake import ( - clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1" - fakeazureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake" - azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" - fakeazurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake" - azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" - fakeazurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake" - azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" - fakeazurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake" + clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1" + fakeidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1" + fakekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1" + fakekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1" + fakekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/discovery" @@ -85,22 +85,22 @@ func (c *Clientset) Tracker() testing.ObjectTracker { var _ clientset.Interface = &Clientset{} -// AzureidentityV1beta1 retrieves the AzureidentityV1beta1Client -func (c *Clientset) AzureidentityV1beta1() azureidentityv1beta1.AzureidentityV1beta1Interface { - return &fakeazureidentityv1beta1.FakeAzureidentityV1beta1{Fake: &c.Fake} +// IdentityV1beta1 retrieves the IdentityV1beta1Client +func (c *Clientset) IdentityV1beta1() identityv1beta1.IdentityV1beta1Interface { + return &fakeidentityv1beta1.FakeIdentityV1beta1{Fake: &c.Fake} } -// AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client -func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface { - return &fakeazurekeyvaultv1alpha1.FakeAzurekeyvaultV1alpha1{Fake: &c.Fake} +// KeyvaultV1alpha1 retrieves the KeyvaultV1alpha1Client +func (c *Clientset) KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface { + return &fakekeyvaultv1alpha1.FakeKeyvaultV1alpha1{Fake: &c.Fake} } -// AzurekeyvaultV1 retrieves the AzurekeyvaultV1Client -func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface { - return &fakeazurekeyvaultv1.FakeAzurekeyvaultV1{Fake: &c.Fake} +// KeyvaultV1 retrieves the KeyvaultV1Client +func (c *Clientset) KeyvaultV1() keyvaultv1.KeyvaultV1Interface { + return &fakekeyvaultv1.FakeKeyvaultV1{Fake: &c.Fake} } -// AzurekeyvaultV2alpha1 retrieves the AzurekeyvaultV2alpha1Client -func (c *Clientset) AzurekeyvaultV2alpha1() azurekeyvaultv2alpha1.AzurekeyvaultV2alpha1Interface { - return &fakeazurekeyvaultv2alpha1.FakeAzurekeyvaultV2alpha1{Fake: &c.Fake} +// KeyvaultV2alpha1 retrieves the KeyvaultV2alpha1Client +func (c *Clientset) KeyvaultV2alpha1() keyvaultv2alpha1.KeyvaultV2alpha1Interface { + return &fakekeyvaultv2alpha1.FakeKeyvaultV2alpha1{Fake: &c.Fake} } diff --git a/pkg/k8s/client/clientset/versioned/fake/doc.go b/pkg/k8s/client/azure/clientset/versioned/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/fake/doc.go rename to pkg/k8s/client/azure/clientset/versioned/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/fake/register.go b/pkg/k8s/client/azure/clientset/versioned/fake/register.go similarity index 76% rename from pkg/k8s/client/clientset/versioned/fake/register.go rename to pkg/k8s/client/azure/clientset/versioned/fake/register.go index f9e44d62..0243a5d2 100644 --- a/pkg/k8s/client/clientset/versioned/fake/register.go +++ b/pkg/k8s/client/azure/clientset/versioned/fake/register.go @@ -22,10 +22,10 @@ limitations under the License. package fake import ( - azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" - azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" - azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -37,10 +37,10 @@ var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) var localSchemeBuilder = runtime.SchemeBuilder{ - azureidentityv1beta1.AddToScheme, - azurekeyvaultv1alpha1.AddToScheme, - azurekeyvaultv1.AddToScheme, - azurekeyvaultv2alpha1.AddToScheme, + identityv1beta1.AddToScheme, + keyvaultv1alpha1.AddToScheme, + keyvaultv1.AddToScheme, + keyvaultv2alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition diff --git a/pkg/k8s/client/clientset/versioned/scheme/doc.go b/pkg/k8s/client/azure/clientset/versioned/scheme/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/scheme/doc.go rename to pkg/k8s/client/azure/clientset/versioned/scheme/doc.go diff --git a/pkg/k8s/client/clientset/versioned/scheme/register.go b/pkg/k8s/client/azure/clientset/versioned/scheme/register.go similarity index 76% rename from pkg/k8s/client/clientset/versioned/scheme/register.go rename to pkg/k8s/client/azure/clientset/versioned/scheme/register.go index ed623c17..773ad024 100644 --- a/pkg/k8s/client/clientset/versioned/scheme/register.go +++ b/pkg/k8s/client/azure/clientset/versioned/scheme/register.go @@ -22,10 +22,10 @@ limitations under the License. package scheme import ( - azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" - azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" - azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -37,10 +37,10 @@ var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) var localSchemeBuilder = runtime.SchemeBuilder{ - azureidentityv1beta1.AddToScheme, - azurekeyvaultv1alpha1.AddToScheme, - azurekeyvaultv1.AddToScheme, - azurekeyvaultv2alpha1.AddToScheme, + identityv1beta1.AddToScheme, + keyvaultv1alpha1.AddToScheme, + keyvaultv1.AddToScheme, + keyvaultv2alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/azuremanagedidentity.go similarity index 97% rename from pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azuremanagedidentity.go rename to pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/azuremanagedidentity.go index ae5cd2ff..6588da44 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azuremanagedidentity.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/azuremanagedidentity.go @@ -24,8 +24,8 @@ package v1beta1 import ( "time" - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" @@ -58,7 +58,7 @@ type azureManagedIdentities struct { } // newAzureManagedIdentities returns a AzureManagedIdentities -func newAzureManagedIdentities(c *AzureidentityV1beta1Client, namespace string) *azureManagedIdentities { +func newAzureManagedIdentities(c *IdentityV1beta1Client, namespace string) *azureManagedIdentities { return &azureManagedIdentities{ client: c.RESTClient(), ns: namespace, diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azuremanagedidentity.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_azuremanagedidentity.go similarity index 95% rename from pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azuremanagedidentity.go rename to pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_azuremanagedidentity.go index dd7d7365..c5542c7c 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azuremanagedidentity.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_azuremanagedidentity.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,13 +33,13 @@ import ( // FakeAzureManagedIdentities implements AzureManagedIdentityInterface type FakeAzureManagedIdentities struct { - Fake *FakeAzureidentityV1beta1 + Fake *FakeIdentityV1beta1 ns string } -var azuremanagedidentitiesResource = schema.GroupVersionResource{Group: "azureidentity.spv.no", Version: "v1beta1", Resource: "azuremanagedidentities"} +var azuremanagedidentitiesResource = schema.GroupVersionResource{Group: "identity.azure.spv.no", Version: "v1beta1", Resource: "azuremanagedidentities"} -var azuremanagedidentitiesKind = schema.GroupVersionKind{Group: "azureidentity.spv.no", Version: "v1beta1", Kind: "AzureManagedIdentity"} +var azuremanagedidentitiesKind = schema.GroupVersionKind{Group: "identity.azure.spv.no", Version: "v1beta1", Kind: "AzureManagedIdentity"} // Get takes name of the azureManagedIdentity, and returns the corresponding azureManagedIdentity object, and an error if there is any. func (c *FakeAzureManagedIdentities) Get(name string, options v1.GetOptions) (result *v1beta1.AzureManagedIdentity, err error) { diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go similarity index 79% rename from pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go index 44084c1d..c58f45ef 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/fake/fake_azureidentity_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go @@ -22,22 +22,22 @@ limitations under the License. package fake import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) -type FakeAzureidentityV1beta1 struct { +type FakeIdentityV1beta1 struct { *testing.Fake } -func (c *FakeAzureidentityV1beta1) AzureManagedIdentities(namespace string) v1beta1.AzureManagedIdentityInterface { +func (c *FakeIdentityV1beta1) AzureManagedIdentities(namespace string) v1beta1.AzureManagedIdentityInterface { return &FakeAzureManagedIdentities{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeAzureidentityV1beta1) RESTClient() rest.Interface { +func (c *FakeIdentityV1beta1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/generated_expansion.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/generated_expansion.go rename to pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/generated_expansion.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/identity_client.go similarity index 64% rename from pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/identity_client.go index 00f1eb3d..2381ef48 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azureidentity/v1beta1/azureidentity_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/identity_client.go @@ -22,27 +22,27 @@ limitations under the License. package v1beta1 import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) -type AzureidentityV1beta1Interface interface { +type IdentityV1beta1Interface interface { RESTClient() rest.Interface AzureManagedIdentitiesGetter } -// AzureidentityV1beta1Client is used to interact with features provided by the azureidentity.spv.no group. -type AzureidentityV1beta1Client struct { +// IdentityV1beta1Client is used to interact with features provided by the identity.azure.spv.no group. +type IdentityV1beta1Client struct { restClient rest.Interface } -func (c *AzureidentityV1beta1Client) AzureManagedIdentities(namespace string) AzureManagedIdentityInterface { +func (c *IdentityV1beta1Client) AzureManagedIdentities(namespace string) AzureManagedIdentityInterface { return newAzureManagedIdentities(c, namespace) } -// NewForConfig creates a new AzureidentityV1beta1Client for the given config. -func NewForConfig(c *rest.Config) (*AzureidentityV1beta1Client, error) { +// NewForConfig creates a new IdentityV1beta1Client for the given config. +func NewForConfig(c *rest.Config) (*IdentityV1beta1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -51,12 +51,12 @@ func NewForConfig(c *rest.Config) (*AzureidentityV1beta1Client, error) { if err != nil { return nil, err } - return &AzureidentityV1beta1Client{client}, nil + return &IdentityV1beta1Client{client}, nil } -// NewForConfigOrDie creates a new AzureidentityV1beta1Client for the given config and +// NewForConfigOrDie creates a new IdentityV1beta1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *AzureidentityV1beta1Client { +func NewForConfigOrDie(c *rest.Config) *IdentityV1beta1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -64,9 +64,9 @@ func NewForConfigOrDie(c *rest.Config) *AzureidentityV1beta1Client { return client } -// New creates a new AzureidentityV1beta1Client for the given RESTClient. -func New(c rest.Interface) *AzureidentityV1beta1Client { - return &AzureidentityV1beta1Client{c} +// New creates a new IdentityV1beta1Client for the given RESTClient. +func New(c rest.Interface) *IdentityV1beta1Client { + return &IdentityV1beta1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -84,7 +84,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *AzureidentityV1beta1Client) RESTClient() rest.Interface { +func (c *IdentityV1beta1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go similarity index 97% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go index 77eec361..b38cebe2 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go @@ -24,8 +24,8 @@ package v1 import ( "time" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" @@ -59,7 +59,7 @@ type azureKeyVaultSecrets struct { } // newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets -func newAzureKeyVaultSecrets(c *AzurekeyvaultV1Client, namespace string) *azureKeyVaultSecrets { +func newAzureKeyVaultSecrets(c *KeyvaultV1Client, namespace string) *azureKeyVaultSecrets { return &azureKeyVaultSecrets{ client: c.RESTClient(), ns: namespace, diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go similarity index 66% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go index 22937242..92909fe2 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,29 +33,29 @@ import ( // FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface type FakeAzureKeyVaultSecrets struct { - Fake *FakeAzurekeyvaultV1 + Fake *FakeKeyvaultV1 ns string } -var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v1", Resource: "azurekeyvaultsecrets"} +var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v1", Resource: "azurekeyvaultsecrets"} -var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v1", Kind: "AzureKeyVaultSecret"} +var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *keyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &keyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err + return obj.(*keyvaultv1.AzureKeyVaultSecret), err } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *azurekeyvaultv1.AzureKeyVaultSecretList, err error) { +func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *keyvaultv1.AzureKeyVaultSecretList, err error) { obj, err := c.Fake. - Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &azurekeyvaultv1.AzureKeyVaultSecretList{}) + Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &keyvaultv1.AzureKeyVaultSecretList{}) if obj == nil { return nil, err @@ -65,8 +65,8 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *azurekeyva if label == nil { label = labels.Everything() } - list := &azurekeyvaultv1.AzureKeyVaultSecretList{ListMeta: obj.(*azurekeyvaultv1.AzureKeyVaultSecretList).ListMeta} - for _, item := range obj.(*azurekeyvaultv1.AzureKeyVaultSecretList).Items { + list := &keyvaultv1.AzureKeyVaultSecretList{ListMeta: obj.(*keyvaultv1.AzureKeyVaultSecretList).ListMeta} + for _, item := range obj.(*keyvaultv1.AzureKeyVaultSecretList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) } @@ -82,43 +82,43 @@ func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *keyvaultv1.AzureKeyVaultSecret) (result *keyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &keyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err + return obj.(*keyvaultv1.AzureKeyVaultSecret), err } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *keyvaultv1.AzureKeyVaultSecret) (result *keyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &keyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err + return obj.(*keyvaultv1.AzureKeyVaultSecret), err } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (*azurekeyvaultv1.AzureKeyVaultSecret, error) { +func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *keyvaultv1.AzureKeyVaultSecret) (*keyvaultv1.AzureKeyVaultSecret, error) { obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &keyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err + return obj.(*keyvaultv1.AzureKeyVaultSecret), err } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &keyvaultv1.AzureKeyVaultSecret{}) return err } @@ -127,17 +127,17 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions) - _, err := c.Fake.Invokes(action, &azurekeyvaultv1.AzureKeyVaultSecretList{}) + _, err := c.Fake.Invokes(action, &keyvaultv1.AzureKeyVaultSecretList{}) return err } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *keyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &azurekeyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &keyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err + return obj.(*keyvaultv1.AzureKeyVaultSecret), err } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go similarity index 80% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go index d605b22d..70dffda4 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go @@ -22,22 +22,22 @@ limitations under the License. package fake import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) -type FakeAzurekeyvaultV1 struct { +type FakeKeyvaultV1 struct { *testing.Fake } -func (c *FakeAzurekeyvaultV1) AzureKeyVaultSecrets(namespace string) v1.AzureKeyVaultSecretInterface { +func (c *FakeKeyvaultV1) AzureKeyVaultSecrets(namespace string) v1.AzureKeyVaultSecretInterface { return &FakeAzureKeyVaultSecrets{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeAzurekeyvaultV1) RESTClient() rest.Interface { +func (c *FakeKeyvaultV1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/generated_expansion.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/generated_expansion.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/generated_expansion.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/keyvault_client.go similarity index 66% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/keyvault_client.go index 66dbaebc..3f17ee4e 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/keyvault_client.go @@ -22,27 +22,27 @@ limitations under the License. package v1 import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) -type AzurekeyvaultV1Interface interface { +type KeyvaultV1Interface interface { RESTClient() rest.Interface AzureKeyVaultSecretsGetter } -// AzurekeyvaultV1Client is used to interact with features provided by the azurekeyvault.spv.no group. -type AzurekeyvaultV1Client struct { +// KeyvaultV1Client is used to interact with features provided by the keyvault.azure.spv.no group. +type KeyvaultV1Client struct { restClient rest.Interface } -func (c *AzurekeyvaultV1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { +func (c *KeyvaultV1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { return newAzureKeyVaultSecrets(c, namespace) } -// NewForConfig creates a new AzurekeyvaultV1Client for the given config. -func NewForConfig(c *rest.Config) (*AzurekeyvaultV1Client, error) { +// NewForConfig creates a new KeyvaultV1Client for the given config. +func NewForConfig(c *rest.Config) (*KeyvaultV1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -51,12 +51,12 @@ func NewForConfig(c *rest.Config) (*AzurekeyvaultV1Client, error) { if err != nil { return nil, err } - return &AzurekeyvaultV1Client{client}, nil + return &KeyvaultV1Client{client}, nil } -// NewForConfigOrDie creates a new AzurekeyvaultV1Client for the given config and +// NewForConfigOrDie creates a new KeyvaultV1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1Client { +func NewForConfigOrDie(c *rest.Config) *KeyvaultV1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -64,9 +64,9 @@ func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1Client { return client } -// New creates a new AzurekeyvaultV1Client for the given RESTClient. -func New(c rest.Interface) *AzurekeyvaultV1Client { - return &AzurekeyvaultV1Client{c} +// New creates a new KeyvaultV1Client for the given RESTClient. +func New(c rest.Interface) *KeyvaultV1Client { + return &KeyvaultV1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -84,7 +84,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *AzurekeyvaultV1Client) RESTClient() rest.Interface { +func (c *KeyvaultV1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go similarity index 97% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go index 5b0400dc..f4e998e1 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go @@ -24,8 +24,8 @@ package v1alpha1 import ( "time" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" @@ -59,7 +59,7 @@ type azureKeyVaultSecrets struct { } // newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets -func newAzureKeyVaultSecrets(c *AzurekeyvaultV1alpha1Client, namespace string) *azureKeyVaultSecrets { +func newAzureKeyVaultSecrets(c *KeyvaultV1alpha1Client, namespace string) *azureKeyVaultSecrets { return &azureKeyVaultSecrets{ client: c.RESTClient(), ns: namespace, diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go similarity index 95% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go index 539b6776..12932503 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,13 +33,13 @@ import ( // FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface type FakeAzureKeyVaultSecrets struct { - Fake *FakeAzurekeyvaultV1alpha1 + Fake *FakeKeyvaultV1alpha1 ns string } -var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v1alpha1", Resource: "azurekeyvaultsecrets"} +var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v1alpha1", Resource: "azurekeyvaultsecrets"} -var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v1alpha1", Kind: "AzureKeyVaultSecret"} +var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v1alpha1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go similarity index 78% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go index 25e47028..c820b115 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go @@ -22,22 +22,22 @@ limitations under the License. package fake import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) -type FakeAzurekeyvaultV1alpha1 struct { +type FakeKeyvaultV1alpha1 struct { *testing.Fake } -func (c *FakeAzurekeyvaultV1alpha1) AzureKeyVaultSecrets(namespace string) v1alpha1.AzureKeyVaultSecretInterface { +func (c *FakeKeyvaultV1alpha1) AzureKeyVaultSecrets(namespace string) v1alpha1.AzureKeyVaultSecretInterface { return &FakeAzureKeyVaultSecrets{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeAzurekeyvaultV1alpha1) RESTClient() rest.Interface { +func (c *FakeKeyvaultV1alpha1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/generated_expansion.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/generated_expansion.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go similarity index 64% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go index d3776aa3..68e63218 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go @@ -22,27 +22,27 @@ limitations under the License. package v1alpha1 import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) -type AzurekeyvaultV1alpha1Interface interface { +type KeyvaultV1alpha1Interface interface { RESTClient() rest.Interface AzureKeyVaultSecretsGetter } -// AzurekeyvaultV1alpha1Client is used to interact with features provided by the azurekeyvault.spv.no group. -type AzurekeyvaultV1alpha1Client struct { +// KeyvaultV1alpha1Client is used to interact with features provided by the keyvault.azure.spv.no group. +type KeyvaultV1alpha1Client struct { restClient rest.Interface } -func (c *AzurekeyvaultV1alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { +func (c *KeyvaultV1alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { return newAzureKeyVaultSecrets(c, namespace) } -// NewForConfig creates a new AzurekeyvaultV1alpha1Client for the given config. -func NewForConfig(c *rest.Config) (*AzurekeyvaultV1alpha1Client, error) { +// NewForConfig creates a new KeyvaultV1alpha1Client for the given config. +func NewForConfig(c *rest.Config) (*KeyvaultV1alpha1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -51,12 +51,12 @@ func NewForConfig(c *rest.Config) (*AzurekeyvaultV1alpha1Client, error) { if err != nil { return nil, err } - return &AzurekeyvaultV1alpha1Client{client}, nil + return &KeyvaultV1alpha1Client{client}, nil } -// NewForConfigOrDie creates a new AzurekeyvaultV1alpha1Client for the given config and +// NewForConfigOrDie creates a new KeyvaultV1alpha1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1alpha1Client { +func NewForConfigOrDie(c *rest.Config) *KeyvaultV1alpha1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -64,9 +64,9 @@ func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1alpha1Client { return client } -// New creates a new AzurekeyvaultV1alpha1Client for the given RESTClient. -func New(c rest.Interface) *AzurekeyvaultV1alpha1Client { - return &AzurekeyvaultV1alpha1Client{c} +// New creates a new KeyvaultV1alpha1Client for the given RESTClient. +func New(c rest.Interface) *KeyvaultV1alpha1Client { + return &KeyvaultV1alpha1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -84,7 +84,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *AzurekeyvaultV1alpha1Client) RESTClient() rest.Interface { +func (c *KeyvaultV1alpha1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go similarity index 97% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go index 1d3674c0..b0b16a29 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go @@ -24,8 +24,8 @@ package v2alpha1 import ( "time" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" @@ -59,7 +59,7 @@ type azureKeyVaultSecrets struct { } // newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets -func newAzureKeyVaultSecrets(c *AzurekeyvaultV2alpha1Client, namespace string) *azureKeyVaultSecrets { +func newAzureKeyVaultSecrets(c *KeyvaultV2alpha1Client, namespace string) *azureKeyVaultSecrets { return &azureKeyVaultSecrets{ client: c.RESTClient(), ns: namespace, diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go similarity index 95% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go index 7a6cadde..f83af7db 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,13 +33,13 @@ import ( // FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface type FakeAzureKeyVaultSecrets struct { - Fake *FakeAzurekeyvaultV2alpha1 + Fake *FakeKeyvaultV2alpha1 ns string } -var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Resource: "azurekeyvaultsecrets"} +var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v2alpha1", Resource: "azurekeyvaultsecrets"} -var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v2alpha1", Kind: "AzureKeyVaultSecret"} +var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v2alpha1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecret, err error) { diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go similarity index 78% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go index 0282b0e1..23e841d2 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go @@ -22,22 +22,22 @@ limitations under the License. package fake import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) -type FakeAzurekeyvaultV2alpha1 struct { +type FakeKeyvaultV2alpha1 struct { *testing.Fake } -func (c *FakeAzurekeyvaultV2alpha1) AzureKeyVaultSecrets(namespace string) v2alpha1.AzureKeyVaultSecretInterface { +func (c *FakeKeyvaultV2alpha1) AzureKeyVaultSecrets(namespace string) v2alpha1.AzureKeyVaultSecretInterface { return &FakeAzureKeyVaultSecrets{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeAzurekeyvaultV2alpha1) RESTClient() rest.Interface { +func (c *FakeKeyvaultV2alpha1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go similarity index 64% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go rename to pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go index b17ac47b..a5a2dde5 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go +++ b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go @@ -22,27 +22,27 @@ limitations under the License. package v2alpha1 import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) -type AzurekeyvaultV2alpha1Interface interface { +type KeyvaultV2alpha1Interface interface { RESTClient() rest.Interface AzureKeyVaultSecretsGetter } -// AzurekeyvaultV2alpha1Client is used to interact with features provided by the azurekeyvault.spv.no group. -type AzurekeyvaultV2alpha1Client struct { +// KeyvaultV2alpha1Client is used to interact with features provided by the keyvault.azure.spv.no group. +type KeyvaultV2alpha1Client struct { restClient rest.Interface } -func (c *AzurekeyvaultV2alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { +func (c *KeyvaultV2alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { return newAzureKeyVaultSecrets(c, namespace) } -// NewForConfig creates a new AzurekeyvaultV2alpha1Client for the given config. -func NewForConfig(c *rest.Config) (*AzurekeyvaultV2alpha1Client, error) { +// NewForConfig creates a new KeyvaultV2alpha1Client for the given config. +func NewForConfig(c *rest.Config) (*KeyvaultV2alpha1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -51,12 +51,12 @@ func NewForConfig(c *rest.Config) (*AzurekeyvaultV2alpha1Client, error) { if err != nil { return nil, err } - return &AzurekeyvaultV2alpha1Client{client}, nil + return &KeyvaultV2alpha1Client{client}, nil } -// NewForConfigOrDie creates a new AzurekeyvaultV2alpha1Client for the given config and +// NewForConfigOrDie creates a new KeyvaultV2alpha1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV2alpha1Client { +func NewForConfigOrDie(c *rest.Config) *KeyvaultV2alpha1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -64,9 +64,9 @@ func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV2alpha1Client { return client } -// New creates a new AzurekeyvaultV2alpha1Client for the given RESTClient. -func New(c rest.Interface) *AzurekeyvaultV2alpha1Client { - return &AzurekeyvaultV2alpha1Client{c} +// New creates a new KeyvaultV2alpha1Client for the given RESTClient. +func New(c rest.Interface) *KeyvaultV2alpha1Client { + return &KeyvaultV2alpha1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -84,7 +84,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *AzurekeyvaultV2alpha1Client) RESTClient() rest.Interface { +func (c *KeyvaultV2alpha1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/pkg/k8s/client/informers/externalversions/factory.go b/pkg/k8s/client/azure/informers/externalversions/factory.go similarity index 89% rename from pkg/k8s/client/informers/externalversions/factory.go rename to pkg/k8s/client/azure/informers/externalversions/factory.go index 4b647da0..7bc10328 100644 --- a/pkg/k8s/client/informers/externalversions/factory.go +++ b/pkg/k8s/client/azure/informers/externalversions/factory.go @@ -26,10 +26,10 @@ import ( sync "sync" time "time" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - azureidentity "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azureidentity" - azurekeyvault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + identity "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/identity" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + keyvault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -176,14 +176,14 @@ type SharedInformerFactory interface { ForResource(resource schema.GroupVersionResource) (GenericInformer, error) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool - Azureidentity() azureidentity.Interface - Azurekeyvault() azurekeyvault.Interface + Identity() identity.Interface + Keyvault() keyvault.Interface } -func (f *sharedInformerFactory) Azureidentity() azureidentity.Interface { - return azureidentity.New(f, f.namespace, f.tweakListOptions) +func (f *sharedInformerFactory) Identity() identity.Interface { + return identity.New(f, f.namespace, f.tweakListOptions) } -func (f *sharedInformerFactory) Azurekeyvault() azurekeyvault.Interface { - return azurekeyvault.New(f, f.namespace, f.tweakListOptions) +func (f *sharedInformerFactory) Keyvault() keyvault.Interface { + return keyvault.New(f, f.namespace, f.tweakListOptions) } diff --git a/pkg/k8s/client/informers/externalversions/generic.go b/pkg/k8s/client/azure/informers/externalversions/generic.go similarity index 80% rename from pkg/k8s/client/informers/externalversions/generic.go rename to pkg/k8s/client/azure/informers/externalversions/generic.go index 903f801e..703f6736 100644 --- a/pkg/k8s/client/informers/externalversions/generic.go +++ b/pkg/k8s/client/azure/informers/externalversions/generic.go @@ -24,10 +24,10 @@ package externalversions import ( "fmt" - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" ) @@ -58,21 +58,21 @@ func (f *genericInformer) Lister() cache.GenericLister { // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { - // Group=azureidentity.spv.no, Version=v1beta1 + // Group=identity.azure.spv.no, Version=v1beta1 case v1beta1.SchemeGroupVersion.WithResource("azuremanagedidentities"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Azureidentity().V1beta1().AzureManagedIdentities().Informer()}, nil + return &genericInformer{resource: resource.GroupResource(), informer: f.Identity().V1beta1().AzureManagedIdentities().Informer()}, nil - // Group=azurekeyvault.spv.no, Version=v1 + // Group=keyvault.azure.spv.no, Version=v1 case v1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V1().AzureKeyVaultSecrets().Informer()}, nil + return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V1().AzureKeyVaultSecrets().Informer()}, nil - // Group=azurekeyvault.spv.no, Version=v1alpha1 + // Group=keyvault.azure.spv.no, Version=v1alpha1 case v1alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V1alpha1().AzureKeyVaultSecrets().Informer()}, nil + return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V1alpha1().AzureKeyVaultSecrets().Informer()}, nil - // Group=azurekeyvault.spv.no, Version=v2alpha1 + // Group=keyvault.azure.spv.no, Version=v2alpha1 case v2alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Informer()}, nil + return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V2alpha1().AzureKeyVaultSecrets().Informer()}, nil } diff --git a/pkg/k8s/client/informers/externalversions/azureidentity/interface.go b/pkg/k8s/client/azure/informers/externalversions/identity/interface.go similarity index 90% rename from pkg/k8s/client/informers/externalversions/azureidentity/interface.go rename to pkg/k8s/client/azure/informers/externalversions/identity/interface.go index 3675abd1..0851eef2 100644 --- a/pkg/k8s/client/informers/externalversions/azureidentity/interface.go +++ b/pkg/k8s/client/azure/informers/externalversions/identity/interface.go @@ -19,11 +19,11 @@ limitations under the License. // Code generated by informer-gen. DO NOT EDIT. -package azureidentity +package identity import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" ) // Interface provides access to each of this group's versions. diff --git a/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/azuremanagedidentity.go similarity index 85% rename from pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/azuremanagedidentity.go rename to pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/azuremanagedidentity.go index a23d56f8..78b83e36 100644 --- a/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/azuremanagedidentity.go +++ b/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/azuremanagedidentity.go @@ -24,10 +24,10 @@ package v1beta1 import ( time "time" - azureidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azureidentity/v1beta1" + identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/identity/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -64,16 +64,16 @@ func NewFilteredAzureManagedIdentityInformer(client versioned.Interface, namespa if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzureidentityV1beta1().AzureManagedIdentities(namespace).List(options) + return client.IdentityV1beta1().AzureManagedIdentities(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzureidentityV1beta1().AzureManagedIdentities(namespace).Watch(options) + return client.IdentityV1beta1().AzureManagedIdentities(namespace).Watch(options) }, }, - &azureidentityv1beta1.AzureManagedIdentity{}, + &identityv1beta1.AzureManagedIdentity{}, resyncPeriod, indexers, ) @@ -84,7 +84,7 @@ func (f *azureManagedIdentityInformer) defaultInformer(client versioned.Interfac } func (f *azureManagedIdentityInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&azureidentityv1beta1.AzureManagedIdentity{}, f.defaultInformer) + return f.factory.InformerFor(&identityv1beta1.AzureManagedIdentity{}, f.defaultInformer) } func (f *azureManagedIdentityInformer) Lister() v1beta1.AzureManagedIdentityLister { diff --git a/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/interface.go b/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/interface.go similarity index 95% rename from pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/interface.go rename to pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/interface.go index 992f9301..dd1b1799 100644 --- a/pkg/k8s/client/informers/externalversions/azureidentity/v1beta1/interface.go +++ b/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/interface.go @@ -22,7 +22,7 @@ limitations under the License. package v1beta1 import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/pkg/k8s/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/pkg/k8s/client/azure/informers/externalversions/internalinterfaces/factory_interfaces.go similarity index 96% rename from pkg/k8s/client/informers/externalversions/internalinterfaces/factory_interfaces.go rename to pkg/k8s/client/azure/informers/externalversions/internalinterfaces/factory_interfaces.go index 8c44c52e..910f4a52 100644 --- a/pkg/k8s/client/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/pkg/k8s/client/azure/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -24,7 +24,7 @@ package internalinterfaces import ( time "time" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go b/pkg/k8s/client/azure/informers/externalversions/keyvault/interface.go similarity index 88% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go rename to pkg/k8s/client/azure/informers/externalversions/keyvault/interface.go index 033b8f9b..a76d4482 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go +++ b/pkg/k8s/client/azure/informers/externalversions/keyvault/interface.go @@ -19,13 +19,13 @@ limitations under the License. // Code generated by informer-gen. DO NOT EDIT. -package azurekeyvault +package keyvault import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault/v1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1" ) // Interface provides access to each of this group's versions. diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go similarity index 86% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go index 84179292..ad67da5d 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go @@ -24,10 +24,10 @@ package v1 import ( time "time" - azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -64,16 +64,16 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzurekeyvaultV1().AzureKeyVaultSecrets(namespace).List(options) + return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).List(options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzurekeyvaultV1().AzureKeyVaultSecrets(namespace).Watch(options) + return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).Watch(options) }, }, - &azurekeyvaultv1.AzureKeyVaultSecret{}, + &keyvaultv1.AzureKeyVaultSecret{}, resyncPeriod, indexers, ) @@ -84,7 +84,7 @@ func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface } func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&azurekeyvaultv1.AzureKeyVaultSecret{}, f.defaultInformer) + return f.factory.InformerFor(&keyvaultv1.AzureKeyVaultSecret{}, f.defaultInformer) } func (f *azureKeyVaultSecretInformer) Lister() v1.AzureKeyVaultSecretLister { diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/interface.go b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/interface.go similarity index 95% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v1/interface.go rename to pkg/k8s/client/azure/informers/externalversions/keyvault/v1/interface.go index 6d598386..e7a20f1c 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/interface.go +++ b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/interface.go @@ -22,7 +22,7 @@ limitations under the License. package v1 import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go similarity index 85% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go index 3c5f5c5a..f6f4f09a 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go @@ -24,10 +24,10 @@ package v1alpha1 import ( time "time" - azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v1alpha1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -64,16 +64,16 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzurekeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).List(options) + return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzurekeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).Watch(options) + return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).Watch(options) }, }, - &azurekeyvaultv1alpha1.AzureKeyVaultSecret{}, + &keyvaultv1alpha1.AzureKeyVaultSecret{}, resyncPeriod, indexers, ) @@ -84,7 +84,7 @@ func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface } func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&azurekeyvaultv1alpha1.AzureKeyVaultSecret{}, f.defaultInformer) + return f.factory.InformerFor(&keyvaultv1alpha1.AzureKeyVaultSecret{}, f.defaultInformer) } func (f *azureKeyVaultSecretInformer) Lister() v1alpha1.AzureKeyVaultSecretLister { diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/interface.go b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/interface.go similarity index 95% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/interface.go rename to pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/interface.go index fe3dbc7e..2608a324 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/interface.go +++ b/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/interface.go @@ -22,7 +22,7 @@ limitations under the License. package v1alpha1 import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go similarity index 85% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go index e42c6612..c9b1ce2a 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go @@ -24,10 +24,10 @@ package v2alpha1 import ( time "time" - azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -64,16 +64,16 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).List(options) + return client.KeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.AzurekeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).Watch(options) + return client.KeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).Watch(options) }, }, - &azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, + &keyvaultv2alpha1.AzureKeyVaultSecret{}, resyncPeriod, indexers, ) @@ -84,7 +84,7 @@ func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface } func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, f.defaultInformer) + return f.factory.InformerFor(&keyvaultv2alpha1.AzureKeyVaultSecret{}, f.defaultInformer) } func (f *azureKeyVaultSecretInformer) Lister() v2alpha1.AzureKeyVaultSecretLister { diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go b/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/interface.go similarity index 95% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go rename to pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/interface.go index d1154e3a..b1c460d9 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go +++ b/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/interface.go @@ -22,7 +22,7 @@ limitations under the License. package v2alpha1 import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/pkg/k8s/client/listers/azureidentity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/azure/listers/identity/v1beta1/azuremanagedidentity.go similarity index 98% rename from pkg/k8s/client/listers/azureidentity/v1beta1/azuremanagedidentity.go rename to pkg/k8s/client/azure/listers/identity/v1beta1/azuremanagedidentity.go index 63308ea1..4b4e2532 100644 --- a/pkg/k8s/client/listers/azureidentity/v1beta1/azuremanagedidentity.go +++ b/pkg/k8s/client/azure/listers/identity/v1beta1/azuremanagedidentity.go @@ -22,7 +22,7 @@ limitations under the License. package v1beta1 import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azureidentity/v1beta1" + v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/listers/azureidentity/v1beta1/expansion_generated.go b/pkg/k8s/client/azure/listers/identity/v1beta1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/listers/azureidentity/v1beta1/expansion_generated.go rename to pkg/k8s/client/azure/listers/identity/v1beta1/expansion_generated.go diff --git a/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/listers/keyvault/v1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/listers/keyvault/v1/azurekeyvaultsecret.go index 848565f8..f1eedcef 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/listers/keyvault/v1/azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package v1 import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/listers/azurekeyvault/v1/expansion_generated.go b/pkg/k8s/client/azure/listers/keyvault/v1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/listers/azurekeyvault/v1/expansion_generated.go rename to pkg/k8s/client/azure/listers/keyvault/v1/expansion_generated.go diff --git a/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/listers/keyvault/v1alpha1/azurekeyvaultsecret.go similarity index 98% rename from pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/listers/keyvault/v1alpha1/azurekeyvaultsecret.go index 7a96f389..46e567a4 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/listers/keyvault/v1alpha1/azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package v1alpha1 import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/listers/azurekeyvault/v1alpha1/expansion_generated.go b/pkg/k8s/client/azure/listers/keyvault/v1alpha1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/listers/azurekeyvault/v1alpha1/expansion_generated.go rename to pkg/k8s/client/azure/listers/keyvault/v1alpha1/expansion_generated.go diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/azure/listers/keyvault/v2alpha1/azurekeyvaultsecret.go similarity index 98% rename from pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/azure/listers/keyvault/v2alpha1/azurekeyvaultsecret.go index 60cd19e3..67bf5499 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/azure/listers/keyvault/v2alpha1/azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package v2alpha1 import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go b/pkg/k8s/client/azure/listers/keyvault/v2alpha1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go rename to pkg/k8s/client/azure/listers/keyvault/v2alpha1/expansion_generated.go From 6635eeaf16c86500beb9b6f0833d16a49ea070b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Fri, 9 Oct 2020 15:38:44 +0200 Subject: [PATCH 170/251] moved azure key vault client back to client/ instead of client/azure --- .../controller/controller.go | 8 +- cmd/azure-keyvault-controller/main.go | 4 +- cmd/azure-keyvault-env/main.go | 2 +- pkg/azure/credentialprovider/arm.go | 47 +++++ pkg/k8s/apis/azure/identity/register.go | 21 --- pkg/k8s/apis/azure/identity/v1beta1/doc.go | 21 --- .../apis/azure/identity/v1beta1/register.go | 52 ----- pkg/k8s/apis/azure/identity/v1beta1/types.go | 46 ----- .../identity/v1beta1/zz_generated.deepcopy.go | 104 ---------- .../identity/v1beta1/azuremanagedidentity.go | 177 ------------------ .../versioned/typed/identity/v1beta1/doc.go | 23 --- .../v1beta1/fake/fake_azuremanagedidentity.go | 131 ------------- .../v1beta1/fake/fake_identity_client.go | 43 ----- .../identity/v1beta1/generated_expansion.go | 24 --- .../typed/identity/v1beta1/identity_client.go | 92 --------- .../typed/keyvault/v2alpha1/fake/doc.go | 23 --- .../externalversions/identity/interface.go | 49 ----- .../identity/v1beta1/azuremanagedidentity.go | 92 --------- .../identity/v1beta1/interface.go | 48 ----- .../identity/v1beta1/azuremanagedidentity.go | 97 ---------- .../identity/v1beta1/expansion_generated.go | 30 --- .../clientset/versioned/clientset.go | 20 +- .../{azure => }/clientset/versioned/doc.go | 0 .../versioned/fake/clientset_generated.go | 21 +-- .../clientset/versioned/fake/doc.go | 0 .../clientset/versioned/fake/register.go | 2 - .../clientset/versioned/scheme/doc.go | 0 .../clientset/versioned/scheme/register.go | 2 - .../typed/keyvault/v1/azurekeyvaultsecret.go | 2 +- .../versioned/typed/keyvault/v1/doc.go | 0 .../versioned/typed/keyvault/v1}/fake/doc.go | 0 .../v1/fake/fake_azurekeyvaultsecret.go | 0 .../keyvault/v1/fake/fake_keyvault_client.go | 2 +- .../typed/keyvault/v1/generated_expansion.go | 0 .../typed/keyvault/v1/keyvault_client.go | 2 +- .../keyvault/v1alpha1/azurekeyvaultsecret.go | 2 +- .../versioned/typed/keyvault/v1alpha1/doc.go | 0 .../typed/keyvault/v1alpha1}/fake/doc.go | 0 .../v1alpha1/fake/fake_azurekeyvaultsecret.go | 0 .../v1alpha1/fake/fake_keyvault_client.go | 2 +- .../keyvault/v1alpha1/generated_expansion.go | 0 .../keyvault/v1alpha1/keyvault_client.go | 2 +- .../keyvault/v2alpha1/azurekeyvaultsecret.go | 2 +- .../versioned/typed/keyvault/v2alpha1/doc.go | 0 .../typed/keyvault/v2alpha1}/fake/doc.go | 0 .../v2alpha1/fake/fake_azurekeyvaultsecret.go | 0 .../v2alpha1/fake/fake_keyvault_client.go | 2 +- .../keyvault/v2alpha1/generated_expansion.go | 0 .../keyvault/v2alpha1/keyvault_client.go | 2 +- .../informers/externalversions/factory.go | 12 +- .../informers/externalversions/generic.go | 7 +- .../internalinterfaces/factory_interfaces.go | 2 +- .../externalversions/keyvault/interface.go | 8 +- .../keyvault/v1/azurekeyvaultsecret.go | 6 +- .../externalversions/keyvault/v1/interface.go | 2 +- .../keyvault/v1alpha1/azurekeyvaultsecret.go | 6 +- .../keyvault/v1alpha1/interface.go | 2 +- .../keyvault/v2alpha1/azurekeyvaultsecret.go | 6 +- .../keyvault/v2alpha1/interface.go | 2 +- .../keyvault/v1/azurekeyvaultsecret.go | 0 .../keyvault/v1/expansion_generated.go | 0 .../keyvault/v1alpha1/azurekeyvaultsecret.go | 0 .../keyvault/v1alpha1/expansion_generated.go | 0 .../keyvault/v2alpha1/azurekeyvaultsecret.go | 0 .../keyvault/v2alpha1/expansion_generated.go | 0 65 files changed, 94 insertions(+), 1156 deletions(-) create mode 100644 pkg/azure/credentialprovider/arm.go delete mode 100644 pkg/k8s/apis/azure/identity/register.go delete mode 100644 pkg/k8s/apis/azure/identity/v1beta1/doc.go delete mode 100644 pkg/k8s/apis/azure/identity/v1beta1/register.go delete mode 100644 pkg/k8s/apis/azure/identity/v1beta1/types.go delete mode 100644 pkg/k8s/apis/azure/identity/v1beta1/zz_generated.deepcopy.go delete mode 100644 pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/azuremanagedidentity.go delete mode 100644 pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/doc.go delete mode 100644 pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_azuremanagedidentity.go delete mode 100644 pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go delete mode 100644 pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/generated_expansion.go delete mode 100644 pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/identity_client.go delete mode 100644 pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go delete mode 100644 pkg/k8s/client/azure/informers/externalversions/identity/interface.go delete mode 100644 pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/azuremanagedidentity.go delete mode 100644 pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/interface.go delete mode 100644 pkg/k8s/client/azure/listers/identity/v1beta1/azuremanagedidentity.go delete mode 100644 pkg/k8s/client/azure/listers/identity/v1beta1/expansion_generated.go rename pkg/k8s/client/{azure => }/clientset/versioned/clientset.go (82%) rename pkg/k8s/client/{azure => }/clientset/versioned/doc.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/fake/clientset_generated.go (77%) rename pkg/k8s/client/{azure => }/clientset/versioned/fake/doc.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/fake/register.go (94%) rename pkg/k8s/client/{azure => }/clientset/versioned/scheme/doc.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/scheme/register.go (94%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1/doc.go (100%) rename pkg/k8s/client/{azure/clientset/versioned/typed/identity/v1beta1 => clientset/versioned/typed/keyvault/v1}/fake/doc.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go (95%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1/generated_expansion.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1/keyvault_client.go (98%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1alpha1/doc.go (100%) rename pkg/k8s/client/{azure/clientset/versioned/typed/keyvault/v1 => clientset/versioned/typed/keyvault/v1alpha1}/fake/doc.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go (94%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go (98%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v2alpha1/doc.go (100%) rename pkg/k8s/client/{azure/clientset/versioned/typed/keyvault/v1alpha1 => clientset/versioned/typed/keyvault/v2alpha1}/fake/doc.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go (94%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go (100%) rename pkg/k8s/client/{azure => }/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go (98%) rename pkg/k8s/client/{azure => }/informers/externalversions/factory.go (93%) rename pkg/k8s/client/{azure => }/informers/externalversions/generic.go (87%) rename pkg/k8s/client/{azure => }/informers/externalversions/internalinterfaces/factory_interfaces.go (96%) rename pkg/k8s/client/{azure => }/informers/externalversions/keyvault/interface.go (88%) rename pkg/k8s/client/{azure => }/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go (95%) rename pkg/k8s/client/{azure => }/informers/externalversions/keyvault/v1/interface.go (95%) rename pkg/k8s/client/{azure => }/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go (95%) rename pkg/k8s/client/{azure => }/informers/externalversions/keyvault/v1alpha1/interface.go (95%) rename pkg/k8s/client/{azure => }/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go (95%) rename pkg/k8s/client/{azure => }/informers/externalversions/keyvault/v2alpha1/interface.go (95%) rename pkg/k8s/client/{azure => }/listers/keyvault/v1/azurekeyvaultsecret.go (100%) rename pkg/k8s/client/{azure => }/listers/keyvault/v1/expansion_generated.go (100%) rename pkg/k8s/client/{azure => }/listers/keyvault/v1alpha1/azurekeyvaultsecret.go (100%) rename pkg/k8s/client/{azure => }/listers/keyvault/v1alpha1/expansion_generated.go (100%) rename pkg/k8s/client/{azure => }/listers/keyvault/v2alpha1/azurekeyvaultsecret.go (100%) rename pkg/k8s/client/{azure => }/listers/keyvault/v2alpha1/expansion_generated.go (100%) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 3f999393..77097f73 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -36,10 +36,10 @@ import ( "kmodules.xyz/client-go/tools/queue" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" - akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions" - listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v2alpha1" + akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" + akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" + listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v2alpha1" ) const ( diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 21bd49f8..8e9c75a6 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -39,8 +39,8 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions" + clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals" ) diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index eae47a7d..77604cbf 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -29,7 +29,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" - clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" log "github.com/sirupsen/logrus" "github.com/spf13/viper" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/pkg/azure/credentialprovider/arm.go b/pkg/azure/credentialprovider/arm.go new file mode 100644 index 00000000..cf978de5 --- /dev/null +++ b/pkg/azure/credentialprovider/arm.go @@ -0,0 +1,47 @@ +// Copyright © 2020 Sparebanken Vest +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go) + +package credentialprovider + +import ( + "github.com/Azure/go-autorest/autorest" + "github.com/Azure/go-autorest/autorest/adal" +) + +// AzureResourceManagerCredentials has credentials needed to authenticate with azure resource manager. +// These credentials will never expire +type AzureResourceManagerCredentials struct { + SubscriptionID string + ResourceManagerEndpoint string + Token *adal.ServicePrincipalToken +} + +// Authorizer gets an Authorizer from credentials +func (c AzureResourceManagerCredentials) Authorizer() (autorest.Authorizer, error) { + return createAuthorizerFromServicePrincipalToken(c.Token) +} + +// GetAzureResourceManagerCredentials will get Azure credentials for Azure Resource Manager (ARM) +func (c CloudConfigCredentialProvider) GetAzureResourceManagerCredentials() (*AzureResourceManagerCredentials, error) { + token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ResourceManagerEndpoint) + if err != nil { + return nil, err + } + + return &AzureResourceManagerCredentials{ + Token: token, + }, nil +} diff --git a/pkg/k8s/apis/azure/identity/register.go b/pkg/k8s/apis/azure/identity/register.go deleted file mode 100644 index 3bfa8fbd..00000000 --- a/pkg/k8s/apis/azure/identity/register.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package identity - -const ( - GroupName = "azure.spv.no" -) diff --git a/pkg/k8s/apis/azure/identity/v1beta1/doc.go b/pkg/k8s/apis/azure/identity/v1beta1/doc.go deleted file mode 100644 index b819f7d1..00000000 --- a/pkg/k8s/apis/azure/identity/v1beta1/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// +k8s:deepcopy-gen=package -// +groupName=identity.azure.spv.no - -// Package v1 is the v1 version of the API. -package v1beta1 diff --git a/pkg/k8s/apis/azure/identity/v1beta1/register.go b/pkg/k8s/apis/azure/identity/v1beta1/register.go deleted file mode 100644 index 2ed8b54f..00000000 --- a/pkg/k8s/apis/azure/identity/v1beta1/register.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1beta1 - -import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: identity.GroupName, Version: "v1beta1"} - -// Kind takes an unqualified kind and returns back a Group qualified GroupKind -func Kind(kind string) schema.GroupKind { - return SchemeGroupVersion.WithKind(kind).GroupKind() -} - -// Resource takes an unqualified resource and returns a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} - -var ( - SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) - AddToScheme = SchemeBuilder.AddToScheme -) - -// Adds the list of known types to Scheme. -func addKnownTypes(scheme *runtime.Scheme) error { - scheme.AddKnownTypes(SchemeGroupVersion, - &AzureManagedIdentity{}, - &AzureManagedIdentityList{}, - ) - metav1.AddToGroupVersion(scheme, SchemeGroupVersion) - return nil -} diff --git a/pkg/k8s/apis/azure/identity/v1beta1/types.go b/pkg/k8s/apis/azure/identity/v1beta1/types.go deleted file mode 100644 index 4120e2b6..00000000 --- a/pkg/k8s/apis/azure/identity/v1beta1/types.go +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1beta1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// AzureManagedIdentity is an optional MSI identity to use when accessing Azure Key Vault -type AzureManagedIdentity struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec AzureManagedIdentitySpec `json:"spec"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// AzureManagedIdentityList is a list of AzureKeyVaultSecretIdentity resources -type AzureManagedIdentityList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []AzureManagedIdentity `json:"items"` -} - -type AzureManagedIdentitySpec struct { - Name string `json:"name"` -} diff --git a/pkg/k8s/apis/azure/identity/v1beta1/zz_generated.deepcopy.go b/pkg/k8s/apis/azure/identity/v1beta1/zz_generated.deepcopy.go deleted file mode 100644 index f114073b..00000000 --- a/pkg/k8s/apis/azure/identity/v1beta1/zz_generated.deepcopy.go +++ /dev/null @@ -1,104 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1beta1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureManagedIdentity) DeepCopyInto(out *AzureManagedIdentity) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureManagedIdentity. -func (in *AzureManagedIdentity) DeepCopy() *AzureManagedIdentity { - if in == nil { - return nil - } - out := new(AzureManagedIdentity) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureManagedIdentity) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureManagedIdentityList) DeepCopyInto(out *AzureManagedIdentityList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]AzureManagedIdentity, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureManagedIdentityList. -func (in *AzureManagedIdentityList) DeepCopy() *AzureManagedIdentityList { - if in == nil { - return nil - } - out := new(AzureManagedIdentityList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureManagedIdentityList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureManagedIdentitySpec) DeepCopyInto(out *AzureManagedIdentitySpec) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureManagedIdentitySpec. -func (in *AzureManagedIdentitySpec) DeepCopy() *AzureManagedIdentitySpec { - if in == nil { - return nil - } - out := new(AzureManagedIdentitySpec) - in.DeepCopyInto(out) - return out -} diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/azuremanagedidentity.go deleted file mode 100644 index 6588da44..00000000 --- a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/azuremanagedidentity.go +++ /dev/null @@ -1,177 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1beta1 - -import ( - "time" - - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" -) - -// AzureManagedIdentitiesGetter has a method to return a AzureManagedIdentityInterface. -// A group's client should implement this interface. -type AzureManagedIdentitiesGetter interface { - AzureManagedIdentities(namespace string) AzureManagedIdentityInterface -} - -// AzureManagedIdentityInterface has methods to work with AzureManagedIdentity resources. -type AzureManagedIdentityInterface interface { - Create(*v1beta1.AzureManagedIdentity) (*v1beta1.AzureManagedIdentity, error) - Update(*v1beta1.AzureManagedIdentity) (*v1beta1.AzureManagedIdentity, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1beta1.AzureManagedIdentity, error) - List(opts v1.ListOptions) (*v1beta1.AzureManagedIdentityList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.AzureManagedIdentity, err error) - AzureManagedIdentityExpansion -} - -// azureManagedIdentities implements AzureManagedIdentityInterface -type azureManagedIdentities struct { - client rest.Interface - ns string -} - -// newAzureManagedIdentities returns a AzureManagedIdentities -func newAzureManagedIdentities(c *IdentityV1beta1Client, namespace string) *azureManagedIdentities { - return &azureManagedIdentities{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the azureManagedIdentity, and returns the corresponding azureManagedIdentity object, and an error if there is any. -func (c *azureManagedIdentities) Get(name string, options v1.GetOptions) (result *v1beta1.AzureManagedIdentity, err error) { - result = &v1beta1.AzureManagedIdentity{} - err = c.client.Get(). - Namespace(c.ns). - Resource("azuremanagedidentities"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of AzureManagedIdentities that match those selectors. -func (c *azureManagedIdentities) List(opts v1.ListOptions) (result *v1beta1.AzureManagedIdentityList, err error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - result = &v1beta1.AzureManagedIdentityList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("azuremanagedidentities"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested azureManagedIdentities. -func (c *azureManagedIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { - var timeout time.Duration - if opts.TimeoutSeconds != nil { - timeout = time.Duration(*opts.TimeoutSeconds) * time.Second - } - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("azuremanagedidentities"). - VersionedParams(&opts, scheme.ParameterCodec). - Timeout(timeout). - Watch() -} - -// Create takes the representation of a azureManagedIdentity and creates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. -func (c *azureManagedIdentities) Create(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { - result = &v1beta1.AzureManagedIdentity{} - err = c.client.Post(). - Namespace(c.ns). - Resource("azuremanagedidentities"). - Body(azureManagedIdentity). - Do(). - Into(result) - return -} - -// Update takes the representation of a azureManagedIdentity and updates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. -func (c *azureManagedIdentities) Update(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { - result = &v1beta1.AzureManagedIdentity{} - err = c.client.Put(). - Namespace(c.ns). - Resource("azuremanagedidentities"). - Name(azureManagedIdentity.Name). - Body(azureManagedIdentity). - Do(). - Into(result) - return -} - -// Delete takes name of the azureManagedIdentity and deletes it. Returns an error if one occurs. -func (c *azureManagedIdentities) Delete(name string, options *v1.DeleteOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("azuremanagedidentities"). - Name(name). - Body(options). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (c *azureManagedIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second - } - return c.client.Delete(). - Namespace(c.ns). - Resource("azuremanagedidentities"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Timeout(timeout). - Body(options). - Do(). - Error() -} - -// Patch applies the patch and returns the patched azureManagedIdentity. -func (c *azureManagedIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.AzureManagedIdentity, err error) { - result = &v1beta1.AzureManagedIdentity{} - err = c.client.Patch(pt). - Namespace(c.ns). - Resource("azuremanagedidentities"). - SubResource(subresources...). - Name(name). - Body(data). - Do(). - Into(result) - return -} diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/doc.go deleted file mode 100644 index b53c05c9..00000000 --- a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated typed clients. -package v1beta1 diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_azuremanagedidentity.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_azuremanagedidentity.go deleted file mode 100644 index c5542c7c..00000000 --- a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_azuremanagedidentity.go +++ /dev/null @@ -1,131 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" - types "k8s.io/apimachinery/pkg/types" - watch "k8s.io/apimachinery/pkg/watch" - testing "k8s.io/client-go/testing" -) - -// FakeAzureManagedIdentities implements AzureManagedIdentityInterface -type FakeAzureManagedIdentities struct { - Fake *FakeIdentityV1beta1 - ns string -} - -var azuremanagedidentitiesResource = schema.GroupVersionResource{Group: "identity.azure.spv.no", Version: "v1beta1", Resource: "azuremanagedidentities"} - -var azuremanagedidentitiesKind = schema.GroupVersionKind{Group: "identity.azure.spv.no", Version: "v1beta1", Kind: "AzureManagedIdentity"} - -// Get takes name of the azureManagedIdentity, and returns the corresponding azureManagedIdentity object, and an error if there is any. -func (c *FakeAzureManagedIdentities) Get(name string, options v1.GetOptions) (result *v1beta1.AzureManagedIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(azuremanagedidentitiesResource, c.ns, name), &v1beta1.AzureManagedIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v1beta1.AzureManagedIdentity), err -} - -// List takes label and field selectors, and returns the list of AzureManagedIdentities that match those selectors. -func (c *FakeAzureManagedIdentities) List(opts v1.ListOptions) (result *v1beta1.AzureManagedIdentityList, err error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(azuremanagedidentitiesResource, azuremanagedidentitiesKind, c.ns, opts), &v1beta1.AzureManagedIdentityList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &v1beta1.AzureManagedIdentityList{ListMeta: obj.(*v1beta1.AzureManagedIdentityList).ListMeta} - for _, item := range obj.(*v1beta1.AzureManagedIdentityList).Items { - if label.Matches(labels.Set(item.Labels)) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Watch returns a watch.Interface that watches the requested azureManagedIdentities. -func (c *FakeAzureManagedIdentities) Watch(opts v1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(azuremanagedidentitiesResource, c.ns, opts)) - -} - -// Create takes the representation of a azureManagedIdentity and creates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. -func (c *FakeAzureManagedIdentities) Create(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(azuremanagedidentitiesResource, c.ns, azureManagedIdentity), &v1beta1.AzureManagedIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v1beta1.AzureManagedIdentity), err -} - -// Update takes the representation of a azureManagedIdentity and updates it. Returns the server's representation of the azureManagedIdentity, and an error, if there is any. -func (c *FakeAzureManagedIdentities) Update(azureManagedIdentity *v1beta1.AzureManagedIdentity) (result *v1beta1.AzureManagedIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(azuremanagedidentitiesResource, c.ns, azureManagedIdentity), &v1beta1.AzureManagedIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v1beta1.AzureManagedIdentity), err -} - -// Delete takes name of the azureManagedIdentity and deletes it. Returns an error if one occurs. -func (c *FakeAzureManagedIdentities) Delete(name string, options *v1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(azuremanagedidentitiesResource, c.ns, name), &v1beta1.AzureManagedIdentity{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeAzureManagedIdentities) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(azuremanagedidentitiesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &v1beta1.AzureManagedIdentityList{}) - return err -} - -// Patch applies the patch and returns the patched azureManagedIdentity. -func (c *FakeAzureManagedIdentities) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.AzureManagedIdentity, err error) { - obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(azuremanagedidentitiesResource, c.ns, name, pt, data, subresources...), &v1beta1.AzureManagedIdentity{}) - - if obj == nil { - return nil, err - } - return obj.(*v1beta1.AzureManagedIdentity), err -} diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go deleted file mode 100644 index c58f45ef..00000000 --- a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/fake_identity_client.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package fake - -import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1" - rest "k8s.io/client-go/rest" - testing "k8s.io/client-go/testing" -) - -type FakeIdentityV1beta1 struct { - *testing.Fake -} - -func (c *FakeIdentityV1beta1) AzureManagedIdentities(namespace string) v1beta1.AzureManagedIdentityInterface { - return &FakeAzureManagedIdentities{c, namespace} -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *FakeIdentityV1beta1) RESTClient() rest.Interface { - var ret *rest.RESTClient - return ret -} diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/generated_expansion.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/generated_expansion.go deleted file mode 100644 index 9793ecec..00000000 --- a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/generated_expansion.go +++ /dev/null @@ -1,24 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1beta1 - -type AzureManagedIdentityExpansion interface{} diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/identity_client.go b/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/identity_client.go deleted file mode 100644 index 2381ef48..00000000 --- a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/identity_client.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1beta1 - -import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" - rest "k8s.io/client-go/rest" -) - -type IdentityV1beta1Interface interface { - RESTClient() rest.Interface - AzureManagedIdentitiesGetter -} - -// IdentityV1beta1Client is used to interact with features provided by the identity.azure.spv.no group. -type IdentityV1beta1Client struct { - restClient rest.Interface -} - -func (c *IdentityV1beta1Client) AzureManagedIdentities(namespace string) AzureManagedIdentityInterface { - return newAzureManagedIdentities(c, namespace) -} - -// NewForConfig creates a new IdentityV1beta1Client for the given config. -func NewForConfig(c *rest.Config) (*IdentityV1beta1Client, error) { - config := *c - if err := setConfigDefaults(&config); err != nil { - return nil, err - } - client, err := rest.RESTClientFor(&config) - if err != nil { - return nil, err - } - return &IdentityV1beta1Client{client}, nil -} - -// NewForConfigOrDie creates a new IdentityV1beta1Client for the given config and -// panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *IdentityV1beta1Client { - client, err := NewForConfig(c) - if err != nil { - panic(err) - } - return client -} - -// New creates a new IdentityV1beta1Client for the given RESTClient. -func New(c rest.Interface) *IdentityV1beta1Client { - return &IdentityV1beta1Client{c} -} - -func setConfigDefaults(config *rest.Config) error { - gv := v1beta1.SchemeGroupVersion - config.GroupVersion = &gv - config.APIPath = "/apis" - config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() - - if config.UserAgent == "" { - config.UserAgent = rest.DefaultKubernetesUserAgent() - } - - return nil -} - -// RESTClient returns a RESTClient that is used to communicate -// with API server by this client implementation. -func (c *IdentityV1beta1Client) RESTClient() rest.Interface { - if c == nil { - return nil - } - return c.restClient -} diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go b/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go deleted file mode 100644 index d55229c6..00000000 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -// Package fake has the automatically generated clients. -package fake diff --git a/pkg/k8s/client/azure/informers/externalversions/identity/interface.go b/pkg/k8s/client/azure/informers/externalversions/identity/interface.go deleted file mode 100644 index 0851eef2..00000000 --- a/pkg/k8s/client/azure/informers/externalversions/identity/interface.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package identity - -import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" -) - -// Interface provides access to each of this group's versions. -type Interface interface { - // V1beta1 provides access to shared informers for resources in V1beta1. - V1beta1() v1beta1.Interface -} - -type group struct { - factory internalinterfaces.SharedInformerFactory - namespace string - tweakListOptions internalinterfaces.TweakListOptionsFunc -} - -// New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { - return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} -} - -// V1beta1 returns a new v1beta1.Interface. -func (g *group) V1beta1() v1beta1.Interface { - return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) -} diff --git a/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/azuremanagedidentity.go deleted file mode 100644 index 78b83e36..00000000 --- a/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/azuremanagedidentity.go +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v1beta1 - -import ( - time "time" - - identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/identity/v1beta1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - watch "k8s.io/apimachinery/pkg/watch" - cache "k8s.io/client-go/tools/cache" -) - -// AzureManagedIdentityInformer provides access to a shared informer and lister for -// AzureManagedIdentities. -type AzureManagedIdentityInformer interface { - Informer() cache.SharedIndexInformer - Lister() v1beta1.AzureManagedIdentityLister -} - -type azureManagedIdentityInformer struct { - factory internalinterfaces.SharedInformerFactory - tweakListOptions internalinterfaces.TweakListOptionsFunc - namespace string -} - -// NewAzureManagedIdentityInformer constructs a new informer for AzureManagedIdentity type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewAzureManagedIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { - return NewFilteredAzureManagedIdentityInformer(client, namespace, resyncPeriod, indexers, nil) -} - -// NewFilteredAzureManagedIdentityInformer constructs a new informer for AzureManagedIdentity type. -// Always prefer using an informer factory to get a shared informer instead of getting an independent -// one. This reduces memory footprint and number of connections to the server. -func NewFilteredAzureManagedIdentityInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { - return cache.NewSharedIndexInformer( - &cache.ListWatch{ - ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.IdentityV1beta1().AzureManagedIdentities(namespace).List(options) - }, - WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - if tweakListOptions != nil { - tweakListOptions(&options) - } - return client.IdentityV1beta1().AzureManagedIdentities(namespace).Watch(options) - }, - }, - &identityv1beta1.AzureManagedIdentity{}, - resyncPeriod, - indexers, - ) -} - -func (f *azureManagedIdentityInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewFilteredAzureManagedIdentityInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) -} - -func (f *azureManagedIdentityInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&identityv1beta1.AzureManagedIdentity{}, f.defaultInformer) -} - -func (f *azureManagedIdentityInformer) Lister() v1beta1.AzureManagedIdentityLister { - return v1beta1.NewAzureManagedIdentityLister(f.Informer().GetIndexer()) -} diff --git a/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/interface.go b/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/interface.go deleted file mode 100644 index dd1b1799..00000000 --- a/pkg/k8s/client/azure/informers/externalversions/identity/v1beta1/interface.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by informer-gen. DO NOT EDIT. - -package v1beta1 - -import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" -) - -// Interface provides access to all the informers in this group version. -type Interface interface { - // AzureManagedIdentities returns a AzureManagedIdentityInformer. - AzureManagedIdentities() AzureManagedIdentityInformer -} - -type version struct { - factory internalinterfaces.SharedInformerFactory - namespace string - tweakListOptions internalinterfaces.TweakListOptionsFunc -} - -// New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { - return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} -} - -// AzureManagedIdentities returns a AzureManagedIdentityInformer. -func (v *version) AzureManagedIdentities() AzureManagedIdentityInformer { - return &azureManagedIdentityInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} diff --git a/pkg/k8s/client/azure/listers/identity/v1beta1/azuremanagedidentity.go b/pkg/k8s/client/azure/listers/identity/v1beta1/azuremanagedidentity.go deleted file mode 100644 index 4b4e2532..00000000 --- a/pkg/k8s/client/azure/listers/identity/v1beta1/azuremanagedidentity.go +++ /dev/null @@ -1,97 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v1beta1 - -import ( - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/cache" -) - -// AzureManagedIdentityLister helps list AzureManagedIdentities. -type AzureManagedIdentityLister interface { - // List lists all AzureManagedIdentities in the indexer. - List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) - // AzureManagedIdentities returns an object that can list and get AzureManagedIdentities. - AzureManagedIdentities(namespace string) AzureManagedIdentityNamespaceLister - AzureManagedIdentityListerExpansion -} - -// azureManagedIdentityLister implements the AzureManagedIdentityLister interface. -type azureManagedIdentityLister struct { - indexer cache.Indexer -} - -// NewAzureManagedIdentityLister returns a new AzureManagedIdentityLister. -func NewAzureManagedIdentityLister(indexer cache.Indexer) AzureManagedIdentityLister { - return &azureManagedIdentityLister{indexer: indexer} -} - -// List lists all AzureManagedIdentities in the indexer. -func (s *azureManagedIdentityLister) List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) { - err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v1beta1.AzureManagedIdentity)) - }) - return ret, err -} - -// AzureManagedIdentities returns an object that can list and get AzureManagedIdentities. -func (s *azureManagedIdentityLister) AzureManagedIdentities(namespace string) AzureManagedIdentityNamespaceLister { - return azureManagedIdentityNamespaceLister{indexer: s.indexer, namespace: namespace} -} - -// AzureManagedIdentityNamespaceLister helps list and get AzureManagedIdentities. -type AzureManagedIdentityNamespaceLister interface { - // List lists all AzureManagedIdentities in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) - // Get retrieves the AzureManagedIdentity from the indexer for a given namespace and name. - Get(name string) (*v1beta1.AzureManagedIdentity, error) - AzureManagedIdentityNamespaceListerExpansion -} - -// azureManagedIdentityNamespaceLister implements the AzureManagedIdentityNamespaceLister -// interface. -type azureManagedIdentityNamespaceLister struct { - indexer cache.Indexer - namespace string -} - -// List lists all AzureManagedIdentities in the indexer for a given namespace. -func (s azureManagedIdentityNamespaceLister) List(selector labels.Selector) (ret []*v1beta1.AzureManagedIdentity, err error) { - err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v1beta1.AzureManagedIdentity)) - }) - return ret, err -} - -// Get retrieves the AzureManagedIdentity from the indexer for a given namespace and name. -func (s azureManagedIdentityNamespaceLister) Get(name string) (*v1beta1.AzureManagedIdentity, error) { - obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) - if err != nil { - return nil, err - } - if !exists { - return nil, errors.NewNotFound(v1beta1.Resource("azuremanagedidentity"), name) - } - return obj.(*v1beta1.AzureManagedIdentity), nil -} diff --git a/pkg/k8s/client/azure/listers/identity/v1beta1/expansion_generated.go b/pkg/k8s/client/azure/listers/identity/v1beta1/expansion_generated.go deleted file mode 100644 index da14c5c6..00000000 --- a/pkg/k8s/client/azure/listers/identity/v1beta1/expansion_generated.go +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v1beta1 - -// AzureManagedIdentityListerExpansion allows custom methods to be added to -// AzureManagedIdentityLister. -type AzureManagedIdentityListerExpansion interface{} - -// AzureManagedIdentityNamespaceListerExpansion allows custom methods to be added to -// AzureManagedIdentityNamespaceLister. -type AzureManagedIdentityNamespaceListerExpansion interface{} diff --git a/pkg/k8s/client/azure/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go similarity index 82% rename from pkg/k8s/client/azure/clientset/versioned/clientset.go rename to pkg/k8s/client/clientset/versioned/clientset.go index daab0c9d..d6660c84 100644 --- a/pkg/k8s/client/azure/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -24,10 +24,9 @@ package versioned import ( "fmt" - identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1" - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1" - keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -35,7 +34,6 @@ import ( type Interface interface { Discovery() discovery.DiscoveryInterface - IdentityV1beta1() identityv1beta1.IdentityV1beta1Interface KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface KeyvaultV1() keyvaultv1.KeyvaultV1Interface KeyvaultV2alpha1() keyvaultv2alpha1.KeyvaultV2alpha1Interface @@ -45,17 +43,11 @@ type Interface interface { // version included in a Clientset. type Clientset struct { *discovery.DiscoveryClient - identityV1beta1 *identityv1beta1.IdentityV1beta1Client keyvaultV1alpha1 *keyvaultv1alpha1.KeyvaultV1alpha1Client keyvaultV1 *keyvaultv1.KeyvaultV1Client keyvaultV2alpha1 *keyvaultv2alpha1.KeyvaultV2alpha1Client } -// IdentityV1beta1 retrieves the IdentityV1beta1Client -func (c *Clientset) IdentityV1beta1() identityv1beta1.IdentityV1beta1Interface { - return c.identityV1beta1 -} - // KeyvaultV1alpha1 retrieves the KeyvaultV1alpha1Client func (c *Clientset) KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface { return c.keyvaultV1alpha1 @@ -92,10 +84,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { } var cs Clientset var err error - cs.identityV1beta1, err = identityv1beta1.NewForConfig(&configShallowCopy) - if err != nil { - return nil, err - } cs.keyvaultV1alpha1, err = keyvaultv1alpha1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -120,7 +108,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset - cs.identityV1beta1 = identityv1beta1.NewForConfigOrDie(c) cs.keyvaultV1alpha1 = keyvaultv1alpha1.NewForConfigOrDie(c) cs.keyvaultV1 = keyvaultv1.NewForConfigOrDie(c) cs.keyvaultV2alpha1 = keyvaultv2alpha1.NewForConfigOrDie(c) @@ -132,7 +119,6 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { // New creates a new Clientset for the given RESTClient. func New(c rest.Interface) *Clientset { var cs Clientset - cs.identityV1beta1 = identityv1beta1.New(c) cs.keyvaultV1alpha1 = keyvaultv1alpha1.New(c) cs.keyvaultV1 = keyvaultv1.New(c) cs.keyvaultV2alpha1 = keyvaultv2alpha1.New(c) diff --git a/pkg/k8s/client/azure/clientset/versioned/doc.go b/pkg/k8s/client/clientset/versioned/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/doc.go rename to pkg/k8s/client/clientset/versioned/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go similarity index 77% rename from pkg/k8s/client/azure/clientset/versioned/fake/clientset_generated.go rename to pkg/k8s/client/clientset/versioned/fake/clientset_generated.go index b871970c..93008747 100644 --- a/pkg/k8s/client/azure/clientset/versioned/fake/clientset_generated.go +++ b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go @@ -22,15 +22,13 @@ limitations under the License. package fake import ( - clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1" - fakeidentityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake" - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1" - fakekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake" - keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1" - fakekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1" - fakekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake" + clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1" + fakekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1" + fakekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1" + fakekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/discovery" @@ -85,11 +83,6 @@ func (c *Clientset) Tracker() testing.ObjectTracker { var _ clientset.Interface = &Clientset{} -// IdentityV1beta1 retrieves the IdentityV1beta1Client -func (c *Clientset) IdentityV1beta1() identityv1beta1.IdentityV1beta1Interface { - return &fakeidentityv1beta1.FakeIdentityV1beta1{Fake: &c.Fake} -} - // KeyvaultV1alpha1 retrieves the KeyvaultV1alpha1Client func (c *Clientset) KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface { return &fakekeyvaultv1alpha1.FakeKeyvaultV1alpha1{Fake: &c.Fake} diff --git a/pkg/k8s/client/azure/clientset/versioned/fake/doc.go b/pkg/k8s/client/clientset/versioned/fake/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/fake/doc.go rename to pkg/k8s/client/clientset/versioned/fake/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/fake/register.go b/pkg/k8s/client/clientset/versioned/fake/register.go similarity index 94% rename from pkg/k8s/client/azure/clientset/versioned/fake/register.go rename to pkg/k8s/client/clientset/versioned/fake/register.go index 0243a5d2..2e6c6dab 100644 --- a/pkg/k8s/client/azure/clientset/versioned/fake/register.go +++ b/pkg/k8s/client/clientset/versioned/fake/register.go @@ -22,7 +22,6 @@ limitations under the License. package fake import ( - identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" @@ -37,7 +36,6 @@ var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) var localSchemeBuilder = runtime.SchemeBuilder{ - identityv1beta1.AddToScheme, keyvaultv1alpha1.AddToScheme, keyvaultv1.AddToScheme, keyvaultv2alpha1.AddToScheme, diff --git a/pkg/k8s/client/azure/clientset/versioned/scheme/doc.go b/pkg/k8s/client/clientset/versioned/scheme/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/scheme/doc.go rename to pkg/k8s/client/clientset/versioned/scheme/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/scheme/register.go b/pkg/k8s/client/clientset/versioned/scheme/register.go similarity index 94% rename from pkg/k8s/client/azure/clientset/versioned/scheme/register.go rename to pkg/k8s/client/clientset/versioned/scheme/register.go index 773ad024..2f5e07ee 100644 --- a/pkg/k8s/client/azure/clientset/versioned/scheme/register.go +++ b/pkg/k8s/client/clientset/versioned/scheme/register.go @@ -22,7 +22,6 @@ limitations under the License. package scheme import ( - identityv1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" @@ -37,7 +36,6 @@ var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) var localSchemeBuilder = runtime.SchemeBuilder{ - identityv1beta1.AddToScheme, keyvaultv1alpha1.AddToScheme, keyvaultv1.AddToScheme, keyvaultv2alpha1.AddToScheme, diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go index b38cebe2..a78a506b 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go @@ -25,7 +25,7 @@ import ( "time" v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/doc.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/doc.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/identity/v1beta1/fake/doc.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go similarity index 95% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go index 70dffda4..7de14e72 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/generated_expansion.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1/generated_expansion.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/keyvault_client.go similarity index 98% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1/keyvault_client.go index 3f17ee4e..18cc43e6 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/keyvault_client.go @@ -23,7 +23,7 @@ package v1 import ( v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go index f4e998e1..611b386f 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go @@ -25,7 +25,7 @@ import ( "time" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/doc.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/doc.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1/fake/doc.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go similarity index 94% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go index c820b115..d9af251f 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go similarity index 98% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go index 68e63218..c003fe4a 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go @@ -23,7 +23,7 @@ package v1alpha1 import ( v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go index b0b16a29..e1fd9f19 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go @@ -25,7 +25,7 @@ import ( "time" v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" - scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" + scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/doc.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/doc.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go similarity index 94% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go index 23e841d2..ba068c4e 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go diff --git a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go similarity index 98% rename from pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go index a5a2dde5..95d9c7e4 100644 --- a/pkg/k8s/client/azure/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go @@ -23,7 +23,7 @@ package v2alpha1 import ( v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned/scheme" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) diff --git a/pkg/k8s/client/azure/informers/externalversions/factory.go b/pkg/k8s/client/informers/externalversions/factory.go similarity index 93% rename from pkg/k8s/client/azure/informers/externalversions/factory.go rename to pkg/k8s/client/informers/externalversions/factory.go index 7bc10328..5416145e 100644 --- a/pkg/k8s/client/azure/informers/externalversions/factory.go +++ b/pkg/k8s/client/informers/externalversions/factory.go @@ -26,10 +26,9 @@ import ( sync "sync" time "time" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - identity "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/identity" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" - keyvault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + keyvault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -176,14 +175,9 @@ type SharedInformerFactory interface { ForResource(resource schema.GroupVersionResource) (GenericInformer, error) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool - Identity() identity.Interface Keyvault() keyvault.Interface } -func (f *sharedInformerFactory) Identity() identity.Interface { - return identity.New(f, f.namespace, f.tweakListOptions) -} - func (f *sharedInformerFactory) Keyvault() keyvault.Interface { return keyvault.New(f, f.namespace, f.tweakListOptions) } diff --git a/pkg/k8s/client/azure/informers/externalversions/generic.go b/pkg/k8s/client/informers/externalversions/generic.go similarity index 87% rename from pkg/k8s/client/azure/informers/externalversions/generic.go rename to pkg/k8s/client/informers/externalversions/generic.go index 703f6736..36a61471 100644 --- a/pkg/k8s/client/azure/informers/externalversions/generic.go +++ b/pkg/k8s/client/informers/externalversions/generic.go @@ -24,7 +24,6 @@ package externalversions import ( "fmt" - v1beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/identity/v1beta1" v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" @@ -58,11 +57,7 @@ func (f *genericInformer) Lister() cache.GenericLister { // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { - // Group=identity.azure.spv.no, Version=v1beta1 - case v1beta1.SchemeGroupVersion.WithResource("azuremanagedidentities"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Identity().V1beta1().AzureManagedIdentities().Informer()}, nil - - // Group=keyvault.azure.spv.no, Version=v1 + // Group=keyvault.azure.spv.no, Version=v1 case v1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V1().AzureKeyVaultSecrets().Informer()}, nil diff --git a/pkg/k8s/client/azure/informers/externalversions/internalinterfaces/factory_interfaces.go b/pkg/k8s/client/informers/externalversions/internalinterfaces/factory_interfaces.go similarity index 96% rename from pkg/k8s/client/azure/informers/externalversions/internalinterfaces/factory_interfaces.go rename to pkg/k8s/client/informers/externalversions/internalinterfaces/factory_interfaces.go index 910f4a52..8c44c52e 100644 --- a/pkg/k8s/client/azure/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/pkg/k8s/client/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -24,7 +24,7 @@ package internalinterfaces import ( time "time" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/azure/informers/externalversions/keyvault/interface.go b/pkg/k8s/client/informers/externalversions/keyvault/interface.go similarity index 88% rename from pkg/k8s/client/azure/informers/externalversions/keyvault/interface.go rename to pkg/k8s/client/informers/externalversions/keyvault/interface.go index a76d4482..b073670c 100644 --- a/pkg/k8s/client/azure/informers/externalversions/keyvault/interface.go +++ b/pkg/k8s/client/informers/externalversions/keyvault/interface.go @@ -22,10 +22,10 @@ limitations under the License. package keyvault import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault/v1" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault/v1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1" ) // Interface provides access to each of this group's versions. diff --git a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go similarity index 95% rename from pkg/k8s/client/azure/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go index ad67da5d..1488d4db 100644 --- a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go @@ -25,9 +25,9 @@ import ( time "time" keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" diff --git a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/interface.go b/pkg/k8s/client/informers/externalversions/keyvault/v1/interface.go similarity index 95% rename from pkg/k8s/client/azure/informers/externalversions/keyvault/v1/interface.go rename to pkg/k8s/client/informers/externalversions/keyvault/v1/interface.go index e7a20f1c..6d598386 100644 --- a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1/interface.go +++ b/pkg/k8s/client/informers/externalversions/keyvault/v1/interface.go @@ -22,7 +22,7 @@ limitations under the License. package v1 import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go similarity index 95% rename from pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go index f6f4f09a..815f127c 100644 --- a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go @@ -25,9 +25,9 @@ import ( time "time" keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v1alpha1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" diff --git a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/interface.go b/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/interface.go similarity index 95% rename from pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/interface.go rename to pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/interface.go index 2608a324..fe3dbc7e 100644 --- a/pkg/k8s/client/azure/informers/externalversions/keyvault/v1alpha1/interface.go +++ b/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/interface.go @@ -22,7 +22,7 @@ limitations under the License. package v1alpha1 import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go similarity index 95% rename from pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go index c9b1ce2a..d78dcd1b 100644 --- a/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go @@ -25,9 +25,9 @@ import ( time "time" keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" - versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/clientset/versioned" - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/listers/keyvault/v2alpha1" + versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" diff --git a/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/interface.go b/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/interface.go similarity index 95% rename from pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/interface.go rename to pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/interface.go index b1c460d9..d1154e3a 100644 --- a/pkg/k8s/client/azure/informers/externalversions/keyvault/v2alpha1/interface.go +++ b/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/interface.go @@ -22,7 +22,7 @@ limitations under the License. package v2alpha1 import ( - internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/azure/informers/externalversions/internalinterfaces" + internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/pkg/k8s/client/azure/listers/keyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/keyvault/v1/azurekeyvaultsecret.go similarity index 100% rename from pkg/k8s/client/azure/listers/keyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/listers/keyvault/v1/azurekeyvaultsecret.go diff --git a/pkg/k8s/client/azure/listers/keyvault/v1/expansion_generated.go b/pkg/k8s/client/listers/keyvault/v1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/azure/listers/keyvault/v1/expansion_generated.go rename to pkg/k8s/client/listers/keyvault/v1/expansion_generated.go diff --git a/pkg/k8s/client/azure/listers/keyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/keyvault/v1alpha1/azurekeyvaultsecret.go similarity index 100% rename from pkg/k8s/client/azure/listers/keyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/listers/keyvault/v1alpha1/azurekeyvaultsecret.go diff --git a/pkg/k8s/client/azure/listers/keyvault/v1alpha1/expansion_generated.go b/pkg/k8s/client/listers/keyvault/v1alpha1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/azure/listers/keyvault/v1alpha1/expansion_generated.go rename to pkg/k8s/client/listers/keyvault/v1alpha1/expansion_generated.go diff --git a/pkg/k8s/client/azure/listers/keyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/keyvault/v2alpha1/azurekeyvaultsecret.go similarity index 100% rename from pkg/k8s/client/azure/listers/keyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/listers/keyvault/v2alpha1/azurekeyvaultsecret.go diff --git a/pkg/k8s/client/azure/listers/keyvault/v2alpha1/expansion_generated.go b/pkg/k8s/client/listers/keyvault/v2alpha1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/azure/listers/keyvault/v2alpha1/expansion_generated.go rename to pkg/k8s/client/listers/keyvault/v2alpha1/expansion_generated.go From e9365383e4d636783d9c8f2395a2e21766f48baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 10 Oct 2020 11:17:47 +0200 Subject: [PATCH 171/251] webhook: fix #129 - not using namespace from pod (which can be empty), but from admission request --- .github/workflows/webhook-build.yaml | 1 + cmd/azure-keyvault-secrets-webhook/pod.go | 8 ++++---- cmd/azure-keyvault-secrets-webhook/registry.go | 4 ++-- pkg/docker/registry/registry.go | 6 +----- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index 4890ef77..a80b2d7b 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -4,6 +4,7 @@ on: push: branches: - master + - '*-patch' paths: - '.github/workflows/webhook-build.yaml' - '.github/actions/**' diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index 34200665..26dc4a6b 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -72,7 +72,7 @@ func getVolumes() []corev1.Volume { return volumes } -func mutateContainers(clientset kubernetes.Interface, ns string, containers []corev1.Container, podSpec *corev1.PodSpec) (bool, error) { +func mutateContainers(clientset kubernetes.Interface, containers []corev1.Container, podSpec *corev1.PodSpec) (bool, error) { mutated := false for i, container := range containers { @@ -104,7 +104,7 @@ func mutateContainers(clientset kubernetes.Interface, ns string, containers []co continue } - autoArgs, err := getContainerCmd(clientset, ns, &container, podSpec) + autoArgs, err := getContainerCmd(clientset, &container, podSpec) if err != nil { return false, fmt.Errorf("failed to get auto cmd, error: %+v", err) } @@ -213,12 +213,12 @@ func mutatePodSpec(pod *corev1.Pod) error { return err } - initContainersMutated, err := mutateContainers(clientset, pod.Namespace, podSpec.InitContainers, podSpec) + initContainersMutated, err := mutateContainers(clientset, podSpec.InitContainers, podSpec) if err != nil { return err } - containersMutated, err := mutateContainers(clientset, pod.Namespace, podSpec.Containers, podSpec) + containersMutated, err := mutateContainers(clientset, podSpec.Containers, podSpec) if err != nil { return err } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 322e5391..9434e166 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -24,7 +24,7 @@ import ( "k8s.io/client-go/kubernetes" ) -func getContainerCmd(clientset kubernetes.Interface, ns string, container *corev1.Container, podSpec *corev1.PodSpec) ([]string, error) { +func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container, podSpec *corev1.PodSpec) ([]string, error) { log.Debugf("getting container command for container '%s'", container.Name) cmd := container.Command @@ -33,7 +33,7 @@ func getContainerCmd(clientset kubernetes.Interface, ns string, container *corev if len(cmd) == 0 { log.Debugf("no cmd override in kubernetes for container %s, checking docker image configuration for entrypoint and cmd for %s", container.Name, container.Image) - imgConfig, err := registry.GetImageConfig(clientset, ns, container, podSpec, config.cloudConfigHostPath) + imgConfig, err := registry.GetImageConfig(clientset, config.namespace, container, podSpec, config.cloudConfigHostPath) if err != nil { return nil, err } diff --git a/pkg/docker/registry/registry.go b/pkg/docker/registry/registry.go index 15be202f..28d6a3bd 100644 --- a/pkg/docker/registry/registry.go +++ b/pkg/docker/registry/registry.go @@ -37,11 +37,7 @@ type DockerCreds struct { // GetImageConfig returns entrypoint and command of container func GetImageConfig(clientset kubernetes.Interface, namespace string, container *corev1.Container, podSpec *corev1.PodSpec, cloudConfigPath string) (*imagev1.ImageConfig, error) { - ns := "default" - if namespace != "" { - ns = namespace - } - containerInfo := ContainerInfo{Namespace: ns, clientset: clientset} + containerInfo := ContainerInfo{Namespace: namespace, clientset: clientset} err := containerInfo.Collect(container, podSpec, cloudConfigPath) if err != nil { From 2e4304a3879bf0dc1da1617c927936b02c1b896b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 10 Oct 2020 11:47:42 +0200 Subject: [PATCH 172/251] handle issue where env-injection fails with 404 because pod-name is not extracted properly (ref #137) --- cmd/azure-keyvault-env/main.go | 2 +- cmd/azure-keyvault-secrets-webhook/pod.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 8273d00d..f3de05fa 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -166,7 +166,7 @@ func main() { config = injectorConfig{ namespace: viper.GetString("env_injector_pod_namespace"), - podName: viper.GetString("HOSTNAME"), + podName: viper.GetString("env_injector_pod_name"), retryTimes: viper.GetInt("env_injector_retries"), waitTimeBetweenRetries: viper.GetInt("env_injector_wait_before_retry"), useAuthService: viper.GetBool("env_injector_use_auth_service"), diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index dee350fc..6798b703 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -179,6 +179,14 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock }, }, }, + { + Name: "ENV_INJECTOR_POD_NAME", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "metadata.name", + }, + }, + }, { Name: "ENV_INJECTOR_ARGS_SIGNATURE", Value: base64.StdEncoding.EncodeToString([]byte(signature)), From 7f4bc7343b4a0b65340e5633ddd628ecc07113b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 10 Oct 2020 11:49:35 +0200 Subject: [PATCH 173/251] make sure to trigger patch builds --- .github/workflows/vaultenv-build.yaml | 1 + .github/workflows/webhook-build.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml index 5f084b76..02f91d6d 100644 --- a/.github/workflows/vaultenv-build.yaml +++ b/.github/workflows/vaultenv-build.yaml @@ -4,6 +4,7 @@ on: push: branches: - master + - '*-patch' paths: - '.github/workflows/vaultenv-build.yaml' - '.github/actions/**' diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml index b2d3303e..684ef74b 100644 --- a/.github/workflows/webhook-build.yaml +++ b/.github/workflows/webhook-build.yaml @@ -4,6 +4,7 @@ on: push: branches: - master + - '*-patch' paths: - '.github/workflows/webhook-build.yaml' - '.github/actions/**' From af2ccbc8193bcf689dd0391261d76c0d0e966b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 10 Oct 2020 22:42:15 +0200 Subject: [PATCH 174/251] * reverted changes to akv api * implemented missing params to enable ca bundle in main controller --- .../workflows/ca-bundle-controller-build.yaml | 1 + .github/workflows/controller-build.yaml | 1 + .../controller/azureKeyVaultSecret.go | 11 +- .../controller/azureeKeyVaultSecret_test.go | 2 +- .../controller/controller.go | 31 +++- .../controller/secret.go | 2 +- .../controller/secret_handler.go | 2 +- cmd/azure-keyvault-controller/main.go | 140 +++++++----------- cmd/azure-keyvault-env/main.go | 2 +- cmd/azure-keyvault-env/secret_handler.go | 2 +- go.sum | 42 ++++++ hack/update-codegen.sh | 2 +- pkg/akv2k8s/transformers/transformator.go | 2 +- .../keyvault/client/azure_keyvault_service.go | 2 +- .../keyvault => azurekeyvault}/register.go | 4 +- .../keyvault => azurekeyvault}/v1/doc.go | 0 .../keyvault => azurekeyvault}/v1/register.go | 4 +- .../keyvault => azurekeyvault}/v1/types.go | 0 .../v1/zz_generated.deepcopy.go | 0 .../v1alpha1/doc.go | 0 .../v1alpha1/register.go | 4 +- .../v1alpha1/types.go | 0 .../v1alpha1/zz_generated.deepcopy.go | 0 .../v2alpha1/doc.go | 0 .../v2alpha1/register.go | 4 +- .../v2alpha1/types.go | 0 .../v2alpha1/zz_generated.deepcopy.go | 0 .../client/clientset/versioned/clientset.go | 6 +- .../versioned/fake/clientset_generated.go | 12 +- .../clientset/versioned/fake/register.go | 6 +- .../clientset/versioned/scheme/register.go | 6 +- .../v1/azurekeyvault_client.go} | 2 +- .../v1/azurekeyvaultsecret.go | 2 +- .../{keyvault => azurekeyvault}/v1/doc.go | 0 .../v1/fake/doc.go | 0 .../v1/fake/fake_azurekeyvault_client.go} | 2 +- .../v1/fake/fake_azurekeyvaultsecret.go | 44 +++--- .../v1/generated_expansion.go | 0 .../v1alpha1/azurekeyvault_client.go} | 2 +- .../v1alpha1/azurekeyvaultsecret.go | 2 +- .../v1alpha1/doc.go | 0 .../v1alpha1/fake/doc.go | 0 .../fake/fake_azurekeyvault_client.go} | 2 +- .../v1alpha1/fake/fake_azurekeyvaultsecret.go | 2 +- .../v1alpha1/generated_expansion.go | 0 .../v2alpha1/azurekeyvault_client.go} | 2 +- .../v2alpha1/azurekeyvaultsecret.go | 2 +- .../v2alpha1/doc.go | 0 .../v2alpha1/fake/doc.go | 0 .../fake/fake_azurekeyvault_client.go} | 2 +- .../v2alpha1/fake/fake_azurekeyvaultsecret.go | 2 +- .../v2alpha1/generated_expansion.go | 0 .../{keyvault => azurekeyvault}/interface.go | 8 +- .../v1/azurekeyvaultsecret.go | 8 +- .../v1/interface.go | 0 .../v1alpha1/azurekeyvaultsecret.go | 8 +- .../v1alpha1/interface.go | 0 .../v2alpha1/azurekeyvaultsecret.go | 8 +- .../v2alpha1/interface.go | 0 .../informers/externalversions/factory.go | 8 +- .../informers/externalversions/generic.go | 6 +- .../v1/azurekeyvaultsecret.go | 2 +- .../v1/expansion_generated.go | 0 .../v1alpha1/azurekeyvaultsecret.go | 2 +- .../v1alpha1/expansion_generated.go | 0 .../v2alpha1/azurekeyvaultsecret.go | 2 +- .../v2alpha1/expansion_generated.go | 0 67 files changed, 221 insertions(+), 185 deletions(-) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/register.go (92%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1/doc.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1/register.go (93%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1/types.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1/zz_generated.deepcopy.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1alpha1/doc.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1alpha1/register.go (93%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1alpha1/types.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v1alpha1/zz_generated.deepcopy.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v2alpha1/doc.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v2alpha1/register.go (93%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v2alpha1/types.go (100%) rename pkg/k8s/apis/{azure/keyvault => azurekeyvault}/v2alpha1/zz_generated.deepcopy.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault/v1/keyvault_client.go => azurekeyvault/v1/azurekeyvault_client.go} (98%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1/doc.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1/fake/doc.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault/v1/fake/fake_keyvault_client.go => azurekeyvault/v1/fake/fake_azurekeyvault_client.go} (95%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1/fake/fake_azurekeyvaultsecret.go (70%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1/generated_expansion.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault/v1alpha1/keyvault_client.go => azurekeyvault/v1alpha1/azurekeyvault_client.go} (98%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1alpha1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1alpha1/doc.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1alpha1/fake/doc.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault/v1alpha1/fake/fake_keyvault_client.go => azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go} (94%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1alpha1/fake/fake_azurekeyvaultsecret.go (99%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v1alpha1/generated_expansion.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault/v2alpha1/keyvault_client.go => azurekeyvault/v2alpha1/azurekeyvault_client.go} (98%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v2alpha1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v2alpha1/doc.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v2alpha1/fake/doc.go (100%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault/v2alpha1/fake/fake_keyvault_client.go => azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go} (94%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v2alpha1/fake/fake_azurekeyvaultsecret.go (99%) rename pkg/k8s/client/clientset/versioned/typed/{keyvault => azurekeyvault}/v2alpha1/generated_expansion.go (100%) rename pkg/k8s/client/informers/externalversions/{keyvault => azurekeyvault}/interface.go (91%) rename pkg/k8s/client/informers/externalversions/{keyvault => azurekeyvault}/v1/azurekeyvaultsecret.go (93%) rename pkg/k8s/client/informers/externalversions/{keyvault => azurekeyvault}/v1/interface.go (100%) rename pkg/k8s/client/informers/externalversions/{keyvault => azurekeyvault}/v1alpha1/azurekeyvaultsecret.go (92%) rename pkg/k8s/client/informers/externalversions/{keyvault => azurekeyvault}/v1alpha1/interface.go (100%) rename pkg/k8s/client/informers/externalversions/{keyvault => azurekeyvault}/v2alpha1/azurekeyvaultsecret.go (92%) rename pkg/k8s/client/informers/externalversions/{keyvault => azurekeyvault}/v2alpha1/interface.go (100%) rename pkg/k8s/client/listers/{keyvault => azurekeyvault}/v1/azurekeyvaultsecret.go (99%) rename pkg/k8s/client/listers/{keyvault => azurekeyvault}/v1/expansion_generated.go (100%) rename pkg/k8s/client/listers/{keyvault => azurekeyvault}/v1alpha1/azurekeyvaultsecret.go (98%) rename pkg/k8s/client/listers/{keyvault => azurekeyvault}/v1alpha1/expansion_generated.go (100%) rename pkg/k8s/client/listers/{keyvault => azurekeyvault}/v2alpha1/azurekeyvaultsecret.go (98%) rename pkg/k8s/client/listers/{keyvault => azurekeyvault}/v2alpha1/expansion_generated.go (100%) diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml index adeb948a..5f12a107 100644 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ b/.github/workflows/ca-bundle-controller-build.yaml @@ -4,6 +4,7 @@ on: push: branches: - master + - '*-patch' paths: - '.github/workflows/ca-bundle-controller-build.yaml' - '.github/actions/**' diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml index 658c07c0..4bb2450d 100644 --- a/.github/workflows/controller-build.yaml +++ b/.github/workflows/controller-build.yaml @@ -4,6 +4,7 @@ on: push: branches: - master + - '*-patch' paths: - '.github/workflows/controller-build.yaml' - '.github/actions/**' diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 066e68c3..2aaa949b 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -23,8 +23,7 @@ import ( "fmt" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -95,14 +94,14 @@ func (c *Controller) initAzureKeyVaultSecret() { }) } -func convertToAzureKeyVaultSecret(obj interface{}) (*v2alpha1.AzureKeyVaultSecret, error) { - secret, ok := obj.(*v2alpha1.AzureKeyVaultSecret) +func convertToAzureKeyVaultSecret(obj interface{}) (*akv.AzureKeyVaultSecret, error) { + secret, ok := obj.(*akv.AzureKeyVaultSecret) if !ok { tombstone, ok := obj.(cache.DeletedFinalStateUnknown) if !ok { return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) } - secret, ok = tombstone.Obj.(*v2alpha1.AzureKeyVaultSecret) + secret, ok = tombstone.Obj.(*akv.AzureKeyVaultSecret) if !ok { return nil, fmt.Errorf("tombstone contained object that is not a AzureKeyVaultSecret %#v", obj) } @@ -139,7 +138,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return nil } -func (c *Controller) akvsHasSecretOutput(secret *v2alpha1.AzureKeyVaultSecret) bool { +func (c *Controller) akvsHasSecretOutput(secret *akv.AzureKeyVaultSecret) bool { return secret.Spec.Output.Secret.Name != "" } diff --git a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go index ad17bacb..d707e687 100644 --- a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go +++ b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go @@ -19,7 +19,7 @@ package controller import ( "testing" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" ) func TestNullLookup(t *testing.T) { diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 77097f73..38340229 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -39,7 +39,7 @@ import ( akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" - listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v2alpha1" + listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" ) const ( @@ -109,14 +109,18 @@ type Controller struct { options *Options clock Timer + + akvLogger *log.Entry + caBundleLogger *log.Entry } // Options contains options for the controller type Options struct { - NumThreads int - MaxNumRequeues int - ResyncPeriod time.Duration - AkvsRef corev1.ObjectReference + NumThreads int + MaxNumRequeues int + ResyncPeriod time.Duration + AkvsRef corev1.ObjectReference + CABundleConfigMapName string } // AzurePollFrequency controls time durations to wait between polls to Azure Key Vault for changes @@ -132,12 +136,20 @@ type AzurePollFrequency struct { } // NewController returns a new AzureKeyVaultSecret controller -func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, namespaceAkvsLabel string, azureFrequency AzurePollFrequency, options *Options) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, caBundleSecretName, caBundleSecretNamespaceName, namespaceAkvsLabel string, azureFrequency AzurePollFrequency, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) + caBundleCMName := "caBundle" + if options.CABundleConfigMapName != "" { + caBundleCMName = options.CABundleConfigMapName + } + + akvLogger := log.WithFields(log.Fields{"component": "akvs"}) + caBundleLogger := log.WithFields(log.Fields{"component": "caBundle"}) + controller := &Controller{ kubeclientset: client, akvsClient: akvsClient, @@ -145,6 +157,10 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI vaultService: vaultService, namespaceAkvsLabel: namespaceAkvsLabel, + caBundleConfigMapName: caBundleCMName, + caBundleSecretName: caBundleSecretName, + caBundleSecretNamespaceName: caBundleSecretNamespaceName, + akvsInformerFactory: akvInformerFactory, kubeInformerFactory: kubeInformerFactory, @@ -155,6 +171,9 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI options: options, clock: &Clock{}, + + akvLogger: akvLogger, + caBundleLogger: caBundleLogger, } controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 82c6863b..7bafcd44 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -26,7 +26,7 @@ import ( "fmt" "sort" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" log "github.com/sirupsen/logrus" "kmodules.xyz/client-go/tools/queue" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 78d9af50..8f370995 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 8e9c75a6..9994e35e 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -22,10 +22,10 @@ package main import ( "flag" "os" - "strconv" "time" log "github.com/sirupsen/logrus" + "github.com/spf13/viper" corev1 "k8s.io/api/core/v1" kubeinformers "k8s.io/client-go/informers" @@ -44,56 +44,72 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals" ) +const controllerAgentName = "azurekeyvaultcontroller" + var ( - masterURL string + version string kubeconfig string + masterURL string cloudconfig string - logLevel string - version string - - azureVaultFastRate time.Duration - azureVaultSlowRate time.Duration - azureVaultMaxFastAttempts int - customAuth bool ) -const controllerAgentName = "azurekeyvaultcontroller" +func initConfig() { + viper.SetDefault("version", "dev") + viper.SetDefault("log_format", "fmt") + viper.SetDefault("akv_label_name", "azure-key-vault-env-injection") + viper.SetDefault("ca_config_map_name", "akv2k8s-ca") + viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") + viper.SetDefault("azure_vault_normal_poll_intervals", 1) + viper.SetDefault("azure_vault_exception_poll_intervals", 5) + viper.SetDefault("azure_vault_max_failure_attempts", 5) + viper.SetDefault("custom_auth", false) + + viper.AutomaticEnv() +} + +func init() { + flag.StringVar(&version, "version", "", "Version of this component.") + flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") + flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") + flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") +} func main() { flag.Parse() - akv2k8s.Version = version + initConfig() - logFormat := "fmt" - logFormat, _ = os.LookupEnv("LOG_FORMAT") + akv2k8s.Version = viper.GetString("version") + + setLogLevel(viper.GetString("log_level")) + setLogFormat(viper.GetString("log_format")) - setLogFormat(logFormat) akv2k8s.LogVersion() - // set up signals so we handle the first shutdown signal gracefully - stopCh := signals.SetupSignalHandler() - setLogLevel() + // kubeconfig := viper.GetString("kubeconfig") + // masterURL := viper.GetString("master") + // cloudconfig := viper.GetString("cloudconfig") - var err error - azureVaultFastRate, err = getEnvDuration("AZURE_VAULT_NORMAL_POLL_INTERVALS", time.Minute*1) - if err != nil { - log.Fatalf("Error parsing env var AZURE_VAULT_NORMAL_POLL_INTERVALS: %s", err.Error()) - } + azureVaultFastRate := time.Duration(viper.GetInt("azure_vault_normal_poll_intervals")) * time.Minute + azureVaultSlowRate := time.Duration(viper.GetInt("azure_vault_exception_poll_intervals")) * time.Minute + azureVaultMaxFastAttempts := viper.GetInt("azure_vault_max_failure_attempts") + customAuth := viper.GetBool("custom_auth") - azureVaultSlowRate, err = getEnvDuration("AZURE_VAULT_EXCEPTION_POLL_INTERVALS", time.Minute*5) - if err != nil { - log.Fatalf("Error parsing env var AZURE_VAULT_EXCEPTION_POLL_INTERVALS: %s", err.Error()) - } + caConfigMapName := viper.GetString("ca_config_map_name") + akvLabelName := viper.GetString("akv_label_name") + akvSecretName := viper.GetString("akv_secret_name") + akvNamespace := viper.GetString("akv_namespace") - azureVaultMaxFastAttempts, err = getEnvInt("AZURE_VAULT_MAX_FAILURE_ATTEMPTS", 5) - if err != nil { - log.Fatalf("Error parsing env var AZURE_VAULT_MAX_FAILURE_ATTEMPTS: %s", err.Error()) + if akvSecretName == "" { + log.Fatal("Env var AKV_SECRET_NAME required") } - customAuth, err = getEnvBool("CUSTOM_AUTH", false) - if err != nil { - log.Fatalf("Error parsing env var CUSTOM_AUTH: %s", err.Error()) + if akvNamespace == "" { + log.Fatal("Env var AKV_NAMESPACE required") } + // set up signals so we handle the first shutdown signal gracefully + stopCh := signals.SetupSignalHandler() + cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) if err != nil { log.Fatalf("Error building kubeconfig: %s", err.Error()) @@ -152,11 +168,11 @@ func main() { vaultService := vault.NewService(vaultAuth) recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) - // handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), recorder, vaultService, azurePollFrequency) options := &controller.Options{ - MaxNumRequeues: 5, - NumThreads: 1, + MaxNumRequeues: 5, + NumThreads: 1, + CABundleConfigMapName: caConfigMapName, } controller := controller.NewController( @@ -166,21 +182,15 @@ func main() { kubeInformerFactory, recorder, vaultService, - "azure-key-vault-env-injection", + akvSecretName, + akvNamespace, + akvLabelName, azurePollFrequency, options) controller.Run(stopCh) } -func init() { - flag.StringVar(&version, "version", "", "Version of this component.") - flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") - flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") - flag.StringVar(&logLevel, "log-level", "", "log level") - flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") -} - func setLogFormat(logFormat string) { switch logFormat { case "fmt": @@ -195,50 +205,14 @@ func setLogFormat(logFormat string) { } } -func setLogLevel() { +func setLogLevel(logLevel string) { if logLevel == "" { - var ok bool - if logLevel, ok = os.LookupEnv("LOG_LEVEL"); !ok { - logLevel = log.InfoLevel.String() - } + logLevel = log.InfoLevel.String() } logrusLevel, err := log.ParseLevel(logLevel) if err != nil { - log.Fatalf("Error setting log level: %s", err.Error()) + log.Fatalf("error setting log level: %s", err.Error()) } log.SetLevel(logrusLevel) - log.Printf("Log level set to '%s'", logrusLevel.String()) -} - -func getEnvDuration(key string, fallback time.Duration) (time.Duration, error) { - if value, ok := os.LookupEnv(key); ok { - duration, err := time.ParseDuration(value) - return duration, err - } - return fallback, nil -} - -func getEnvInt(key string, fallback int) (int, error) { - if value, ok := os.LookupEnv(key); ok { - intVal, err := strconv.Atoi(value) - return intVal, err - } - return fallback, nil -} - -func getEnvStr(key string, fallback string) (string, error) { - if value, ok := os.LookupEnv(key); ok { - return value, nil - } - return fallback, nil -} - -func getEnvBool(key string, fallback bool) (bool, error) { - if value, ok := os.LookupEnv(key); ok { - if booVal, err := strconv.ParseBool(value); ok { - return booVal, err - } - } - return fallback, nil } diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 0778f931..02030c72 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -28,7 +28,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" log "github.com/sirupsen/logrus" "github.com/spf13/viper" diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go index 407543ac..fec73294 100644 --- a/cmd/azure-keyvault-env/secret_handler.go +++ b/cmd/azure-keyvault-env/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/go.sum b/go.sum index 2f93a424..22d23175 100644 --- a/go.sum +++ b/go.sum @@ -86,6 +86,7 @@ github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZ github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.0 h1:k9QF73nrHT3nPLz3lu6G5s+3Hi8Je36ODr1F5gjAXXM= github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= github.com/PuerkitoBio/purell v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -215,6 +216,7 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -230,9 +232,11 @@ github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540 h1:djv/qAomOVj8voCHt0M0OYwR/4vfDq1zNKSPKjJCexs= github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= 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= @@ -280,19 +284,27 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA= github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -312,6 +324,7 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -326,22 +339,39 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c h1:/7detzz5stiXWPzkTlPTzkBEIIE4WGpppBJYjKqBiPI= github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8= github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98 h1:0OkFarm1Zy2CjCiDKfK9XHgmc2wbDlRMD2hD8anAJHU= github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.17.2-0.20190909185456-6163a8a79084 h1:Z4/yXcGr9zrQrcvHkC8f3agyK1dwt/t6zC/8gi6X64Q= github.com/golangci/golangci-lint v1.17.2-0.20190909185456-6163a8a79084/go.mod h1:jXakAOSd+FMU9dP3D6IfBK7HyD1q/RLHI9NOY8veycY= +github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547 h1:fUdgm/BdKvwOHxg5AhNbkNRp2mSy8sxTXyBVs/laQHo= github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217 h1:En/tZdwhAn0JNwLuXzP3k2RVtMqMmOEK7Yu/g3tmtJE= github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= @@ -386,6 +416,7 @@ github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= 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/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= @@ -495,10 +526,12 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -540,6 +573,7 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+ github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663 h1:Ri1EhipkbhWsffPJ3IPlrb4SkTOPa2PfRXp3jchBczw= github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -676,6 +710,7 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -725,6 +760,7 @@ github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec h1:AmoEvWAO3nDx1MEcMzPh+GzOOIA5Znpv6++c7bePPY0= github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= 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= @@ -735,6 +771,7 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.1 h1:UeC9tpM4wNWzUJfan8z9sFE4QCzjjzlCZmuJN+aOkH0= github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -943,6 +980,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw 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-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 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= @@ -1092,8 +1130,11 @@ modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34 h1:duVSyluuJA+u0BnkcLR01smoLrGgDTfWt5c8ODYG8fU= mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= @@ -1104,4 +1145,5 @@ sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index f6cb4be2..db6f8506 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -27,7 +27,7 @@ CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ${GOPATH}/src/k8s.io/co # instead of the $GOPATH directly. For normal projects this can be dropped. ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis \ - "azurekeyvault:v1alpha1,v1,v2alpha1 azureidentity:v1beta1" \ + "azurekeyvault:v1alpha1,v1,v2alpha1" \ --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt # Generate both v1alpha1 and v1 diff --git a/pkg/akv2k8s/transformers/transformator.go b/pkg/akv2k8s/transformers/transformator.go index da6a7563..b2ac9716 100644 --- a/pkg/akv2k8s/transformers/transformator.go +++ b/pkg/akv2k8s/transformers/transformator.go @@ -19,7 +19,7 @@ package transformers import ( "fmt" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" ) // CreateTransformator creates a new Transformator ready to run transformation handlers diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index 1a913374..e407ec61 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -24,7 +24,7 @@ import ( "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" ) const ( diff --git a/pkg/k8s/apis/azure/keyvault/register.go b/pkg/k8s/apis/azurekeyvault/register.go similarity index 92% rename from pkg/k8s/apis/azure/keyvault/register.go rename to pkg/k8s/apis/azurekeyvault/register.go index 15d2b452..b644d6b8 100644 --- a/pkg/k8s/apis/azure/keyvault/register.go +++ b/pkg/k8s/apis/azurekeyvault/register.go @@ -14,8 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -package keyvault +package azurekeyvault const ( - GroupName = "azure.spv.no" + GroupName = "spv.no" ) diff --git a/pkg/k8s/apis/azure/keyvault/v1/doc.go b/pkg/k8s/apis/azurekeyvault/v1/doc.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v1/doc.go rename to pkg/k8s/apis/azurekeyvault/v1/doc.go diff --git a/pkg/k8s/apis/azure/keyvault/v1/register.go b/pkg/k8s/apis/azurekeyvault/v1/register.go similarity index 93% rename from pkg/k8s/apis/azure/keyvault/v1/register.go rename to pkg/k8s/apis/azurekeyvault/v1/register.go index 1a5d5d7a..443fc9ed 100644 --- a/pkg/k8s/apis/azure/keyvault/v1/register.go +++ b/pkg/k8s/apis/azurekeyvault/v1/register.go @@ -17,14 +17,14 @@ limitations under the License. package v1 import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: keyvault.GroupName, Version: "v1"} +var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { diff --git a/pkg/k8s/apis/azure/keyvault/v1/types.go b/pkg/k8s/apis/azurekeyvault/v1/types.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v1/types.go rename to pkg/k8s/apis/azurekeyvault/v1/types.go diff --git a/pkg/k8s/apis/azure/keyvault/v1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go diff --git a/pkg/k8s/apis/azure/keyvault/v1alpha1/doc.go b/pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v1alpha1/doc.go rename to pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go diff --git a/pkg/k8s/apis/azure/keyvault/v1alpha1/register.go b/pkg/k8s/apis/azurekeyvault/v1alpha1/register.go similarity index 93% rename from pkg/k8s/apis/azure/keyvault/v1alpha1/register.go rename to pkg/k8s/apis/azurekeyvault/v1alpha1/register.go index ab1a3d56..d777c182 100644 --- a/pkg/k8s/apis/azure/keyvault/v1alpha1/register.go +++ b/pkg/k8s/apis/azurekeyvault/v1alpha1/register.go @@ -17,14 +17,14 @@ limitations under the License. package v1alpha1 import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: keyvault.GroupName, Version: "v1alpha1"} +var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v1alpha1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { diff --git a/pkg/k8s/apis/azure/keyvault/v1alpha1/types.go b/pkg/k8s/apis/azurekeyvault/v1alpha1/types.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v1alpha1/types.go rename to pkg/k8s/apis/azurekeyvault/v1alpha1/types.go diff --git a/pkg/k8s/apis/azure/keyvault/v1alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v1alpha1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go diff --git a/pkg/k8s/apis/azure/keyvault/v2alpha1/doc.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v2alpha1/doc.go rename to pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go diff --git a/pkg/k8s/apis/azure/keyvault/v2alpha1/register.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go similarity index 93% rename from pkg/k8s/apis/azure/keyvault/v2alpha1/register.go rename to pkg/k8s/apis/azurekeyvault/v2alpha1/register.go index a067d725..3ae19f64 100644 --- a/pkg/k8s/apis/azure/keyvault/v2alpha1/register.go +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go @@ -17,14 +17,14 @@ limitations under the License. package v2alpha1 import ( - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: keyvault.GroupName, Version: "v2alpha1"} +var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v2alpha1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { diff --git a/pkg/k8s/apis/azure/keyvault/v2alpha1/types.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v2alpha1/types.go rename to pkg/k8s/apis/azurekeyvault/v2alpha1/types.go diff --git a/pkg/k8s/apis/azure/keyvault/v2alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go similarity index 100% rename from pkg/k8s/apis/azure/keyvault/v2alpha1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index d6660c84..68fa4c1d 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -24,9 +24,9 @@ package versioned import ( "fmt" - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1" - keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" diff --git a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go index 93008747..3cbc6345 100644 --- a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go +++ b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go @@ -23,12 +23,12 @@ package fake import ( clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1" - fakekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake" - keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1" - fakekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1" - fakekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" + fakekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" + fakekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" + fakekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/discovery" diff --git a/pkg/k8s/client/clientset/versioned/fake/register.go b/pkg/k8s/client/clientset/versioned/fake/register.go index 2e6c6dab..2932114c 100644 --- a/pkg/k8s/client/clientset/versioned/fake/register.go +++ b/pkg/k8s/client/clientset/versioned/fake/register.go @@ -22,9 +22,9 @@ limitations under the License. package fake import ( - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" - keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" diff --git a/pkg/k8s/client/clientset/versioned/scheme/register.go b/pkg/k8s/client/clientset/versioned/scheme/register.go index 2f5e07ee..097f00a2 100644 --- a/pkg/k8s/client/clientset/versioned/scheme/register.go +++ b/pkg/k8s/client/clientset/versioned/scheme/register.go @@ -22,9 +22,9 @@ limitations under the License. package scheme import ( - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" - keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go similarity index 98% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1/keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go index 18cc43e6..b64843bc 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package v1 import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go index a78a506b..afe38283 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go @@ -24,7 +24,7 @@ package v1 import ( "time" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go similarity index 95% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go index 7de14e72..10caf239 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go similarity index 70% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go index 92909fe2..211c3d19 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -42,20 +42,20 @@ var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault. var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *keyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &keyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*keyvaultv1.AzureKeyVaultSecret), err + return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *keyvaultv1.AzureKeyVaultSecretList, err error) { +func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *azurekeyvaultv1.AzureKeyVaultSecretList, err error) { obj, err := c.Fake. - Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &keyvaultv1.AzureKeyVaultSecretList{}) + Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &azurekeyvaultv1.AzureKeyVaultSecretList{}) if obj == nil { return nil, err @@ -65,8 +65,8 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *keyvaultv1 if label == nil { label = labels.Everything() } - list := &keyvaultv1.AzureKeyVaultSecretList{ListMeta: obj.(*keyvaultv1.AzureKeyVaultSecretList).ListMeta} - for _, item := range obj.(*keyvaultv1.AzureKeyVaultSecretList).Items { + list := &azurekeyvaultv1.AzureKeyVaultSecretList{ListMeta: obj.(*azurekeyvaultv1.AzureKeyVaultSecretList).ListMeta} + for _, item := range obj.(*azurekeyvaultv1.AzureKeyVaultSecretList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) } @@ -82,43 +82,43 @@ func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *keyvaultv1.AzureKeyVaultSecret) (result *keyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &keyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*keyvaultv1.AzureKeyVaultSecret), err + return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *keyvaultv1.AzureKeyVaultSecret) (result *keyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &keyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*keyvaultv1.AzureKeyVaultSecret), err + return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *keyvaultv1.AzureKeyVaultSecret) (*keyvaultv1.AzureKeyVaultSecret, error) { +func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (*azurekeyvaultv1.AzureKeyVaultSecret, error) { obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &keyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*keyvaultv1.AzureKeyVaultSecret), err + return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &keyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{}) return err } @@ -127,17 +127,17 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions) - _, err := c.Fake.Invokes(action, &keyvaultv1.AzureKeyVaultSecretList{}) + _, err := c.Fake.Invokes(action, &azurekeyvaultv1.AzureKeyVaultSecretList{}) return err } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *keyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &keyvaultv1.AzureKeyVaultSecret{}) + Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &azurekeyvaultv1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*keyvaultv1.AzureKeyVaultSecret), err + return obj.(*azurekeyvaultv1.AzureKeyVaultSecret), err } diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1/generated_expansion.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/generated_expansion.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go similarity index 98% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go index c003fe4a..481349ac 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package v1alpha1 import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go index 611b386f..aee669ed 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go @@ -24,7 +24,7 @@ package v1alpha1 import ( "time" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go similarity index 94% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go index d9af251f..a0ab7e42 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go index 12932503..43eaea37 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v1alpha1/generated_expansion.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/generated_expansion.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go similarity index 98% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go index 95d9c7e4..9d7bd2ce 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package v2alpha1 import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go index e1fd9f19..ebdae956 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go @@ -24,7 +24,7 @@ package v2alpha1 import ( "time" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go similarity index 94% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go index ba068c4e..27d829fd 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_keyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go index f83af7db..f21962bf 100644 --- a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" diff --git a/pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/keyvault/v2alpha1/generated_expansion.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go diff --git a/pkg/k8s/client/informers/externalversions/keyvault/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go similarity index 91% rename from pkg/k8s/client/informers/externalversions/keyvault/interface.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go index b073670c..033b8f9b 100644 --- a/pkg/k8s/client/informers/externalversions/keyvault/interface.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go @@ -19,13 +19,13 @@ limitations under the License. // Code generated by informer-gen. DO NOT EDIT. -package keyvault +package azurekeyvault import ( + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault/v1" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1" ) // Interface provides access to each of this group's versions. diff --git a/pkg/k8s/client/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go similarity index 93% rename from pkg/k8s/client/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go index 1488d4db..fb20bd13 100644 --- a/pkg/k8s/client/informers/externalversions/keyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go @@ -24,10 +24,10 @@ package v1 import ( time "time" - keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -73,7 +73,7 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).Watch(options) }, }, - &keyvaultv1.AzureKeyVaultSecret{}, + &azurekeyvaultv1.AzureKeyVaultSecret{}, resyncPeriod, indexers, ) @@ -84,7 +84,7 @@ func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface } func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&keyvaultv1.AzureKeyVaultSecret{}, f.defaultInformer) + return f.factory.InformerFor(&azurekeyvaultv1.AzureKeyVaultSecret{}, f.defaultInformer) } func (f *azureKeyVaultSecretInformer) Lister() v1.AzureKeyVaultSecretLister { diff --git a/pkg/k8s/client/informers/externalversions/keyvault/v1/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/interface.go similarity index 100% rename from pkg/k8s/client/informers/externalversions/keyvault/v1/interface.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v1/interface.go diff --git a/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go similarity index 92% rename from pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go index 815f127c..630ff027 100644 --- a/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go @@ -24,10 +24,10 @@ package v1alpha1 import ( time "time" - keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -73,7 +73,7 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).Watch(options) }, }, - &keyvaultv1alpha1.AzureKeyVaultSecret{}, + &azurekeyvaultv1alpha1.AzureKeyVaultSecret{}, resyncPeriod, indexers, ) @@ -84,7 +84,7 @@ func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface } func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&keyvaultv1alpha1.AzureKeyVaultSecret{}, f.defaultInformer) + return f.factory.InformerFor(&azurekeyvaultv1alpha1.AzureKeyVaultSecret{}, f.defaultInformer) } func (f *azureKeyVaultSecretInformer) Lister() v1alpha1.AzureKeyVaultSecretLister { diff --git a/pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/interface.go similarity index 100% rename from pkg/k8s/client/informers/externalversions/keyvault/v1alpha1/interface.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/interface.go diff --git a/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go similarity index 92% rename from pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go index d78dcd1b..6066443d 100644 --- a/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go @@ -24,10 +24,10 @@ package v2alpha1 import ( time "time" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/keyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -73,7 +73,7 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac return client.KeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).Watch(options) }, }, - &keyvaultv2alpha1.AzureKeyVaultSecret{}, + &azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, resyncPeriod, indexers, ) @@ -84,7 +84,7 @@ func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface } func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&keyvaultv2alpha1.AzureKeyVaultSecret{}, f.defaultInformer) + return f.factory.InformerFor(&azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, f.defaultInformer) } func (f *azureKeyVaultSecretInformer) Lister() v2alpha1.AzureKeyVaultSecretLister { diff --git a/pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go similarity index 100% rename from pkg/k8s/client/informers/externalversions/keyvault/v2alpha1/interface.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go diff --git a/pkg/k8s/client/informers/externalversions/factory.go b/pkg/k8s/client/informers/externalversions/factory.go index 5416145e..9db19d8f 100644 --- a/pkg/k8s/client/informers/externalversions/factory.go +++ b/pkg/k8s/client/informers/externalversions/factory.go @@ -27,8 +27,8 @@ import ( time "time" versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" + azurekeyvault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - keyvault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/keyvault" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -175,9 +175,9 @@ type SharedInformerFactory interface { ForResource(resource schema.GroupVersionResource) (GenericInformer, error) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool - Keyvault() keyvault.Interface + Keyvault() azurekeyvault.Interface } -func (f *sharedInformerFactory) Keyvault() keyvault.Interface { - return keyvault.New(f, f.namespace, f.tweakListOptions) +func (f *sharedInformerFactory) Keyvault() azurekeyvault.Interface { + return azurekeyvault.New(f, f.namespace, f.tweakListOptions) } diff --git a/pkg/k8s/client/informers/externalversions/generic.go b/pkg/k8s/client/informers/externalversions/generic.go index 36a61471..c0ab7b44 100644 --- a/pkg/k8s/client/informers/externalversions/generic.go +++ b/pkg/k8s/client/informers/externalversions/generic.go @@ -24,9 +24,9 @@ package externalversions import ( "fmt" - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" ) diff --git a/pkg/k8s/client/listers/keyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go similarity index 99% rename from pkg/k8s/client/listers/keyvault/v1/azurekeyvaultsecret.go rename to pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go index f1eedcef..848565f8 100644 --- a/pkg/k8s/client/listers/keyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package v1 import ( - v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1" + v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/listers/keyvault/v1/expansion_generated.go b/pkg/k8s/client/listers/azurekeyvault/v1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/listers/keyvault/v1/expansion_generated.go rename to pkg/k8s/client/listers/azurekeyvault/v1/expansion_generated.go diff --git a/pkg/k8s/client/listers/keyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go similarity index 98% rename from pkg/k8s/client/listers/keyvault/v1alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go index 46e567a4..7a96f389 100644 --- a/pkg/k8s/client/listers/keyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package v1alpha1 import ( - v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v1alpha1" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/listers/keyvault/v1alpha1/expansion_generated.go b/pkg/k8s/client/listers/azurekeyvault/v1alpha1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/listers/keyvault/v1alpha1/expansion_generated.go rename to pkg/k8s/client/listers/azurekeyvault/v1alpha1/expansion_generated.go diff --git a/pkg/k8s/client/listers/keyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go similarity index 98% rename from pkg/k8s/client/listers/keyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go index 67bf5499..60cd19e3 100644 --- a/pkg/k8s/client/listers/keyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package v2alpha1 import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/k8s/client/listers/keyvault/v2alpha1/expansion_generated.go b/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go similarity index 100% rename from pkg/k8s/client/listers/keyvault/v2alpha1/expansion_generated.go rename to pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go From 0f17b57ec0a74c6acad796a0906660e45300070f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 10 Oct 2020 22:48:42 +0200 Subject: [PATCH 175/251] fix imports of akv in tests --- cmd/azure-keyvault-controller/controller/secret_handler_test.go | 2 +- pkg/akv2k8s/transformers/handler_test.go | 2 +- pkg/azure/keyvault/client/azure_keyvault_service_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go index 5906f3b3..bb9ee362 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go @@ -22,7 +22,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/pkg/akv2k8s/transformers/handler_test.go b/pkg/akv2k8s/transformers/handler_test.go index 707e03ed..da8749bc 100644 --- a/pkg/akv2k8s/transformers/handler_test.go +++ b/pkg/akv2k8s/transformers/handler_test.go @@ -19,7 +19,7 @@ package transformers import ( "testing" - akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" ) const ( diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go index 60a83742..e68e7e6e 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service_test.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go @@ -8,7 +8,7 @@ import ( akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing" auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azure/keyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) From 77772df023aefeeca5553bb5454d492807c27e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 09:03:08 +0200 Subject: [PATCH 176/251] controller: enable namespace watcher for ca bundle --- cmd/azure-keyvault-controller/controller/controller.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 38340229..406ddf01 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -185,6 +185,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI log.Info("Setting up event handlers") controller.initAzureKeyVaultSecret() controller.initSecret() + controller.initNamespace() return controller } From 950300ad8d8f126ab3e3fbdd48eae6e6ce707b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 09:27:42 +0200 Subject: [PATCH 177/251] controller: improve logging for ca bundle namespace handler --- cmd/azure-keyvault-controller/controller/namespace.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/azure-keyvault-controller/controller/namespace.go b/cmd/azure-keyvault-controller/controller/namespace.go index 1e7cc20e..8e95d017 100644 --- a/cmd/azure-keyvault-controller/controller/namespace.go +++ b/cmd/azure-keyvault-controller/controller/namespace.go @@ -94,11 +94,13 @@ func (c *Controller) syncNamespace(key string) error { if errors.IsNotFound(err) { // if configmap does not exist, create it log.Infof("configmap '%s' not found in labelled namespace '%s' - creating now", c.caBundleConfigMapName, key) + log.Debugf("getting secret %s with ca bundle in namespace %s", c.caBundleSecretName, c.caBundleSecretNamespaceName) secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) if err != nil { return err } + log.Debugf("creating new configmap %s with ca bundle in namespace %s", c.caBundleConfigMapName, c.caBundleSecretNamespaceName) newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { From 3af1a8238b5dc341bf609d1c251c85edc4d7783f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 09:44:15 +0200 Subject: [PATCH 178/251] controller: report error if ca.crt not found in secret for ca bundle --- .../controller/caBundle.go | 22 ++++++++++++++----- .../controller/namespace.go | 14 +++++++++--- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/caBundle.go b/cmd/azure-keyvault-controller/controller/caBundle.go index 56690fe0..c550ef06 100644 --- a/cmd/azure-keyvault-controller/controller/caBundle.go +++ b/cmd/azure-keyvault-controller/controller/caBundle.go @@ -70,7 +70,11 @@ func (c *Controller) syncCABundleSecret(key string) error { // If the resource doesn't exist, we'll create it if errors.IsNotFound(err) { log.Infof("configmap '%s' not found in labelled namespace '%s' - creating configmap now", c.caBundleConfigMapName, ns.Name) - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + if err != nil { + log.Errorf("failed to create new configmap, error: %+v", err) + } + configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { msg := fmt.Sprintf("failed to create configmap %s in namespace %s", newConfigMap.Name, ns.Name) @@ -100,7 +104,11 @@ func (c *Controller) syncCABundleSecret(key string) error { // should update the ConfigMap resource. if configMap.Data["caCert"] != secret.StringData["caCert"] { log.Infof("secret %s updated: updating config map: %s", secret.Name, configMap.Name) - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + if err != nil { + log.Errorf("failed to create new configmap, error: %+v", err) + } + configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) if err != nil { @@ -123,8 +131,12 @@ func (c *Controller) syncCABundleSecret(key string) error { return nil } -func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigMap { - dataByte := secret.Data["ca.crt"] +func newConfigMap(name string, ns string, secret *corev1.Secret) (*corev1.ConfigMap, error) { + dataByte, found := secret.Data["ca.crt"] + if !found { + return nil, fmt.Errorf("key ca.crt not found in secret %s/%s", secret.Namespace, secret.Name) + } + return &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -140,5 +152,5 @@ func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigM Data: map[string]string{ "caCert": string(dataByte), }, - } + }, nil } diff --git a/cmd/azure-keyvault-controller/controller/namespace.go b/cmd/azure-keyvault-controller/controller/namespace.go index 8e95d017..a9128d56 100644 --- a/cmd/azure-keyvault-controller/controller/namespace.go +++ b/cmd/azure-keyvault-controller/controller/namespace.go @@ -100,8 +100,12 @@ func (c *Controller) syncNamespace(key string) error { return err } - log.Debugf("creating new configmap %s with ca bundle in namespace %s", c.caBundleConfigMapName, c.caBundleSecretNamespaceName) - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + log.Debugf("creating new configmap %s with ca bundle in namespace %s", c.caBundleConfigMapName, ns.Name) + newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + if err != nil { + log.Errorf("failed to create new configmap, error: %+v", err) + } + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { return err @@ -127,7 +131,11 @@ func (c *Controller) syncNamespace(key string) error { if found && secretCaBundle != cmCaBundle { log.Infof("configmap '%s' exists in namespace '%s' with old ca bundle - updating now", c.caBundleConfigMapName, key) - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + if err != nil { + log.Errorf("failed to create new configmap, error: %+v", err) + } + _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) if err != nil { return err From fc4559910638c07e04c9efefc4147c91d715cc69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 09:46:28 +0200 Subject: [PATCH 179/251] controller: validate that ca bundle secret key for ca.crt has data --- cmd/azure-keyvault-controller/controller/caBundle.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/azure-keyvault-controller/controller/caBundle.go b/cmd/azure-keyvault-controller/controller/caBundle.go index c550ef06..25d63192 100644 --- a/cmd/azure-keyvault-controller/controller/caBundle.go +++ b/cmd/azure-keyvault-controller/controller/caBundle.go @@ -137,6 +137,10 @@ func newConfigMap(name string, ns string, secret *corev1.Secret) (*corev1.Config return nil, fmt.Errorf("key ca.crt not found in secret %s/%s", secret.Namespace, secret.Name) } + if len(dataByte) == 0 { + return nil, fmt.Errorf("key ca.crt exists in secret %s/%s, but it's empty", secret.Namespace, secret.Name) + } + return &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: name, From 42693c6e1da60cce7fe9d8a21bba31c2b7bdd618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 10:05:57 +0200 Subject: [PATCH 180/251] controller: fix issue where event recorder fails --- cmd/azure-keyvault-controller/controller/namespace.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/namespace.go b/cmd/azure-keyvault-controller/controller/namespace.go index a9128d56..f7147e63 100644 --- a/cmd/azure-keyvault-controller/controller/namespace.go +++ b/cmd/azure-keyvault-controller/controller/namespace.go @@ -106,10 +106,11 @@ func (c *Controller) syncNamespace(key string) error { log.Errorf("failed to create new configmap, error: %+v", err) } - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) + cm, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) if err != nil { return err } + msg := fmt.Sprintf("CA Bundle successfully synced to ConfigMap %s in namespace %s", c.caBundleConfigMapName, key) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) return nil From 8f129582468bf79caf3aaefc94b1c5e337aa026f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 14:40:43 +0200 Subject: [PATCH 181/251] controller: handle when ca bundle configmap gets deleted --- .../controller/caBundle.go | 160 ------------------ .../controller/caBundleConfigMap.go | 102 +++++++++++ .../{namespace.go => caBundleNamespace.go} | 35 ++-- .../controller/caBundleSecret.go | 87 ++++++++++ .../controller/controller.go | 27 +-- 5 files changed, 229 insertions(+), 182 deletions(-) delete mode 100644 cmd/azure-keyvault-controller/controller/caBundle.go create mode 100644 cmd/azure-keyvault-controller/controller/caBundleConfigMap.go rename cmd/azure-keyvault-controller/controller/{namespace.go => caBundleNamespace.go} (79%) create mode 100644 cmd/azure-keyvault-controller/controller/caBundleSecret.go diff --git a/cmd/azure-keyvault-controller/controller/caBundle.go b/cmd/azure-keyvault-controller/controller/caBundle.go deleted file mode 100644 index 25d63192..00000000 --- a/cmd/azure-keyvault-controller/controller/caBundle.go +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "fmt" - - log "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/client-go/tools/cache" -) - -func (c *Controller) syncCABundleSecret(key string) error { - /* - 1. Get Secret - 2. Get all akv2k8s-injector enabled namespaces - 3. Create ConfigMaps containing CA cert in namespaces - */ - - // Convert the namespace/name string into a distinct namespace and name - namespace, name, err := cache.SplitMetaNamespaceKey(key) - if err != nil { - utilruntime.HandleError(fmt.Errorf("invalid resource key: %s", key)) - return nil - } - - log.Debugf("pulling secret '%s' from namespace '%s'", name, namespace) - - // Get the Secret resource with this namespace/name - secret, err := c.secretsLister.Secrets(namespace).Get(name) - if err != nil { - // The Secret resource may no longer exist, in which case we stop - // processing. - if errors.IsNotFound(err) { - utilruntime.HandleError(fmt.Errorf("secret '%s' in work queue no longer exists", key)) - return nil - } - - return err - } - - labelledNamespaces, err := c.getAllAkvsLabelledNamespaces() - - log.Debugf("looping all labelled namespaces looking for config map '%s' to update", c.caBundleConfigMapName) - - for _, ns := range labelledNamespaces { - configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) - - // If the resource doesn't exist, we'll create it - if errors.IsNotFound(err) { - log.Infof("configmap '%s' not found in labelled namespace '%s' - creating configmap now", c.caBundleConfigMapName, ns.Name) - newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - if err != nil { - log.Errorf("failed to create new configmap, error: %+v", err) - } - - configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) - if err != nil { - msg := fmt.Sprintf("failed to create configmap %s in namespace %s", newConfigMap.Name, ns.Name) - c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) - log.Errorf("%s, error: %+v", msg, err) - return err - } - return nil - } - - // If an error occurs during Get/Create, we'll requeue the item so we can - // attempt processing again later. This could have been caused by a - // temporary network failure, or any other transient reason. - if err != nil { - return err - } - - // If the ConfigMap is not controlled by this Secret resource, we should log - // a warning to the event recorder and return error msg. - if !metav1.IsControlledBy(configMap, secret) { - msg := fmt.Sprintf(MessageResourceExists, configMap.Name) - c.recorder.Event(secret, corev1.EventTypeWarning, ErrResourceExists, msg) - return fmt.Errorf(msg) - } - - // If CA cert in ConfigMap resource is not the same as in Secret resource, we - // should update the ConfigMap resource. - if configMap.Data["caCert"] != secret.StringData["caCert"] { - log.Infof("secret %s updated: updating config map: %s", secret.Name, configMap.Name) - newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - if err != nil { - log.Errorf("failed to create new configmap, error: %+v", err) - } - - configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) - - if err != nil { - msg := fmt.Sprintf("failed to update configmap %s in namespace %s", newConfigMap.Name, ns.Name) - c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) - log.Errorf("%s, error: %+v", msg, err) - return err - } - } - - // If an error occurs during Update, we'll requeue the item so we can - // attempt processing again later. This could have been caused by a - // temporary network failure, or any other transient reason. - if err != nil { - return err - } - } - - c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, "CA Bundle successfully synced to to ConfigMap") - return nil -} - -func newConfigMap(name string, ns string, secret *corev1.Secret) (*corev1.ConfigMap, error) { - dataByte, found := secret.Data["ca.crt"] - if !found { - return nil, fmt.Errorf("key ca.crt not found in secret %s/%s", secret.Namespace, secret.Name) - } - - if len(dataByte) == 0 { - return nil, fmt.Errorf("key ca.crt exists in secret %s/%s, but it's empty", secret.Namespace, secret.Name) - } - - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: ns, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(secret, schema.GroupVersionKind{ - Group: corev1.SchemeGroupVersion.Group, - Version: corev1.SchemeGroupVersion.Version, - Kind: "Secret", - }), - }, - }, - Data: map[string]string{ - "caCert": string(dataByte), - }, - }, nil -} diff --git a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go new file mode 100644 index 00000000..e109845e --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go @@ -0,0 +1,102 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "fmt" + + log "github.com/sirupsen/logrus" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/tools/cache" + "kmodules.xyz/client-go/tools/queue" +) + +func (c *Controller) initConfigMap() { + c.kubeInformerFactory.Core().V1().Namespaces().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + DeleteFunc: func(obj interface{}) { + cm, err := convertToConfigMap(obj) + if err != nil { + log.Errorf("failed to convert to configmap: %v", err) + } + + if c.isCABundleConfigMap(cm) { + queue.Enqueue(c.caBundleConigMapQueue.GetQueue(), cm) + return + } + }, + }) +} + +func (c *Controller) syncCABundleConfigMap(key string) error { + cm, err := c.getConfigMap(key) + if err != nil { + return err + } + + if ownerRef := metav1.GetControllerOf(cm); ownerRef != nil { + secret, err := c.getSecretFromConfigMap(cm, ownerRef) + if err != nil { + return err + } + + queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) + } + return nil +} + +func (c *Controller) getSecretFromConfigMap(cm *corev1.ConfigMap, owner *metav1.OwnerReference) (*corev1.Secret, error) { + return c.secretsLister.Secrets(c.caBundleSecretNamespaceName).Get(owner.Name) +} + +func (c *Controller) isCABundleConfigMap(cm *corev1.ConfigMap) bool { + return cm.Name == c.caBundleConfigMapName +} + +func (c *Controller) getConfigMap(key string) (*corev1.ConfigMap, error) { + namespace, name, err := cache.SplitMetaNamespaceKey(key) + if err != nil { + return nil, fmt.Errorf("invalid resource key: %s", key) + } + + log.Debugf("getting configmap %s from namespace %s", name, namespace) + cm, err := c.configMapLister.ConfigMaps(namespace).Get(name) + + if err != nil { + return nil, err + } + return cm, err +} + +func convertToConfigMap(obj interface{}) (*corev1.ConfigMap, error) { + cm, ok := obj.(*corev1.ConfigMap) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) + } + cm, ok = tombstone.Obj.(*corev1.ConfigMap) + if !ok { + return nil, fmt.Errorf("tombstone contained object that is not a configmap %#v", obj) + } + } + return cm, nil +} diff --git a/cmd/azure-keyvault-controller/controller/namespace.go b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go similarity index 79% rename from cmd/azure-keyvault-controller/controller/namespace.go rename to cmd/azure-keyvault-controller/controller/caBundleNamespace.go index f7147e63..10268e2b 100644 --- a/cmd/azure-keyvault-controller/controller/namespace.go +++ b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go @@ -69,7 +69,7 @@ func (c *Controller) initNamespace() { }) } -func (c *Controller) syncNamespace(key string) error { +func (c *Controller) syncCABundleInNamespace(key string) error { ns, err := c.namespaceLister.Get(key) if err != nil { return err @@ -80,19 +80,22 @@ func (c *Controller) syncNamespace(key string) error { //If this is a non-labelled namespace, we delete ca bundle config map if !c.isInjectorEnabledForNamespace(ns) && cm != nil { - log.Infof("configmap '%s' exists in namespace '%s' which is no longer labelled to keep CA Bundle - deleting now", c.caBundleConfigMapName, key) + log.Infof("configmap '%s' exists in namespace '%s', but is no longer labelled to keep CA Bundle - deleting now", c.caBundleConfigMapName, key) err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) if err != nil { return err } - msg := fmt.Sprintf("CA Bundle successfully deleted ConfigMap %s in namespace %s", c.caBundleConfigMapName, key) + + log.Infof("successfully deleted configmap %s with ca bundle in namespace %s", c.caBundleConfigMapName, key) + + msg := fmt.Sprintf("%s successfully deleted ConfigMap %s with CA Bundle", ControllerName, c.caBundleConfigMapName) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) return nil } if err != nil { if errors.IsNotFound(err) { // if configmap does not exist, create it - log.Infof("configmap '%s' not found in labelled namespace '%s' - creating now", c.caBundleConfigMapName, key) + log.Infof("configmap '%s' with ca bundle not found in labelled namespace '%s' - creating now", c.caBundleConfigMapName, key) log.Debugf("getting secret %s with ca bundle in namespace %s", c.caBundleSecretName, c.caBundleSecretNamespaceName) secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) @@ -111,7 +114,9 @@ func (c *Controller) syncNamespace(key string) error { return err } - msg := fmt.Sprintf("CA Bundle successfully synced to ConfigMap %s in namespace %s", c.caBundleConfigMapName, key) + log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundleConfigMapName, key) + + msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s ", ControllerName, c.caBundleConfigMapName) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) return nil } @@ -125,23 +130,29 @@ func (c *Controller) syncNamespace(key string) error { return err } - dataByte := secret.Data["ca.crt"] - secretCaBundle := string(dataByte) - cmCaBundle, found := cm.Data["ca.crt"] + secretCABundle, err := getCABundleFromSecret(secret) + if err != nil { + return err + } + + cmCABundle := getCABundleFromConfigMap(cm) - if found && secretCaBundle != cmCaBundle { - log.Infof("configmap '%s' exists in namespace '%s' with old ca bundle - updating now", c.caBundleConfigMapName, key) + if secretCABundle != cmCABundle { + log.Infof("configmap '%s' with ca bundle exists in namespace '%s' with old ca bundle - updating now", c.caBundleConfigMapName, key) newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) if err != nil { log.Errorf("failed to create new configmap, error: %+v", err) } - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) + cm, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) if err != nil { return err } - msg := fmt.Sprintf("CA Bundle successfully synced to ConfigMap %s in namespace %s", c.caBundleConfigMapName, key) + + log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundleConfigMapName, key) + + msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s", ControllerName, c.caBundleConfigMapName) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) } diff --git a/cmd/azure-keyvault-controller/controller/caBundleSecret.go b/cmd/azure-keyvault-controller/controller/caBundleSecret.go new file mode 100644 index 00000000..ef0d04b6 --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/caBundleSecret.go @@ -0,0 +1,87 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "fmt" + + log "github.com/sirupsen/logrus" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func (c *Controller) syncCABundleSecret(key string) error { + labelledNamespaces, err := c.getAllAkvsLabelledNamespaces() + if err != nil { + return err + } + + log.Debugf("looping all labelled namespaces looking for ca bundle configmap '%s' to update", c.caBundleConfigMapName) + + for _, ns := range labelledNamespaces { + if err := c.syncCABundleInNamespace(ns.Name); err != nil { + return err + } + } + return nil +} + +func getCABundleFromSecret(secret *corev1.Secret) (string, error) { + dataByte, found := secret.Data["ca.crt"] + if !found { + return "", fmt.Errorf("did not find key ca.crt in secret %s", secret.Name) + } + + caBundle := string(dataByte) + if caBundle == "" { + return "", fmt.Errorf("did find key ca.crt in secret %s, but no data was found", secret.Name) + } + + return caBundle, nil +} + +func getCABundleFromConfigMap(cm *corev1.ConfigMap) string { + return cm.Data["caCert"] +} + +func newConfigMap(name string, ns string, secret *corev1.Secret) (*corev1.ConfigMap, error) { + caCert, err := getCABundleFromSecret(secret) + if err != nil { + return nil, err + } + + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: ns, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(secret, schema.GroupVersionKind{ + Group: corev1.SchemeGroupVersion.Group, + Version: corev1.SchemeGroupVersion.Version, + Kind: "Secret", + }), + }, + }, + Data: map[string]string{ + "caCert": caCert, + }, + }, nil +} diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 406ddf01..992c9a2d 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -72,6 +72,8 @@ const ( // MessageAzureKeyVaultSecretSyncedWithAzureKeyVault is the message used for an Event fired when a AzureKeyVaultSecret // is synced successfully after getting updated secret from Azure Key Vault MessageAzureKeyVaultSecretSyncedWithAzureKeyVault = "AzureKeyVaultSecret synced to Kubernetes Secret successfully with change from Azure Key Vault" + + ControllerName = "Akv2k8s controller" ) // Controller is the controller implementation for AzureKeyVaultSecret resources @@ -104,8 +106,8 @@ type Controller struct { namespaceQueue *queue.Worker // ConfigMap - configMapLister corelisters.ConfigMapLister - configMapQueue *queue.Worker + configMapLister corelisters.ConfigMapLister + caBundleConigMapQueue *queue.Worker options *Options clock Timer @@ -180,12 +182,14 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI controller.akvsSecretQueue = queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, controller.syncSecret) controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) controller.caBundleSecretQueue = queue.New("CABundleSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleSecret) - controller.namespaceQueue = queue.New("Namespaces", options.MaxNumRequeues, options.NumThreads, controller.syncNamespace) + controller.namespaceQueue = queue.New("Namespaces", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleInNamespace) + controller.caBundleConigMapQueue = queue.New("CABundleConfigs", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleConfigMap) log.Info("Setting up event handlers") controller.initAzureKeyVaultSecret() controller.initSecret() controller.initNamespace() + controller.initConfigMap() return controller } @@ -213,22 +217,25 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } } - log.Info("Starting Azure Key Vault Secret queue") + log.Info("starting azure key vault secret queue") c.akvsCrdQueue.Run(stopCh) - log.Info("Starting Secret queue for Azure Key Vault Secrets") + log.Info("starting secret queue for azure key vault secrets") c.akvsSecretQueue.Run(stopCh) - log.Info("Starting Azure Key Vault queue") + log.Info("starting azure key vault queue") c.azureKeyVaultQueue.Run(stopCh) - log.Info("Starting Namespace queue") + log.Info("starting ca bundle secret queue") + c.caBundleSecretQueue.Run(stopCh) + + log.Info("starting ca bundle namespace queue") c.namespaceQueue.Run(stopCh) - log.Info("Starting CA Bundle queue") - c.caBundleSecretQueue.Run(stopCh) + log.Info("starting ca bundle configmap queue") + c.caBundleConigMapQueue.Run(stopCh) - log.Info("Started workers") + log.Info("started workers") <-stopCh log.Info("Shutting down workers") } From 99da54f0a9f498399c7c262b90e844458166d116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 14:54:59 +0200 Subject: [PATCH 182/251] controller: fix informer for ca bundle config map to, yea.... configmap --- cmd/azure-keyvault-controller/controller/caBundleConfigMap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go index e109845e..f76602b3 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go +++ b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go @@ -31,7 +31,7 @@ import ( ) func (c *Controller) initConfigMap() { - c.kubeInformerFactory.Core().V1().Namespaces().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + c.kubeInformerFactory.Core().V1().ConfigMaps().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ DeleteFunc: func(obj interface{}) { cm, err := convertToConfigMap(obj) if err != nil { From f0244a598bd46867b1dbdc3dfb9f8ec9c4321a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 15:11:45 +0200 Subject: [PATCH 183/251] controller: restructure event handler for configmap deletion to just add to ca bundle secret queue --- .../controller/caBundleConfigMap.go | 28 ++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go index f76602b3..8246e4f8 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go +++ b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go @@ -39,30 +39,20 @@ func (c *Controller) initConfigMap() { } if c.isCABundleConfigMap(cm) { - queue.Enqueue(c.caBundleConigMapQueue.GetQueue(), cm) - return + if ownerRef := metav1.GetControllerOf(cm); ownerRef != nil { + secret, err := c.getSecretFromConfigMap(cm, ownerRef) + if err != nil { + log.Errorf("failed to get secret owner %s/%s of configmap %s/%s, error: %+v", secret.Namespace, secret.Name, cm.Namespace, cm.Name, err) + return + } + + queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) + } } }, }) } -func (c *Controller) syncCABundleConfigMap(key string) error { - cm, err := c.getConfigMap(key) - if err != nil { - return err - } - - if ownerRef := metav1.GetControllerOf(cm); ownerRef != nil { - secret, err := c.getSecretFromConfigMap(cm, ownerRef) - if err != nil { - return err - } - - queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) - } - return nil -} - func (c *Controller) getSecretFromConfigMap(cm *corev1.ConfigMap, owner *metav1.OwnerReference) (*corev1.Secret, error) { return c.secretsLister.Secrets(c.caBundleSecretNamespaceName).Get(owner.Name) } From 35ab12d44adda64068e386538e6754c91b3b2acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 15:13:32 +0200 Subject: [PATCH 184/251] controller: removed unused queue for ca bundle configmap --- cmd/azure-keyvault-controller/controller/controller.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 992c9a2d..c3686585 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -106,8 +106,7 @@ type Controller struct { namespaceQueue *queue.Worker // ConfigMap - configMapLister corelisters.ConfigMapLister - caBundleConigMapQueue *queue.Worker + configMapLister corelisters.ConfigMapLister options *Options clock Timer @@ -183,7 +182,6 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) controller.caBundleSecretQueue = queue.New("CABundleSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleSecret) controller.namespaceQueue = queue.New("Namespaces", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleInNamespace) - controller.caBundleConigMapQueue = queue.New("CABundleConfigs", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleConfigMap) log.Info("Setting up event handlers") controller.initAzureKeyVaultSecret() @@ -232,9 +230,6 @@ func (c *Controller) Run(stopCh <-chan struct{}) { log.Info("starting ca bundle namespace queue") c.namespaceQueue.Run(stopCh) - log.Info("starting ca bundle configmap queue") - c.caBundleConigMapQueue.Run(stopCh) - log.Info("started workers") <-stopCh log.Info("Shutting down workers") From 26b88e2ba6e2a7b20848131eaae4905618b09887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 15:30:44 +0200 Subject: [PATCH 185/251] controller: instead of adding deleted cm to secrets queue, add it to namespace queue to force re-creation --- .../controller/caBundleConfigMap.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go index 8246e4f8..8c99916a 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go +++ b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go @@ -25,7 +25,6 @@ import ( log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/cache" "kmodules.xyz/client-go/tools/queue" ) @@ -39,22 +38,20 @@ func (c *Controller) initConfigMap() { } if c.isCABundleConfigMap(cm) { - if ownerRef := metav1.GetControllerOf(cm); ownerRef != nil { - secret, err := c.getSecretFromConfigMap(cm, ownerRef) - if err != nil { - log.Errorf("failed to get secret owner %s/%s of configmap %s/%s, error: %+v", secret.Namespace, secret.Name, cm.Namespace, cm.Name, err) - return - } - - queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) + ns, err := c.getCABundleNamespace() + if err != nil { + log.Errorf("failed to get namespace %s to replace deleted configmap %s/%s, error: %+v", c.caBundleSecretNamespaceName, cm.Namespace, cm.Name, err) + return } + + queue.Enqueue(c.namespaceQueue.GetQueue(), ns) } }, }) } -func (c *Controller) getSecretFromConfigMap(cm *corev1.ConfigMap, owner *metav1.OwnerReference) (*corev1.Secret, error) { - return c.secretsLister.Secrets(c.caBundleSecretNamespaceName).Get(owner.Name) +func (c *Controller) getCABundleNamespace() (*corev1.Namespace, error) { + return c.namespaceLister.Get(c.caBundleSecretNamespaceName) } func (c *Controller) isCABundleConfigMap(cm *corev1.ConfigMap) bool { From 1a70ba1e1b49c2197ea417caa767ed0c4153114d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 15:47:55 +0200 Subject: [PATCH 186/251] controller: add configmap namespace to namespace queue and not ca bundle secret namespace --- .../controller/caBundleConfigMap.go | 8 ++++---- .../controller/caBundleNamespace.go | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go index 8c99916a..fa4bcb35 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go +++ b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go @@ -38,9 +38,9 @@ func (c *Controller) initConfigMap() { } if c.isCABundleConfigMap(cm) { - ns, err := c.getCABundleNamespace() + ns, err := c.getNamespaceFromConfigMap(cm) if err != nil { - log.Errorf("failed to get namespace %s to replace deleted configmap %s/%s, error: %+v", c.caBundleSecretNamespaceName, cm.Namespace, cm.Name, err) + log.Errorf("failed to get namespace %s to replace deleted configmap %s/%s, error: %+v", cm.Namespace, cm.Namespace, cm.Name, err) return } @@ -50,8 +50,8 @@ func (c *Controller) initConfigMap() { }) } -func (c *Controller) getCABundleNamespace() (*corev1.Namespace, error) { - return c.namespaceLister.Get(c.caBundleSecretNamespaceName) +func (c *Controller) getNamespaceFromConfigMap(cm *corev1.ConfigMap) (*corev1.Namespace, error) { + return c.namespaceLister.Get(cm.Namespace) } func (c *Controller) isCABundleConfigMap(cm *corev1.ConfigMap) bool { diff --git a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go index 10268e2b..33d3c5cd 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go +++ b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go @@ -75,11 +75,16 @@ func (c *Controller) syncCABundleInNamespace(key string) error { return err } - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) - cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + isLabelled := c.isInjectorEnabledForNamespace(ns) + + if !isLabelled { + log.Debugf("Looking for configmap '%s' in non labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) + cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + + if err != nil { + return nil // ignore if not found in non-labelled namespace + } - //If this is a non-labelled namespace, we delete ca bundle config map - if !c.isInjectorEnabledForNamespace(ns) && cm != nil { log.Infof("configmap '%s' exists in namespace '%s', but is no longer labelled to keep CA Bundle - deleting now", c.caBundleConfigMapName, key) err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) if err != nil { @@ -93,6 +98,9 @@ func (c *Controller) syncCABundleInNamespace(key string) error { return nil } + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) + cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + if err != nil { if errors.IsNotFound(err) { // if configmap does not exist, create it log.Infof("configmap '%s' with ca bundle not found in labelled namespace '%s' - creating now", c.caBundleConfigMapName, key) From cc1514625bf843b026de9d8c96f98adc1d129b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 22:09:04 +0200 Subject: [PATCH 187/251] Remove ca bundle injector as this is now part of the controller --- .../workflows/ca-bundle-controller-build.yaml | 47 -- .../ca-bundle-controller-release.yaml | 26 - Makefile | 58 +- cmd/ca-bundle-controller/main.go | 185 ----- .../controller/cabundleinjector/controller.go | 633 ------------------ .../cabundleinjector/controller_test.go | 332 --------- pkg/akv2k8s/controller/clock.go | 38 -- 7 files changed, 5 insertions(+), 1314 deletions(-) delete mode 100644 .github/workflows/ca-bundle-controller-build.yaml delete mode 100644 .github/workflows/ca-bundle-controller-release.yaml delete mode 100644 cmd/ca-bundle-controller/main.go delete mode 100644 pkg/akv2k8s/controller/cabundleinjector/controller.go delete mode 100644 pkg/akv2k8s/controller/cabundleinjector/controller_test.go delete mode 100644 pkg/akv2k8s/controller/clock.go diff --git a/.github/workflows/ca-bundle-controller-build.yaml b/.github/workflows/ca-bundle-controller-build.yaml deleted file mode 100644 index 5f12a107..00000000 --- a/.github/workflows/ca-bundle-controller-build.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: Build CA Bundle Controller - -on: - push: - branches: - - master - - '*-patch' - paths: - - '.github/workflows/ca-bundle-controller-build.yaml' - - '.github/actions/**' - - 'Dockerfile' - - 'Makefile' - - 'go.mod' - - 'go.sum' - - 'cmd/ca-bundle-controller/**' - - 'pkg/**' - - '!docs/**' - - '!crds/**' - -jobs: - build-deploy: - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@master - - - name: Setup Golang - uses: actions/setup-go@v1 - with: - go-version: '1.13.4' - - - name: Build - uses: ./.github/actions/build - env: - AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }} - AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }} - AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }} - AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }} - - with: - build-make-action: image-ca-bundle-controller - - - name: Push - uses: ./.github/actions/push - with: - push-make-action: push-ca-bundle-controller - docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }} - docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }} diff --git a/.github/workflows/ca-bundle-controller-release.yaml b/.github/workflows/ca-bundle-controller-release.yaml deleted file mode 100644 index c9ff3e00..00000000 --- a/.github/workflows/ca-bundle-controller-release.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Release CA Bundle Controller - -on: - push: - tags: - - 'ca-bundle-controller-[0-9]+.[0-9]+.[0-9]+**' - -jobs: - build-deploy: - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@master - - - name: Version - run: make print-v-ca-bundle-controller - - - name: Pull images from private repo - run: | - echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io - make pull-ca-bundle-controller - - - name: Push images to public repo - run: | - echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin - make release-ca-bundle-controller DOCKER_RELEASE_TAG=${GITHUB_REF##*/} - \ No newline at end of file diff --git a/Makefile b/Makefile index 09a5a8b3..3ab2d35c 100644 --- a/Makefile +++ b/Makefile @@ -11,14 +11,12 @@ KUBERNETES_DEP_VERSION=v0.17.2 WEBHOOK_BINARY_NAME=azure-keyvault-secrets-webhook CONTROLLER_BINARY_NAME=azure-keyvault-controller -CA_BUNDLE_CONTROLLER_BINARY_NAME=ca-bundle-controller KEYVAULT_ENV_BINARY_NAME=azure-keyvault-env DOCKER_INTERNAL_REG=dokken.azurecr.io DOCKER_RELEASE_REG=spvest DOCKER_CONTROLLER_IMAGE=azure-keyvault-controller -DOCKER_CA_BUNDLE_CONTROLLER_IMAGE=ca-bundle-controller DOCKER_WEBHOOK_IMAGE=azure-keyvault-webhook DOCKER_AUTH_SERVICE_IMAGE=azure-keyvault-auth-service DOCKER_VAULTENV_IMAGE=azure-keyvault-env @@ -29,7 +27,6 @@ DOCKER_RELEASE_TAG := $(shell git describe --tags) DOCKER_RELEASE_TAG_WEBHOOK := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"webhook-"/""/g) DOCKER_RELEASE_TAG_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"controller-"/""/g) DOCKER_RELEASE_TAG_VAULTENV := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"vaultenv-"/""/g) -DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"ca-bundle-controller-"/""/g) TAG= GOOS ?= linux @@ -92,12 +89,8 @@ print-v-controller: print-v-vaultenv: @echo $(DOCKER_RELEASE_TAG_VAULTENV) -.PHONY: print-v-ca-bundle-controller -print-v-ca-bundle-controller: - @echo $(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) - .PHONY: tag-all -tag-all: tag-webhook tag-controller tag-ca-bundle-controller tag-vaultenv +tag-all: tag-webhook tag-controller tag-vaultenv .PHONY: tag-crd tag-crd: check-tag @@ -114,11 +107,6 @@ tag-controller: check-tag git tag -a controller-$(TAG) -m "Controller version $(TAG)" git push --tags -.PHONY: tag-ca-bundle-controller -tag-ca-bundle-controller: check-tag - git tag -a ca-bundle-controller-$(TAG) -m "CA Bundle Controller version $(TAG)" - git push --tags - .PHONY: tag-vaultenv tag-vaultenv: check-tag git tag -a vaultenv-$(TAG) -m "Vaultenv version $(TAG)" @@ -190,17 +178,13 @@ clean-webhook: clean-controller: rm -rf bin/$(PROJECT_NAME)/$(CONTROLLER_BINARY_NAME) -.PHONY: ca-bundle-controller -clean-ca-bundle-controller: - rm -rf bin/$(PROJECT_NAME)/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) - .PHONY: clean-vaultenv clean-vaultenv: rm -rf bin/$(PROJECT_NAME)/$(KEYVAULT_ENV_BINARY_NAME) # build: build-controller build-ca-bundle-controller build-webhook build-vaultenv .PHONY: build -build: clean build-webhook build-controller build-vaultenv build-ca-bundle-controller +build: clean build-webhook build-controller build-vaultenv .PHONY: build-webhook build-webhook: clean-webhook @@ -210,10 +194,6 @@ build-webhook: clean-webhook build-controller: clean-controller CGO_ENABLED=0 COMPONENT=controller PKG_NAME=$(PACKAGE)/cmd/$(CONTROLLER_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(CONTROLLER_BINARY_NAME) -.PHONY: build-ca-bundle-controller -build-ca-bundle-controller: clean-ca-bundle-controller - CGO_ENABLED=0 COMPONENT=ca-bundle-controller PKG_NAME=$(PACKAGE)/cmd/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(CA_BUNDLE_CONTROLLER_BINARY_NAME) - .PHONY: build-vaultenv build-vaultenv: clean-vaultenv CGO_ENABLED=0 COMPONENT=vaultenv PKG_NAME=$(PACKAGE)/cmd/$(KEYVAULT_ENV_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(KEYVAULT_ENV_BINARY_NAME) @@ -245,18 +225,6 @@ image-controller: --build-arg VCS_URL=$(VCS_URL) \ -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) . -.PHONY: image-ca-bundle-controller -image-ca-bundle-controller: - DOCKER_BUILDKIT=1 docker build \ - --progress=plain \ - --target ca-bundle-controller \ - --build-arg BUILD_SUB_TARGET="-ca-bundle-controller" \ - --build-arg PACKAGE=$(PACKAGE) \ - --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \ - --build-arg BUILD_DATE=$(BUILD_DATE) \ - --build-arg VCS_URL=$(VCS_URL) \ - -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) . - .PHONY: image-vaultenv image-vaultenv: DOCKER_BUILDKIT=1 docker build \ @@ -277,16 +245,12 @@ image-akv2k8s-env-test: -f images/akv2k8s-test/Dockerfile . .PHONY: push -push: push-controller push-ca-bundle-controller push-webhook push-vaultenv +push: push-controller push-webhook push-vaultenv .PHONY: push-controller push-controller: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -.PHONY: push-ca-bundle-controller -push-ca-bundle-controller: - docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) - .PHONY: push-webhook push-webhook: docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) @@ -300,7 +264,7 @@ push-akv2k8s-env-test: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) .PHONY: pull-all -pull-all: pull-webhook pull-controller pull-ca-bundle-controller pull-vaultenv +pull-all: pull-webhook pull-controller pull-vaultenv .PHONY: pull-webhook pull-webhook: @@ -310,16 +274,12 @@ pull-webhook: pull-controller: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -.PHONY: pull-ca-bundle-controller -pull-ca-bundle-controller: - docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) - .PHONY: pull-vaultenv pull-vaultenv: docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) .PHONY: release -release: release-controller release-ca-bundle-controller release-webhook release-vaultenv +release: release-controller release-webhook release-vaultenv .PHONY: release-controller release-controller: @@ -329,14 +289,6 @@ release-controller: docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CONTROLLER) docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest -.PHONY: release-ca-bundle-controller -release-ca-bundle-controller: - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) - docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest - - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CA_BUNDLE_CONTROLLER) - docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CA_BUNDLE_CONTROLLER_IMAGE):latest - .PHONY: release-webhook release-webhook: docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK) diff --git a/cmd/ca-bundle-controller/main.go b/cmd/ca-bundle-controller/main.go deleted file mode 100644 index fb7aab93..00000000 --- a/cmd/ca-bundle-controller/main.go +++ /dev/null @@ -1,185 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "os" - "strconv" - "time" - - log "github.com/sirupsen/logrus" - - corev1 "k8s.io/api/core/v1" - kubeinformers "k8s.io/client-go/informers" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/kubernetes/scheme" - typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" - "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/tools/record" - - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/controller/cabundleinjector" - "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals" - "github.com/spf13/viper" -) - -var ( - masterURL string - kubeconfig string - cloudconfig string - logLevel string - logFormat string - - azureVaultFastRate time.Duration - azureVaultSlowRate time.Duration - azureVaultMaxFastAttempts int - customAuth bool -) - -const controllerAgentName = "ca-bundle-controller" - -func setLogLevel(logLevel string) { - if logLevel == "" { - logLevel = log.InfoLevel.String() - } - - logrusLevel, err := log.ParseLevel(logLevel) - if err != nil { - log.Fatalf("error setting log level: %s", err.Error()) - } - log.SetLevel(logrusLevel) -} - -func setLogFormat(logFormat string) { - switch logFormat { - case "fmt": - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) - case "json": - log.SetFormatter(&log.JSONFormatter{}) - default: - log.Warnf("Log format %s not supported - using default fmt", logFormat) - } -} - -func initConfig() { - viper.SetDefault("akv_label_name", "azure-key-vault-env-injection") - viper.SetDefault("ca_config_map_name", "akv2k8s-ca") - viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") - viper.AutomaticEnv() -} - -func main() { - initConfig() - - logLevel := viper.GetString("log_level") - setLogLevel(logLevel) - - logFormat := viper.GetString("log_format") - setLogFormat(logFormat) - - akv2k8s.Version = viper.GetString("version") - - // set up signals so we handle the first shutdown signal gracefully - stopCh := signals.SetupSignalHandler() - - akvLabelName := viper.GetString("akv_label_name") - akvNamespace := viper.GetString("akv_namespace") - - if akvNamespace == "" { - log.Fatal("Env var AKV_NAMESPACE is required") - } - - akvSecretName := viper.GetString("akv_secret_name") - if akvSecretName == "" { - log.Fatal("Env var AKV_SECRET_NAME is required") - } - - kubeconfig = viper.GetString("kubeconfig") - masterURL = viper.GetString("master") - cloudconfig = viper.GetString("cloudconfig") - - caConfigMapName := viper.GetString("ca_config_map_name") - - cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) - if err != nil { - log.Fatalf("Error building kubeconfig: %s", err.Error()) - } - - kubeClient, err := kubernetes.NewForConfig(cfg) - if err != nil { - log.Fatalf("Error building kubernetes clientset: %s", err.Error()) - } - - kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30) - kubeNsInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, time.Second*30, kubeinformers.WithNamespace(akvNamespace)) - - log.Info("Creating event broadcaster") - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(log.Tracef) - eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) - - recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) - - controller := cabundleinjector.NewController(kubeClient, recorder, kubeNsInformerFactory.Core().V1().Secrets(), kubeInformerFactory.Core().V1().Namespaces(), kubeInformerFactory.Core().V1().ConfigMaps(), akvLabelName, akvNamespace, akvSecretName, caConfigMapName) - - // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) - // Start method is non-blocking and runs all registered informers in a dedicated goroutine. - kubeInformerFactory.Start(stopCh) - kubeNsInformerFactory.Start(stopCh) - - if err = controller.Run(2, stopCh); err != nil { - log.Fatalf("Error running controller: %s", err.Error()) - } -} - -func getEnvDuration(key string, fallback time.Duration) (time.Duration, error) { - if value, ok := os.LookupEnv(key); ok { - duration, err := time.ParseDuration(value) - return duration, err - } - return fallback, nil -} - -func getEnvInt(key string, fallback int) (int, error) { - if value, ok := os.LookupEnv(key); ok { - intVal, err := strconv.Atoi(value) - return intVal, err - } - return fallback, nil -} - -func getEnvStr(key string, fallback string) (string, error) { - if value, ok := os.LookupEnv(key); ok { - return value, nil - } - return fallback, nil -} - -func getEnvBool(key string, fallback bool) (bool, error) { - if value, ok := os.LookupEnv(key); ok { - if booVal, err := strconv.ParseBool(value); ok { - return booVal, err - } - } - return fallback, nil -} diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller.go b/pkg/akv2k8s/controller/cabundleinjector/controller.go deleted file mode 100644 index d2815846..00000000 --- a/pkg/akv2k8s/controller/cabundleinjector/controller.go +++ /dev/null @@ -1,633 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* - When the env-injector gets installed, a CA Cert and Key, together with a serving cert - is installed as a Secert in the akv2k8s namespace. We monitor this secret for changes - and copy the CA Cert into a ConfigMap in all namespaces labeled - `azure-key-vault-env-injection: enabled`. We also monitor the label, and removed CA bundle if label is changed. -*/ - -package cabundleinjector - -import ( - "fmt" - "time" - - log "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/wait" - coreinformers "k8s.io/client-go/informers/core/v1" - "k8s.io/client-go/kubernetes" - corelisters "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/tools/cache" - "k8s.io/client-go/tools/record" - "k8s.io/client-go/util/workqueue" -) - -type workQueueType string - -const ( - // SuccessSynced is used as part of the Event 'reason' when a AzureKeyVaultSecret is synced - SuccessSynced = "Synced" - - // ErrResourceExists is used as part of the Event 'reason' when a AzureKeyVaultSecret fails - // to sync due to a Secret of the same name already existing. - ErrResourceExists = "ErrResourceExists" - - // ErrConfigMap is used as part of the Event 'reason' when a Secret sync fails - ErrConfigMap = "ErrConfigMap" - - // MessageResourceExists is the message used for Events when a resource - // fails to sync due to a Deployment already existing - MessageResourceExists = "Resource '%s' already exists and is not managed by CA Bundle Injector" - - // MessageResourceSynced is the message used for an Event fired when a AzureKeyVaultSecret - // is synced successfully - MessageResourceSynced = "CA Bundle synced successfully" - - workQueueTypeSecret workQueueType = "secret" - workQueueTypeNewNamespace workQueueType = "newNamespace" - workQueueTypeChangedNamespace workQueueType = "changedNamespace" -) - -type caBundleControllerConfig struct { -} - -// Controller is the controller implementation for AzureKeyVaultSecret resources -type Controller struct { - - // workqueue is a rate limited work queue. This is used to queue work to be - // processed instead of performing it as soon as a change happens. This - // means we can ensure we only process a fixed amount of resources at a - // time, and makes it easy to ensure we are never processing the same item - // simultaneously in two different workers. - kubeclientset kubernetes.Interface - // recorder is an event recorder for recording Event resources to the - // Kubernetes API. - recorder record.EventRecorder - - secretWorkqueue workqueue.RateLimitingInterface - newNamespaceWorkqueue workqueue.RateLimitingInterface - changedNamespaceWorkqueue workqueue.RateLimitingInterface - - secretsSynced cache.InformerSynced - namespacesSynced cache.InformerSynced - - secretLister corelisters.SecretLister - configMapLister corelisters.ConfigMapLister - namespaceLister corelisters.NamespaceLister - - labelName string - caBundleSecretName string - caBundleSecretNamespaceName string - caBundleConfigMapName string -} - -// NewController returns a new AzureKeyVaultSecret controller -func NewController(kubeclientset kubernetes.Interface, recorder record.EventRecorder, secretInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer, labelName string, caBundleSecretNamespaceName string, caBundleSecretName string, caBundleConfigMapName string) *Controller { - controller := &Controller{ - kubeclientset: kubeclientset, - recorder: recorder, - secretsSynced: secretInformer.Informer().HasSynced, - namespacesSynced: namespaceInformer.Informer().HasSynced, - secretWorkqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CABundles"), - newNamespaceWorkqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CAInjectedNewNamespaces"), - changedNamespaceWorkqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CAInjectedChangedNamespaces"), - labelName: labelName, - secretLister: secretInformer.Lister(), - configMapLister: configMapInformer.Lister(), - namespaceLister: namespaceInformer.Lister(), - caBundleSecretName: caBundleSecretName, - caBundleSecretNamespaceName: caBundleSecretNamespaceName, - caBundleConfigMapName: caBundleConfigMapName, - } - - log.Info("Setting up event handlers") - - // Set up an event handler for when Secret resources change. This - // handler will lookup the owner of the given Secret, and if it is - // owned by a AzureKeyVaultSecret resource will enqueue that Secret resource for - // processing. This way, we don't need to implement custom logic for - // handling AzureKeyVaultSecret resources. More info on this pattern: - // https://github.com/kubernetes/community/blob/8cafef897a22026d42f5e5bb3f104febe7e29830/contributors/devel/controllers.md - secretInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { // When CA Bundle gets added to akv2k8s - if secret, ok := obj.(*corev1.Secret); ok { - if secret.Name != caBundleSecretName { - return - } - log.Infof("Secret '%s' monitored by CA Bundle Injector added. Adding to queue.", secret.Name) - controller.enqueueSecret(obj) - } - }, - UpdateFunc: func(old, new interface{}) { // When CA Bundle gets changed in akv2k8s - if newSecret, ok := new.(*corev1.Secret); ok { - oldSecret := old.(*corev1.Secret) - - if newSecret.Name != caBundleSecretName { - return - } - - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } - log.Infof("Secret '%s' monitored by CA Bundle Injector changed. Handling.", newSecret.Name) - controller.enqueueSecret(new) - } - }, - DeleteFunc: func(obj interface{}) { // When CA Bundle gets deleted in akv2k8s - if secret, ok := obj.(*corev1.Secret); ok { - if secret.Name != caBundleSecretName { - return - } - - log.Infof("Secret '%s' monitored by CA Bundle Injector deleted. Handling.", secret.Name) - controller.enqueueSecret(obj) - } - }, - }) - - namespaceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { // When a new namespace gets added, that we should add ConfigMap to - if ns, ok := obj.(*corev1.Namespace); ok { - lbl := ns.Labels[controller.labelName] - if lbl == "" { - return - } - - log.Infof("Namespace '%s' labeled '%s' will be monitored by CA Bundle Injector. Adding to queue.", ns.Name, lbl) - controller.enqueueNewNamespace(obj) - } - }, - UpdateFunc: func(old, new interface{}) { // When an existing namespace gets updated, that potentually have akv2k8s label on it - if newNs, ok := new.(*corev1.Namespace); ok { - oldNs := old.(*corev1.Namespace) - - if newNs.ResourceVersion == oldNs.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } - - newLbl, newLblExist := newNs.Labels[controller.labelName] - oldLbl, oldLblExist := oldNs.Labels[controller.labelName] - - if newLblExist == oldLblExist && newLbl == oldLbl { - return // we only care if the namespace label has changed - } - - ns := new.(*corev1.Namespace) - log.Infof("labels in namespace '%s' changed, handling.", ns.Name) - controller.enqueueChangedNamespace(new) - } - }, - // DeleteFunc: func(obj interface{}) { - // ns := obj.(*corev1.Namespace) - // log.Debugf("Namespace '%s' monitored by CA Bundle Injector deleted. Handling.", ns.Name) - // controller.enqueueNamespace(obj) - // }, - }) - - // configMapInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - // DeleteFunc: func(obj interface{}) { - // ns := obj.(*corev1.ConfigMap) - // log.Debugf("ConfigMap '%s' monitored by CA Bundle Injector deleted. Handling.", ns.Name) - // controller.enqueueNamespace(obj) - // }, - // }) - - return controller -} - -// Run will set up the event handlers for types we are interested in, as well -// as syncing informer caches and starting workers. It will block until stopCh -// is closed, at which point it will shutdown the workqueue and wait for -// workers to finish processing their current work items. -func (c *Controller) Run(threadiness int, stopCh <-chan struct{}) error { - defer utilruntime.HandleCrash() - defer c.secretWorkqueue.ShutDown() - defer c.newNamespaceWorkqueue.ShutDown() - defer c.changedNamespaceWorkqueue.ShutDown() - - // Start the informer factories to begin populating the informer caches - log.Info("Starting CA Bundle Injector controller") - - // Wait for the caches to be synced before starting workers - log.Info("Waiting for informer caches to sync") - if ok := cache.WaitForCacheSync(stopCh, c.secretsSynced, c.namespacesSynced); !ok { - return fmt.Errorf("failed to wait for caches to sync") - } - - log.Info("Starting workers") - for i := 0; i < threadiness; i++ { - go wait.Until(c.runSecretWorker, time.Second, stopCh) - go wait.Until(c.runNewNamespaceWorker, time.Second, stopCh) - go wait.Until(c.runChangedNamespaceWorker, time.Second, stopCh) - } - - log.Info("Started workers") - <-stopCh - log.Info("Shutting down workers") - - return nil -} - -// runWorker is a long-running function that will continually call the -// processNextWorkItem function in order to read and process a message on the -// workqueue. -func (c *Controller) runSecretWorker() { - for c.processNextWorkItem(c.secretWorkqueue, workQueueTypeSecret) { - } -} - -// runWorker is a long-running function that will continually call the -// processNextWorkItem function in order to read and process a message on the -// workqueue. -func (c *Controller) runNewNamespaceWorker() { - for c.processNextWorkItem(c.newNamespaceWorkqueue, workQueueTypeNewNamespace) { - } -} - -// runWorker is a long-running function that will continually call the -// processNextWorkItem function in order to read and process a message on the -// workqueue. -func (c *Controller) runChangedNamespaceWorker() { - for c.processNextWorkItem(c.changedNamespaceWorkqueue, workQueueTypeChangedNamespace) { - } -} - -// processNextWorkItem will read a single work item off the workqueue and -// attempt to process it, by calling the syncHandler. -func (c *Controller) processNextWorkItem(queue workqueue.RateLimitingInterface, typeOfQueue workQueueType) bool { - log.Debug("Processing next work item in queue...") - obj, shutdown := queue.Get() - - if shutdown { - return false - } - - // We wrap this block in a func so we can defer c.workqueue.Done. - err := func(obj interface{}) error { - defer queue.Done(obj) - var key string - var ok bool - var successMsg string - - if key, ok = obj.(string); !ok { - queue.Forget(obj) - utilruntime.HandleError(fmt.Errorf("expected string in workqueue but got %#v", obj)) - return nil - } - - var err error - log.Debugf("Handling '%s' in queue...", key) - - switch typeOfQueue { - case workQueueTypeSecret: - successMsg = "Successfully synced CA Bundle from updated secret '%s' to all enabled namespaces" - err = c.syncHandlerSecret(key) - case workQueueTypeNewNamespace: - successMsg = "Successfully synced CA Bundle to new namespace '%s'" - err = c.syncHandlerNewNamespace(key) - case workQueueTypeChangedNamespace: - successMsg = "Successfully synced CA Bundle to changed namespace '%s'" - err = c.syncHandlerChangedNamespace(key) - } - - if err != nil { - queue.AddRateLimited(key) - return fmt.Errorf("error syncing '%s': %s, requeuing", key, err.Error()) - } - - queue.Forget(obj) - log.Infof(successMsg, key) - return nil - }(obj) - - if err != nil { - log.Error(err) - return true - } - - return true -} - -//syncHandler for secrets -func (c *Controller) syncHandlerSecret(key string) error { - /* - 1. Get Secret - 2. Get all akv2k8s-injector enabled namespaces - 3. Create ConfigMaps containing CA cert in namespaces - */ - - // Convert the namespace/name string into a distinct namespace and name - namespace, name, err := cache.SplitMetaNamespaceKey(key) - if err != nil { - utilruntime.HandleError(fmt.Errorf("invalid resource key: %s", key)) - return nil - } - - log.Debugf("pulling secret '%s' from namespace '%s'", name, namespace) - - // Get the Secret resource with this namespace/name - secret, err := c.secretLister.Secrets(namespace).Get(name) - if err != nil { - // The Secret resource may no longer exist, in which case we stop - // processing. - if errors.IsNotFound(err) { - utilruntime.HandleError(fmt.Errorf("secret '%s' in work queue no longer exists", key)) - return nil - } - - return err - } - - labelSelector := &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "azure-key-vault-env-injection": "enabled", - }, - } - - selector, err := metav1.LabelSelectorAsSelector(labelSelector) - if err != nil { - return err - } - - labelledNamespaces, err := c.namespaceLister.List(selector) - if err != nil { - return err - } - - log.Infof("looping all labelled namespaces looking for config map '%s' to update", c.caBundleConfigMapName) - - for _, ns := range labelledNamespaces { - configMap, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) - - // If the resource doesn't exist, we'll create it - if errors.IsNotFound(err) { - log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating configmap now", c.caBundleConfigMapName, ns.Name) - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) - if err != nil { - msg := fmt.Sprintf("failed to create configmap %s in namespace %s", newConfigMap.Name, ns.Name) - c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) - log.Errorf("%s, error: %+v", msg, err) - return err - } - return nil - } - - // If an error occurs during Get/Create, we'll requeue the item so we can - // attempt processing again later. This could have been caused by a - // temporary network failure, or any other transient reason. - if err != nil { - return err - } - - // If the ConfigMap is not controlled by this Secret resource, we should log - // a warning to the event recorder and return error msg. - if !metav1.IsControlledBy(configMap, secret) { - msg := fmt.Sprintf(MessageResourceExists, configMap.Name) - c.recorder.Event(secret, corev1.EventTypeWarning, ErrResourceExists, msg) - return fmt.Errorf(msg) - } - - // If CA cert in ConfigMap resource is not the same as in Secret resource, we - // should update the ConfigMap resource. - if configMap.Data["caCert"] != secret.StringData["caCert"] { - log.Infof("secret %s updated: updating config map: %s", secret.Name, configMap.Name) - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - configMap, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) - - if err != nil { - msg := fmt.Sprintf("failed to update configmap %s in namespace %s", newConfigMap.Name, ns.Name) - c.recorder.Event(newConfigMap, corev1.EventTypeWarning, ErrConfigMap, msg) - log.Errorf("%s, error: %+v", msg, err) - return err - } - } - - // If an error occurs during Update, we'll requeue the item so we can - // attempt processing again later. This could have been caused by a - // temporary network failure, or any other transient reason. - if err != nil { - return err - } - } - - c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) - return nil -} - -//syncHandler for new labelled namespaces -func (c *Controller) syncHandlerNewNamespace(key string) error { - ns, err := c.namespaceLister.Get(key) - if err != nil { - return err - } - - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, key) - cm, err := c.configMapLister.ConfigMaps(key).Get(c.caBundleConfigMapName) - - if err != nil { - if errors.IsNotFound(err) { // if configmap does not exist, create it - log.Debugf("configmap '%s' not found in labelled namespace '%s' - creating", c.caBundleConfigMapName, key) - - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) - if err != nil { - return err - } - return nil - } - - return err - } - - if cm != nil { - log.Debugf("configmap '%s' exists in namespace '%s' with old ca bundle - updating", c.caBundleConfigMapName, key) - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) - if err != nil { - return err - } - } - - c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced) - return nil -} - -//syncHandler for changed namespaces -func (c *Controller) syncHandlerChangedNamespace(key string) error { - ns, err := c.namespaceLister.Get(key) - if err != nil { - return err - } - - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) - cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) - if err != nil { - if errors.IsNotFound(err) { - log.Debugf("configmap '%s' not found in updated namespace '%s' - creating", c.caBundleConfigMapName, key) - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - newConfigMap := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) - _, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) - if err != nil { - return err - } - return nil - } - return err - } - - //If the resource exists in a non-labelled namespace, we delete it - if !c.isNamespacesLabelled(ns) && cm != nil { - log.Infof("configmap '%s' exists in namespace '%s' which is no longer labelled to keep CA Bundle", c.caBundleConfigMapName, key) - err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) - if err != nil { - return err - } - } - - return nil -} - -func (c *Controller) isNamespacesLabelled(ns *corev1.Namespace) bool { - lbl := ns.Labels[c.labelName] - if lbl == "enabled" { - return true - } - - return false -} - -func newConfigMap(name string, ns string, secret *corev1.Secret) *corev1.ConfigMap { - dataByte := secret.Data["ca.crt"] - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: ns, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(secret, schema.GroupVersionKind{ - Group: corev1.SchemeGroupVersion.Group, - Version: corev1.SchemeGroupVersion.Version, - Kind: "Secret", - }), - }, - }, - Data: map[string]string{ - "caCert": string(dataByte), - }, - } -} - -// enqueueSecret takes a Secret resource and converts it into a namespace/name -// string which is then put onto the work queue. This method should *not* be -// passed resources of any type other than Secret. -func (c *Controller) enqueueSecret(obj interface{}) { - var key string - var err error - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.secretWorkqueue.AddRateLimited(key) -} - -// enqueueNamespace takes a Namespace resource and converts it into a namespace/name -// string which is then put onto the work queue. This method should *not* be -// passed resources of any type other than Namespace. -func (c *Controller) enqueueNewNamespace(obj interface{}) { - var key string - var err error - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.newNamespaceWorkqueue.AddRateLimited(key) -} - -// enqueueNamespace takes a Namespace resource and converts it into a namespace/name -// string which is then put onto the work queue. This method should *not* be -// passed resources of any type other than Namespace. -func (c *Controller) enqueueChangedNamespace(obj interface{}) { - var key string - var err error - if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { - utilruntime.HandleError(err) - return - } - c.changedNamespaceWorkqueue.AddRateLimited(key) -} - -// // enqueueAzurePoll takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// // string which is then put onto the work queue. This method should *not* be -// // passed resources of any type other than AzureKeyVaultSecret. -// func (c *Controller) enqueueAzurePoll(obj interface{}) { -// var key string -// var err error -// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { -// utilruntime.HandleError(err) -// return -// } -// c.workqueueAzure.AddRateLimited(key) -// } - -// // dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name -// // string which is then put onto the work queue for deltion. This method should *not* be -// // passed resources of any type other than AzureKeyVaultSecret. -// func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) { -// var key string -// var err error - -// if key, err = cache.DeletionHandlingMetaNamespaceKeyFunc(obj); err != nil { -// utilruntime.HandleError(err) -// return -// } -// c.workqueue.AddRateLimited(key) - -// // Getting default key to remove from Azure work queue -// if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { -// utilruntime.HandleError(err) -// return -// } -// c.workqueueAzure.Forget(key) -// } diff --git a/pkg/akv2k8s/controller/cabundleinjector/controller_test.go b/pkg/akv2k8s/controller/cabundleinjector/controller_test.go deleted file mode 100644 index 754a1ce0..00000000 --- a/pkg/akv2k8s/controller/cabundleinjector/controller_test.go +++ /dev/null @@ -1,332 +0,0 @@ -package cabundleinjector - -import ( - "reflect" - "testing" - "time" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/diff" - kubeinformers "k8s.io/client-go/informers" - k8sfake "k8s.io/client-go/kubernetes/fake" - core "k8s.io/client-go/testing" - "k8s.io/client-go/tools/cache" - "k8s.io/client-go/tools/record" -) - -var ( - alwaysReady = func() bool { return true } - noResyncPeriodFunc = func() time.Duration { return 0 } -) - -type fixture struct { - t *testing.T - - kubeclient *k8sfake.Clientset - // Objects to put in the store. - secretLister []*corev1.Secret - configMapLister []*corev1.ConfigMap - namespaceLister []*corev1.Namespace - - // Actions expected to happen on the client. - kubeactions []core.Action - // actions []core.Action - - // Objects from here preloaded into NewSimpleFake. - kubeobjects []runtime.Object - objects []runtime.Object -} - -func newFixture(t *testing.T) *fixture { - f := &fixture{} - f.t = t - f.objects = []runtime.Object{} - f.kubeobjects = []runtime.Object{} - return f -} - -func (f *fixture) newController() (*Controller, []kubeinformers.SharedInformerFactory) { - f.kubeclient = k8sfake.NewSimpleClientset(f.kubeobjects...) - - k8sInformerSecrets := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) - k8sInformerNamespaces := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) - k8sInformerConfigMaps := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc()) - - // NewController(secretCABundleInformer coreinformers.SecretInformer, namespaceInformer coreinformers.NamespaceInformer, configMapInformer coreinformers.ConfigMapInformer) - c := NewController(f.kubeclient, record.NewFakeRecorder(100), k8sInformerSecrets.Core().V1().Secrets(), k8sInformerNamespaces.Core().V1().Namespaces(), k8sInformerConfigMaps.Core().V1().ConfigMaps(), "azure-key-vault-env-injection", "akv2k8s", "azure-key-vault-env-injector", "akv2k8s-ca") - - // c.foosSynced = alwaysReady - // c.deploymentsSynced = alwaysReady - // c.recorder = &record.FakeRecorder{} - - // for _, f := range f.fooLister { - // i.Samplecontroller().V1alpha1().Foos().Informer().GetIndexer().Add(f) - // } - - for _, d := range f.secretLister { - k8sInformerSecrets.Core().V1().Secrets().Informer().GetIndexer().Add(d) - } - - for _, d := range f.configMapLister { - k8sInformerConfigMaps.Core().V1().ConfigMaps().Informer().GetIndexer().Add(d) - } - - for _, d := range f.namespaceLister { - k8sInformerNamespaces.Core().V1().Namespaces().Informer().GetIndexer().Add(d) - } - - return c, []kubeinformers.SharedInformerFactory{ - k8sInformerConfigMaps, - k8sInformerNamespaces, - k8sInformerSecrets, - } -} - -func createNewSecret(name string, namespace string, secretValue map[string]string) *corev1.Secret { - return &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Type: corev1.SecretTypeOpaque, - StringData: secretValue, - } -} - -func createNewNamespace(name string, addLabel bool) *corev1.Namespace { - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - } - - if addLabel { - ns.Labels = map[string]string{ - "azure-key-vault-env-injection": "enabled", - } - } - return ns -} - -func (f *fixture) run(secretName string, namespaceName string) { - f.runController(secretName, namespaceName, true, false) -} - -func (f *fixture) runExpectError(secretName string, namespaceName string) { - f.runController(secretName, namespaceName, true, true) -} - -func (f *fixture) runController(secretName string, namespaceName string, startInformers bool, expectError bool) { - c, informers := f.newController() - if startInformers { - stopCh := make(chan struct{}) - defer close(stopCh) - for _, informer := range informers { - informer.Start(stopCh) - } - } - - if secretName != "" { - err := c.syncHandlerSecret(secretName) - if !expectError && err != nil { - f.t.Errorf("error syncing foo: %v", err) - } else if expectError && err == nil { - f.t.Error("expected error syncing foo, got nil") - } - } - - if namespaceName != "" { - err := c.syncHandlerNewNamespace(namespaceName) - if !expectError && err != nil { - f.t.Errorf("error syncing namespace: %v", err) - } else if expectError && err == nil { - f.t.Error("expected error syncing namespace, got nil") - } - } - - k8sActions := filterInformerActions(f.kubeclient.Actions()) - for i, action := range k8sActions { - if len(f.kubeactions) < i+1 { - f.t.Errorf("%d unexpected actions: %+v", len(k8sActions)-len(f.kubeactions), k8sActions[i:]) - break - } - - expectedAction := f.kubeactions[i] - checkAction(expectedAction, action, f.t) - } - - if len(f.kubeactions) > len(k8sActions) { - f.t.Errorf("%d additional expected actions:%+v", len(f.kubeactions)-len(k8sActions), f.kubeactions[len(k8sActions):]) - } -} - -func getKey(obj interface{}, t *testing.T) string { - key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) - if err != nil { - t.Errorf("Unexpected error getting key for object: %v", err) - return "" - } - return key -} - -// checkAction verifies that expected and actual actions are equal and both have -// same attached resources -func checkAction(expected, actual core.Action, t *testing.T) { - if !(expected.Matches(actual.GetVerb(), actual.GetResource().Resource) && actual.GetSubresource() == expected.GetSubresource()) { - t.Errorf("Expected\n\t%#v\ngot\n\t%#v", expected, actual) - return - } - - if reflect.TypeOf(actual) != reflect.TypeOf(expected) { - t.Errorf("Action has wrong type. Expected: %t. Got: %t", expected, actual) - return - } - - switch a := actual.(type) { - case core.CreateActionImpl: - e, _ := expected.(core.CreateActionImpl) - expObject := e.GetObject() - object := a.GetObject() - - if !reflect.DeepEqual(expObject, object) { - t.Errorf("Action %s %s has wrong object\nDiff:\n %s", - a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expObject, object)) - } - case core.UpdateActionImpl: - e, _ := expected.(core.UpdateActionImpl) - expObject := e.GetObject() - object := a.GetObject() - - if !reflect.DeepEqual(expObject, object) { - t.Errorf("Action %s %s has wrong object\nDiff:\n %s", - a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expObject, object)) - } - case core.PatchActionImpl: - e, _ := expected.(core.PatchActionImpl) - expPatch := e.GetPatch() - patch := a.GetPatch() - - if !reflect.DeepEqual(expPatch, patch) { - t.Errorf("Action %s %s has wrong patch\nDiff:\n %s", - a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expPatch, patch)) - } - case core.DeleteActionImpl: - e, _ := expected.(core.DeleteActionImpl) - expDel := e.GetName() - del := a.GetName() - - if !reflect.DeepEqual(expDel, del) { - t.Errorf("Action %s %s has wrong delete\nDiff:\n %s", - a.GetVerb(), a.GetResource().Resource, diff.ObjectGoPrintSideBySide(expDel, del)) - } - default: - t.Errorf("Uncaptured Action %s %s, you should explicitly add a case to capture it", - actual.GetVerb(), actual.GetResource().Resource) - } -} - -// filterInformerActions filters list and watch actions for testing resources. -// Since list and watch don't change resource state we can filter it to lower -// nose level in our tests. -func filterInformerActions(actions []core.Action) []core.Action { - ret := []core.Action{} - for _, action := range actions { - if len(action.GetNamespace()) == 0 && - (action.Matches("list", "secrets") || - action.Matches("watch", "secrets") || - action.Matches("list", "configmaps") || - action.Matches("watch", "configmaps") || - action.Matches("list", "namespaces") || - action.Matches("watch", "namespaces")) { - continue - } - ret = append(ret, action) - } - - return ret -} - -func (f *fixture) expectCreateNamespaceAction(namespace *corev1.Namespace) { - f.kubeactions = append(f.kubeactions, core.NewCreateAction(schema.GroupVersionResource{Resource: "namespaces"}, namespace.Name, namespace)) -} - -func (f *fixture) expectCreateConfigMapAction(cm *corev1.ConfigMap) { - f.kubeactions = append(f.kubeactions, core.NewCreateAction(schema.GroupVersionResource{Resource: "configmaps"}, cm.Namespace, cm)) -} - -func (f *fixture) expectRemoveConfigMapAction(cm *corev1.ConfigMap) { - f.kubeactions = append(f.kubeactions, core.NewDeleteAction(schema.GroupVersionResource{Resource: "configmaps"}, cm.Namespace, cm.Name)) -} - -func TestCreatesConfigMap(t *testing.T) { - f := newFixture(t) - - secretValue := map[string]string{ - "caCert": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRSmFUeUxENnVPM0lYOERKZlZhZ1NtekFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwemRtTXRZMkYwTFdOaE1CNFhEVEl3TURNeE9URTBOREV5T1ZvWERUTXdNRE14TnpFMApOREV5T1Zvd0ZURVRNQkVHQTFVRUF4TUtjM1pqTFdOaGRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVFFdFRZUG5FSnFoMXc4NFI5MWV0Nng1MFB3NEVZNFpjOUhHRW5KRW1UdEVSOVUKTG44MGg3MUwwdnJUOXpUcTVhZFlsOWRhaDB5T2JJUU1aMU5VYmdPanQvczJnUHNRaFU5QVZPbmNqWG1OK0x2eQo5Q0I4NEFiY1A0U0NLV1pSQWd1NVhQdGlsUlNYbG9NTGxLUU52TWZ2QkpDWlhvcS9pVWZXcmxQOWp1dHQ2V0luCjdKUWxXUmRhdENYby9sWDZ0cFgydy8vMU1XZTN1R1lKcWNyUFlVN2c5N1NjdWJEZCtBanE4RSs2S0FqU3AzVnQKUTU5enpKenRFczNJaVBUU0szbXlrSVNXUWdlSEVUZ3F0cFJiaVdHOW0xdDBDc3FVRVBmMjhIayt4VHVVOWFBeQpZclVhbFkrSmxxc2hybUVLdUsxL2NMMU8zZU95aHRXT2R2SndYNThDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUF0eHp1alVIa3c1VmJyczFNcWl6Vkd2dk9sdVZSQgpzb1NPb3BuakZVdHkyYjV6OUltcHdDeEMwWmppNFVVdVdrMTJHZGxldlE0dTdvbmV5VytZR25qeDNRY1FGQ2plCmpTeU1uM2xsWnpFcVFyLzNpWDVBRUp4NFZDZ3lmNmtiVmdmbnp2aXVrWm83NjUwTCt0V0xiK2JNWllDZ0h1a3YKVi9SNlBxSGdzZDZiSlV4U1lMWElFamtCK0x5cXlSM2RvZDRDNUhpK2dRd0dsK0EyWVd4R0p0SDZVOExYVldYLwpKSDIvUXVIU09uUm9QeVV4MVduUDV6M1NHYWZyR1ZrbVJwTW56UWk3YjFFeTJMQVlENGhCRlJXZSt0bWR3NjRRCmJMbUYwRU85cVVKQjg2bE1LN2pvVUk2TFc5ajF6SWVUREZRN0ZZOUY2VEJiNmZoNVFNak1YdVhYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - } - - akvNamespace := createNewNamespace("akv2k8s", false) - namespace := createNewNamespace("akv2k8s-test", true) - fakeSecret := createNewSecret("azure-key-vault-env-injector", "akv2k8s", secretValue) - - f.namespaceLister = append(f.namespaceLister, akvNamespace) - f.namespaceLister = append(f.namespaceLister, namespace) - f.secretLister = append(f.secretLister, fakeSecret) - - cm := newConfigMap("akv2k8s-ca", namespace.Name, fakeSecret) - f.expectCreateConfigMapAction(cm) - - f.run(getKey(fakeSecret, t), "") -} - -func TestCreatesConfigMapInNewNamespace(t *testing.T) { - t.Skip("Not finished") - f := newFixture(t) - - secretValue := map[string]string{ - "caCert": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRSmFUeUxENnVPM0lYOERKZlZhZ1NtekFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwemRtTXRZMkYwTFdOaE1CNFhEVEl3TURNeE9URTBOREV5T1ZvWERUTXdNRE14TnpFMApOREV5T1Zvd0ZURVRNQkVHQTFVRUF4TUtjM1pqTFdOaGRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVFFdFRZUG5FSnFoMXc4NFI5MWV0Nng1MFB3NEVZNFpjOUhHRW5KRW1UdEVSOVUKTG44MGg3MUwwdnJUOXpUcTVhZFlsOWRhaDB5T2JJUU1aMU5VYmdPanQvczJnUHNRaFU5QVZPbmNqWG1OK0x2eQo5Q0I4NEFiY1A0U0NLV1pSQWd1NVhQdGlsUlNYbG9NTGxLUU52TWZ2QkpDWlhvcS9pVWZXcmxQOWp1dHQ2V0luCjdKUWxXUmRhdENYby9sWDZ0cFgydy8vMU1XZTN1R1lKcWNyUFlVN2c5N1NjdWJEZCtBanE4RSs2S0FqU3AzVnQKUTU5enpKenRFczNJaVBUU0szbXlrSVNXUWdlSEVUZ3F0cFJiaVdHOW0xdDBDc3FVRVBmMjhIayt4VHVVOWFBeQpZclVhbFkrSmxxc2hybUVLdUsxL2NMMU8zZU95aHRXT2R2SndYNThDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUF0eHp1alVIa3c1VmJyczFNcWl6Vkd2dk9sdVZSQgpzb1NPb3BuakZVdHkyYjV6OUltcHdDeEMwWmppNFVVdVdrMTJHZGxldlE0dTdvbmV5VytZR25qeDNRY1FGQ2plCmpTeU1uM2xsWnpFcVFyLzNpWDVBRUp4NFZDZ3lmNmtiVmdmbnp2aXVrWm83NjUwTCt0V0xiK2JNWllDZ0h1a3YKVi9SNlBxSGdzZDZiSlV4U1lMWElFamtCK0x5cXlSM2RvZDRDNUhpK2dRd0dsK0EyWVd4R0p0SDZVOExYVldYLwpKSDIvUXVIU09uUm9QeVV4MVduUDV6M1NHYWZyR1ZrbVJwTW56UWk3YjFFeTJMQVlENGhCRlJXZSt0bWR3NjRRCmJMbUYwRU85cVVKQjg2bE1LN2pvVUk2TFc5ajF6SWVUREZRN0ZZOUY2VEJiNmZoNVFNak1YdVhYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - } - - fakeSecret := createNewSecret("azure-key-vault-env-injector", "akv2k8s", secretValue) - namespace := createNewNamespace("akv2k8s-test", true) - existingConfigMap := newConfigMap("akv2k8s-ca", namespace.Name, fakeSecret) - - f.secretLister = append(f.secretLister, fakeSecret) - f.namespaceLister = append(f.namespaceLister, namespace) - f.configMapLister = append(f.configMapLister, existingConfigMap) - - newNamespace := createNewNamespace("akv2k8s-test2", true) - f.kubeobjects = append(f.kubeobjects, newNamespace) - - cm := newConfigMap("akv2k8s-ca", newNamespace.Name, fakeSecret) - // f.expectCreateNamespaceAction(newNamespace) - f.expectCreateConfigMapAction(cm) - - f.run(getKey(fakeSecret, t), getKey(namespace, t)) -} - -func TestRemovesConfigMapInNamespaceWithoutLabel(t *testing.T) { - t.Skip("Not finished") - f := newFixture(t) - - secretValue := map[string]string{ - "caCert": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRSmFUeUxENnVPM0lYOERKZlZhZ1NtekFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwemRtTXRZMkYwTFdOaE1CNFhEVEl3TURNeE9URTBOREV5T1ZvWERUTXdNRE14TnpFMApOREV5T1Zvd0ZURVRNQkVHQTFVRUF4TUtjM1pqTFdOaGRDMWpZVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTVFFdFRZUG5FSnFoMXc4NFI5MWV0Nng1MFB3NEVZNFpjOUhHRW5KRW1UdEVSOVUKTG44MGg3MUwwdnJUOXpUcTVhZFlsOWRhaDB5T2JJUU1aMU5VYmdPanQvczJnUHNRaFU5QVZPbmNqWG1OK0x2eQo5Q0I4NEFiY1A0U0NLV1pSQWd1NVhQdGlsUlNYbG9NTGxLUU52TWZ2QkpDWlhvcS9pVWZXcmxQOWp1dHQ2V0luCjdKUWxXUmRhdENYby9sWDZ0cFgydy8vMU1XZTN1R1lKcWNyUFlVN2c5N1NjdWJEZCtBanE4RSs2S0FqU3AzVnQKUTU5enpKenRFczNJaVBUU0szbXlrSVNXUWdlSEVUZ3F0cFJiaVdHOW0xdDBDc3FVRVBmMjhIayt4VHVVOWFBeQpZclVhbFkrSmxxc2hybUVLdUsxL2NMMU8zZU95aHRXT2R2SndYNThDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUF0eHp1alVIa3c1VmJyczFNcWl6Vkd2dk9sdVZSQgpzb1NPb3BuakZVdHkyYjV6OUltcHdDeEMwWmppNFVVdVdrMTJHZGxldlE0dTdvbmV5VytZR25qeDNRY1FGQ2plCmpTeU1uM2xsWnpFcVFyLzNpWDVBRUp4NFZDZ3lmNmtiVmdmbnp2aXVrWm83NjUwTCt0V0xiK2JNWllDZ0h1a3YKVi9SNlBxSGdzZDZiSlV4U1lMWElFamtCK0x5cXlSM2RvZDRDNUhpK2dRd0dsK0EyWVd4R0p0SDZVOExYVldYLwpKSDIvUXVIU09uUm9QeVV4MVduUDV6M1NHYWZyR1ZrbVJwTW56UWk3YjFFeTJMQVlENGhCRlJXZSt0bWR3NjRRCmJMbUYwRU85cVVKQjg2bE1LN2pvVUk2TFc5ajF6SWVUREZRN0ZZOUY2VEJiNmZoNVFNak1YdVhYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - } - - fakeSecret := createNewSecret("azure-key-vault-env-injector", "akv2k8s", secretValue) - namespace := createNewNamespace("akv2k8s-test", false) - existingConfigMap := newConfigMap("akv2k8s-ca", namespace.Name, fakeSecret) - - f.secretLister = append(f.secretLister, fakeSecret) - f.namespaceLister = append(f.namespaceLister, namespace) - f.configMapLister = append(f.configMapLister, existingConfigMap) - - f.kubeobjects = append(f.kubeobjects, existingConfigMap) - - f.expectRemoveConfigMapAction(existingConfigMap) - - f.run(getKey(fakeSecret, t), getKey(namespace, t)) -} diff --git a/pkg/akv2k8s/controller/clock.go b/pkg/akv2k8s/controller/clock.go deleted file mode 100644 index 2c0927ad..00000000 --- a/pkg/akv2k8s/controller/clock.go +++ /dev/null @@ -1,38 +0,0 @@ -/* -Copyright Sparebanken Vest - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// Timer is a simple interface for time handling -type Timer interface { - Now() metav1.Time -} - -// Clock is a simple Time impl -type Clock struct { -} - -// Now returns current time -func (t *Clock) Now() metav1.Time { - now := time.Now() - return metav1.Time{Time: now} -} From c409f0e420bf1fbe206745764cc1b6747415ae6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 11 Oct 2020 22:11:48 +0200 Subject: [PATCH 188/251] controller: remove frequency as this is no longer used --- .../controller/controller.go | 14 +------------- cmd/azure-keyvault-controller/main.go | 13 ------------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index c3686585..cccd2bf3 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -124,20 +124,8 @@ type Options struct { CABundleConfigMapName string } -// AzurePollFrequency controls time durations to wait between polls to Azure Key Vault for changes -type AzurePollFrequency struct { - // Normal is the time duration to wait between polls to Azure Key Vault for changes - Normal time.Duration - - // MaxFailuresBeforeSlowingDown controls how many failures are accepted before reducing the frequency to Slow - MaxFailuresBeforeSlowingDown int - - // Slow is the time duration to wait between polls to Azure Key Vault for changes, after MaxFailuresBeforeSlowingDown is reached - Slow time.Duration -} - // NewController returns a new AzureKeyVaultSecret controller -func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, caBundleSecretName, caBundleSecretNamespaceName, namespaceAkvsLabel string, azureFrequency AzurePollFrequency, options *Options) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, caBundleSecretName, caBundleSecretNamespaceName, namespaceAkvsLabel string, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 9994e35e..3f8b54ee 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -59,9 +59,6 @@ func initConfig() { viper.SetDefault("akv_label_name", "azure-key-vault-env-injection") viper.SetDefault("ca_config_map_name", "akv2k8s-ca") viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") - viper.SetDefault("azure_vault_normal_poll_intervals", 1) - viper.SetDefault("azure_vault_exception_poll_intervals", 5) - viper.SetDefault("azure_vault_max_failure_attempts", 5) viper.SetDefault("custom_auth", false) viper.AutomaticEnv() @@ -89,9 +86,6 @@ func main() { // masterURL := viper.GetString("master") // cloudconfig := viper.GetString("cloudconfig") - azureVaultFastRate := time.Duration(viper.GetInt("azure_vault_normal_poll_intervals")) * time.Minute - azureVaultSlowRate := time.Duration(viper.GetInt("azure_vault_exception_poll_intervals")) * time.Minute - azureVaultMaxFastAttempts := viper.GetInt("azure_vault_max_failure_attempts") customAuth := viper.GetBool("custom_auth") caConfigMapName := viper.GetString("ca_config_map_name") @@ -128,12 +122,6 @@ func main() { kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30) azureKeyVaultSecretInformerFactory := informers.NewSharedInformerFactory(azureKeyVaultSecretClient, time.Second*30) - azurePollFrequency := controller.AzurePollFrequency{ - Normal: azureVaultFastRate, - Slow: azureVaultSlowRate, - MaxFailuresBeforeSlowingDown: azureVaultMaxFastAttempts, - } - log.Info("Creating event broadcaster") eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartLogging(log.Tracef) @@ -185,7 +173,6 @@ func main() { akvSecretName, akvNamespace, akvLabelName, - azurePollFrequency, options) controller.Run(stopCh) From d63b6ec92afd056de73f17fbf1938dc0a1378c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 12 Oct 2020 08:49:03 +0200 Subject: [PATCH 189/251] controller: fix match labels for getting akvs labelled namespaces --- cmd/azure-keyvault-controller/controller/caBundleNamespace.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go index 33d3c5cd..0aabc81e 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go +++ b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go @@ -168,9 +168,10 @@ func (c *Controller) syncCABundleInNamespace(key string) error { } func (c *Controller) getAllAkvsLabelledNamespaces() ([]*corev1.Namespace, error) { + log.Debugf("getting all namespaces labelled %s=%s", c.namespaceAkvsLabel, "enabled") labelSelector := &metav1.LabelSelector{ MatchLabels: map[string]string{ - c.caBundleSecretNamespaceName: "enabled", + c.namespaceAkvsLabel: "enabled", }, } From e93a2afc87a3eba0975f53b0462973d1b24f8971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 14 Oct 2020 08:23:11 +0200 Subject: [PATCH 190/251] Add changelogs --- CHANGELOG-1.0.md | 37 ++++++++++++++++++++++++++ CHANGELOG-1.1.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 CHANGELOG-1.0.md create mode 100644 CHANGELOG-1.1.md diff --git a/CHANGELOG-1.0.md b/CHANGELOG-1.0.md new file mode 100644 index 00000000..b4765bff --- /dev/null +++ b/CHANGELOG-1.0.md @@ -0,0 +1,37 @@ +# Changelog for Version 1.0 + +## Version 1.0.2 + +Unfortunately we had to patch away the functionality in the env-injector for removing sensitive files. The previous implementation caused issues if a pod crashed after initial startup and was unable to recover (because the filles needed where no longer present). We are currently working on a better and more secure solution, which will be released as soon as we can. + +### Chart and Image versions + +We have bumped all versions, but only the env-injector has changed. + +| Type | Component | Version | +| ------------ | ---------------------------------- | -----------------------------| +| Helm Chart | [azure-key-vault-controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller) | 1.0.2 | +| Helm Chart | [azure-key-vault-env-injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector) | 1.0.2 | +| Docker Image | spvest/azure-keyvault-controller | 1.0.2 | +| Docker Image | spvest/azure-keyvault-webhook | 1.0.2 | +| Docker Image | spvest/azure-keyvault-env | 1.0.2 | + + +## Version 1.0.0 + +### Added + +* [docs] New documentation portal at https://akv2k8s.io +* [env-injector] Improved logging +* [env-injector] Prometheus metrics +* [env-injector] Retry (up to 3 times) if fail to access AzureKeyVaultSecret on first try (ref: #34 ) +* [env-injector] Support getting raw certificate (`?raw`) +* [controller & env-injector] Support all Azure environments (public, china, german, us-gov) - thanks @mayong43111 ❗️ + +### Changed + +* [env-injector] Custom authentication +* [env-injector] Delete sensitive files +* [env-injector] Not map host volume for azure.json when using custom auth +* [env-injector] Canonical names for Docker images +* [controller] Use optional param for --cloudconfig (was hardcoded) - thanks @reiniertimmer ❗️ diff --git a/CHANGELOG-1.1.md b/CHANGELOG-1.1.md new file mode 100644 index 00000000..0c1eb2b4 --- /dev/null +++ b/CHANGELOG-1.1.md @@ -0,0 +1,67 @@ +# Changelog for Version 1.1 + +## Version 1.1.1 + +The most notable changes in this release are: + +* a complete rewrite of how Azure Key Vault authentication is handled and secured in Env-Injector +* a new Helm chart `akv2k8s` containing both the Controller and Env-Injector + +### General + +#### Features +* Support for Azure Managed Identities (MSI) when authenticating with Azure Key Vault +* Support fmt and json log formats - fmt is default +* Support other cloud types than Public Cloud (`AZURECHINACLOUD`, `AZUREGERMANCLOUD` and `AZUREUSGOVERNMENTCLOUD`) + +#### Other +* AzureKeyVaultSecret CRD version changed from `apiVersion: spv.no/v1alpha1` to `apiVersion: spv.no/v1` - still backward compatible with previous versions +* Kubernetes >= v0.17.4 + +### Env-Injector + +#### Features +* Basic support for Prometheus metrics +* Use remote inspection, instead of docker pull, to find Docker image cmd or entrypoint +* As part of the Auth service, introduced a ca-bundle-controller that will sync akv2k8s ca-cert to every namespace enabled with env-injection +* Support for SHA Docker image notation + +#### Bug Fixes + +* Provide Auth endpoint as a better and more secure alternative to storing credentials in a volume attached to a Pod - fixes issue #25 (and #42 #40 #39 and more) for getting oauth tokens to authenticate with Azure Key Vault +* Fix #69 - handle containers with no explicit cmd + +### Controller + +#### Features +* Add chainOrder option to ensure server certificate is first in chain (thanks to @david.mansson) + +#### Bug Fixes +* #104 - pass on labels and annotations from AzureKeyVaultSecret to Kubernetes Secret + +### Docs + +* Updated tutorials +* Show multiple versions (currently 1.0 and 1.1) - where 1.1 is now default +* Updated authentiction docs to reflect changes in 1.1 + +### Helm Charts + +* Introduced a new Helm chart (`akv2k8s`) that contains both the Controller and Env-Injector in one chart AND uses Helm 3 +* Removed CRDs from old charts (`azure-key-vault-controller` and `azure-key-vault-env-injector`) +* Updated installation instructions for why and how to manually install CRDs +* Fixed issue #55 where auth with ACR was not working +* Support log format fmt and json +* New charts have major changes in values - make sure to check yours match + +### Chart and Image versions + +| Type | Component | Version | +| ------- | ---------------------------------- | -----------------------------| +| Helm Chart | [akv2k8s](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s) | 1.1.24 | +| Helm Chart | [azure-key-vault-controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller) | 1.1.3 | +| Helm Chart | [azure-key-vault-env-injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector) | 1.1.18 | +| Docker Image | spvest/azure-keyvault-controller | 1.1.0 | +| Docker Image | spvest/azure-keyvault-webhook | 1.1.10 | +| Docker Image | spvest/azure-keyvault-env | 1.1.1 | +| Docker Image | spvest/ca-bundle-controller | 1.1.0 | \ No newline at end of file From 005f02cf840978ad635de37fe42961132bbf0c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 14 Oct 2020 08:28:36 +0200 Subject: [PATCH 191/251] Move ca bundle params and namespace selector into own structs --- .../controller/caBundleConfigMap.go | 2 +- .../controller/caBundleNamespace.go | 40 +++++++++---------- .../controller/caBundleSecret.go | 2 +- .../controller/controller.go | 39 +++++++++--------- .../controller/secret.go | 2 +- cmd/azure-keyvault-controller/main.go | 32 +++++++++------ 6 files changed, 62 insertions(+), 55 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go index fa4bcb35..32bcf235 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go +++ b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go @@ -55,7 +55,7 @@ func (c *Controller) getNamespaceFromConfigMap(cm *corev1.ConfigMap) (*corev1.Na } func (c *Controller) isCABundleConfigMap(cm *corev1.ConfigMap) bool { - return cm.Name == c.caBundleConfigMapName + return cm.Name == c.caBundle.ConfigMapName } func (c *Controller) getConfigMap(key string) (*corev1.ConfigMap, error) { diff --git a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go index 0aabc81e..10eba216 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go +++ b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go @@ -78,41 +78,41 @@ func (c *Controller) syncCABundleInNamespace(key string) error { isLabelled := c.isInjectorEnabledForNamespace(ns) if !isLabelled { - log.Debugf("Looking for configmap '%s' in non labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) - cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + log.Debugf("Looking for configmap '%s' in non labelled namespace '%s'", c.caBundle.ConfigMapName, ns.Name) + cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundle.ConfigMapName) if err != nil { return nil // ignore if not found in non-labelled namespace } - log.Infof("configmap '%s' exists in namespace '%s', but is no longer labelled to keep CA Bundle - deleting now", c.caBundleConfigMapName, key) - err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundleConfigMapName, &metav1.DeleteOptions{}) + log.Infof("configmap '%s' exists in namespace '%s', but is no longer labelled to keep CA Bundle - deleting now", c.caBundle.ConfigMapName, key) + err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundle.ConfigMapName, &metav1.DeleteOptions{}) if err != nil { return err } - log.Infof("successfully deleted configmap %s with ca bundle in namespace %s", c.caBundleConfigMapName, key) + log.Infof("successfully deleted configmap %s with ca bundle in namespace %s", c.caBundle.ConfigMapName, key) - msg := fmt.Sprintf("%s successfully deleted ConfigMap %s with CA Bundle", ControllerName, c.caBundleConfigMapName) + msg := fmt.Sprintf("%s successfully deleted ConfigMap %s with CA Bundle", ControllerName, c.caBundle.ConfigMapName) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) return nil } - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundleConfigMapName, ns.Name) - cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundleConfigMapName) + log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundle.ConfigMapName, ns.Name) + cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundle.ConfigMapName) if err != nil { if errors.IsNotFound(err) { // if configmap does not exist, create it - log.Infof("configmap '%s' with ca bundle not found in labelled namespace '%s' - creating now", c.caBundleConfigMapName, key) + log.Infof("configmap '%s' with ca bundle not found in labelled namespace '%s' - creating now", c.caBundle.ConfigMapName, key) - log.Debugf("getting secret %s with ca bundle in namespace %s", c.caBundleSecretName, c.caBundleSecretNamespaceName) - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + log.Debugf("getting secret %s with ca bundle in namespace %s", c.caBundle.SecretName, c.caBundle.SecretNamespace) + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundle.SecretNamespace).Get(c.caBundle.SecretName, metav1.GetOptions{}) if err != nil { return err } - log.Debugf("creating new configmap %s with ca bundle in namespace %s", c.caBundleConfigMapName, ns.Name) - newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + log.Debugf("creating new configmap %s with ca bundle in namespace %s", c.caBundle.ConfigMapName, ns.Name) + newConfigMap, err := newConfigMap(c.caBundle.ConfigMapName, ns.Name, secret) if err != nil { log.Errorf("failed to create new configmap, error: %+v", err) } @@ -122,9 +122,9 @@ func (c *Controller) syncCABundleInNamespace(key string) error { return err } - log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundleConfigMapName, key) + log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundle.ConfigMapName, key) - msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s ", ControllerName, c.caBundleConfigMapName) + msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s ", ControllerName, c.caBundle.ConfigMapName) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) return nil } @@ -133,7 +133,7 @@ func (c *Controller) syncCABundleInNamespace(key string) error { } //Get ca bundle from Secret - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundleSecretNamespaceName).Get(c.caBundleSecretName, metav1.GetOptions{}) + secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundle.SecretNamespace).Get(c.caBundle.SecretName, metav1.GetOptions{}) if err != nil { return err } @@ -146,9 +146,9 @@ func (c *Controller) syncCABundleInNamespace(key string) error { cmCABundle := getCABundleFromConfigMap(cm) if secretCABundle != cmCABundle { - log.Infof("configmap '%s' with ca bundle exists in namespace '%s' with old ca bundle - updating now", c.caBundleConfigMapName, key) + log.Infof("configmap '%s' with ca bundle exists in namespace '%s' with old ca bundle - updating now", c.caBundle.ConfigMapName, key) - newConfigMap, err := newConfigMap(c.caBundleConfigMapName, ns.Name, secret) + newConfigMap, err := newConfigMap(c.caBundle.ConfigMapName, ns.Name, secret) if err != nil { log.Errorf("failed to create new configmap, error: %+v", err) } @@ -158,9 +158,9 @@ func (c *Controller) syncCABundleInNamespace(key string) error { return err } - log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundleConfigMapName, key) + log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundle.ConfigMapName, key) - msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s", ControllerName, c.caBundleConfigMapName) + msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s", ControllerName, c.caBundle.ConfigMapName) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) } diff --git a/cmd/azure-keyvault-controller/controller/caBundleSecret.go b/cmd/azure-keyvault-controller/controller/caBundleSecret.go index ef0d04b6..eda39cd7 100644 --- a/cmd/azure-keyvault-controller/controller/caBundleSecret.go +++ b/cmd/azure-keyvault-controller/controller/caBundleSecret.go @@ -34,7 +34,7 @@ func (c *Controller) syncCABundleSecret(key string) error { return err } - log.Debugf("looping all labelled namespaces looking for ca bundle configmap '%s' to update", c.caBundleConfigMapName) + log.Debugf("looping all labelled namespaces looking for ca bundle configmap '%s' to update", c.caBundle.ConfigMapName) for _, ns := range labelledNamespaces { if err := c.syncCABundleInNamespace(ns.Name); err != nil { diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index cccd2bf3..4f472d19 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -76,6 +76,17 @@ const ( ControllerName = "Akv2k8s controller" ) +type NamespaceSelectorLabel struct { + Name string + Value string +} + +type CABundle struct { + ConfigMapName string + SecretNamespace string + SecretName string +} + // Controller is the controller implementation for AzureKeyVaultSecret resources type Controller struct { kubeclientset kubernetes.Interface @@ -96,10 +107,8 @@ type Controller struct { azureKeyVaultQueue *queue.Worker // CA Bundle - caBundleSecretQueue *queue.Worker - caBundleSecretName string - caBundleSecretNamespaceName string - caBundleConfigMapName string + caBundleSecretQueue *queue.Worker + caBundle CABundle // Namespace namespaceLister corelisters.NamespaceLister @@ -125,30 +134,22 @@ type Options struct { } // NewController returns a new AzureKeyVaultSecret controller -func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, caBundleSecretName, caBundleSecretNamespaceName, namespaceAkvsLabel string, options *Options) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, caBundle CABundle, nsSelector NamespaceSelectorLabel, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) - caBundleCMName := "caBundle" - if options.CABundleConfigMapName != "" { - caBundleCMName = options.CABundleConfigMapName - } - akvLogger := log.WithFields(log.Fields{"component": "akvs"}) caBundleLogger := log.WithFields(log.Fields{"component": "caBundle"}) controller := &Controller{ - kubeclientset: client, - akvsClient: akvsClient, - recorder: recorder, - vaultService: vaultService, - namespaceAkvsLabel: namespaceAkvsLabel, - - caBundleConfigMapName: caBundleCMName, - caBundleSecretName: caBundleSecretName, - caBundleSecretNamespaceName: caBundleSecretNamespaceName, + kubeclientset: client, + akvsClient: akvsClient, + recorder: recorder, + vaultService: vaultService, + + caBundle: caBundle, akvsInformerFactory: akvInformerFactory, kubeInformerFactory: kubeInformerFactory, diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 7bafcd44..ef03d1ab 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -137,7 +137,7 @@ func (c *Controller) syncSecret(key string) error { } func (c *Controller) isCABundleSecret(secret *corev1.Secret) bool { - return secret.Namespace == c.caBundleSecretNamespaceName && secret.Name == c.caBundleSecretName + return secret.Namespace == c.caBundle.SecretNamespace && secret.Name == c.caBundle.SecretName } func (c *Controller) isOwnedByAzureKeyVaultSecret(secret *corev1.Secret) bool { diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 3f8b54ee..b219fa0a 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -56,8 +56,9 @@ var ( func initConfig() { viper.SetDefault("version", "dev") viper.SetDefault("log_format", "fmt") - viper.SetDefault("akv_label_name", "azure-key-vault-env-injection") - viper.SetDefault("ca_config_map_name", "akv2k8s-ca") + viper.SetDefault("namespace_label_selector_name", "azure-key-vault-env-injection") + viper.SetDefault("namespace_label_selector_value", "enabled") + viper.SetDefault("akv_ca_config_map_name", "akv2k8s-ca") viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") viper.SetDefault("custom_auth", false) @@ -88,17 +89,23 @@ func main() { customAuth := viper.GetBool("custom_auth") - caConfigMapName := viper.GetString("ca_config_map_name") - akvLabelName := viper.GetString("akv_label_name") - akvSecretName := viper.GetString("akv_secret_name") - akvNamespace := viper.GetString("akv_namespace") + nsSelector := &controller.NamespaceSelectorLabel{ + Name: viper.GetString("namespace_label_selector_name"), + Value: viper.GetString("namespace_label_selector_value"), + } + + caBundle := &controller.CABundle{ + ConfigMapName: viper.GetString("akv_ca_config_map_name"), + SecretName: viper.GetString("akv_ca_secret_name"), + SecretNamespace: viper.GetString("akv_ca_namespace"), + } - if akvSecretName == "" { - log.Fatal("Env var AKV_SECRET_NAME required") + if caBundle.SecretName == "" { + log.Fatalf("env var AKV_CA_SECRET_NAME required") } - if akvNamespace == "" { - log.Fatal("Env var AKV_NAMESPACE required") + if caBundle.SecretNamespace == "" { + log.Fatalf("env var AKV_CA_NAMESPACE required") } // set up signals so we handle the first shutdown signal gracefully @@ -170,9 +177,8 @@ func main() { kubeInformerFactory, recorder, vaultService, - akvSecretName, - akvNamespace, - akvLabelName, + caBundle, + nsSelector, options) controller.Run(stopCh) From a763c0b00d1b07398f0ec26dc5ecd27642861f60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 14 Oct 2020 09:12:01 +0200 Subject: [PATCH 192/251] Update how-it-works to reflect recent changes --- docs/gatsby-config.js | 2 +- docs/source/content/faq.md | 6 +-- docs/source/content/how-it-works.mdx | 42 ++++++++----------- docs/source/content/quick-start.mdx | 2 +- .../tutorials/env-injection/1-secret.md | 2 +- .../tutorials/env-injection/2-certificate.md | 2 +- .../tutorials/env-injection/3-signing-key.md | 2 +- .../env-injection/5-pfx-certificate.md | 2 +- .../source/content/tutorials/sync/1-secret.md | 2 +- .../content/tutorials/sync/2-certificate.md | 2 +- .../content/tutorials/sync/3-signing-key.md | 2 +- 11 files changed, 29 insertions(+), 37 deletions(-) diff --git a/docs/gatsby-config.js b/docs/gatsby-config.js index 9c15625e..b08efea6 100644 --- a/docs/gatsby-config.js +++ b/docs/gatsby-config.js @@ -65,7 +65,7 @@ module.exports = { '1.0': 'doc-version-1.0.2', }, sidebarCategories: { - null: ['index', 'why-akv2k8s', 'quick-start', 'how-it-works'], + null: ['index', 'why-akv2k8s', 'quick-start', 'how-it-works', 'faq'], 'Installation': [ 'installation/index', 'installation/requirements', diff --git a/docs/source/content/faq.md b/docs/source/content/faq.md index aeff61c4..cf982b3f 100644 --- a/docs/source/content/faq.md +++ b/docs/source/content/faq.md @@ -1,8 +1,8 @@ --- -title: "Frequently Asked Questions" +title: "FAQ" description: "Most frequently asked questions" --- -### How does akv2k8s compare to Azure Key Vault Provider for Secrets Store CSI Driver? +### How does Akv2k8s compare to Azure Key Vault Provider for Secrets Store CSI Driver? -On a high level, Azure Key Vault for Kubernetes was created to securely pass secrets through environment variables into Docker containers and applications. Azure Key Vault Provider for Secrets Store CSI Driver on the other hand was created to access secrets through volumes. It boils down how to how you want your application to access secrets. The akv2k8s project is highly motivated by the 12 Factor App principles and believes passing configuration (including secrets) through environment variables is the way to go. If you prefer accessing secrets from a volume, use Azure Key Vault Provider for Secrets Store CSI Driver. \ No newline at end of file +On a high level Akv2k8s was created to securely pass secrets through environment variables into Docker containers and applications. Azure Key Vault Provider for Secrets Store CSI Driver on the other hand was created to access secrets through volumes. It boils down how to how you want your application to access secrets. The Akv2k8s project is highly motivated by the 12 Factor App principles and believes passing configuration (including secrets) through environment variables is the way to go. If you prefer accessing secrets from a volume, use Azure Key Vault Provider for Secrets Store CSI Driver. \ No newline at end of file diff --git a/docs/source/content/how-it-works.mdx b/docs/source/content/how-it-works.mdx index 55399cd5..b4ad89d2 100644 --- a/docs/source/content/how-it-works.mdx +++ b/docs/source/content/how-it-works.mdx @@ -9,7 +9,7 @@ import { ExpansionPanelListItem } from 'gatsby-theme-apollo-docs'; -Akv2k8s consist of three main components to integrate with Azure Key Vault: +Akv2k8s consist of three main components: * a Custom Resource Definition called `AzureKeyVaultSecret` * Controller @@ -17,19 +17,19 @@ Akv2k8s consist of three main components to integrate with Azure Key Vault: ## The AzureKeyVaultSecret CRD -The `AzureKeyVaultSecret` Custom Resource Definition (CRD) contains metadata used by the Controller and Env Injector to access objects in Azure Key Vault. For each secret, certificate or key in AzureKeyVault you want to make available in Kubernetes, you create a `AzureKeyVaultSecret` and provide the following information: +The `AzureKeyVaultSecret` Custom Resource Definition (CRD) contains metadata used by the Controller and Env Injector to access objects in Azure Key Vault. For each secret, certificate or key in AzureKeyVault that you want available in Kubernetes, you create a `AzureKeyVaultSecret` and provide: * The Kubernetes namespace where the Azure Key Vault secret should be available * The name of the Azure Key Vault * The name, type and version (optional) of the Azure Key Vault object -* Optionally which Kubernetes `Secret` name and data-key to create +* Optionally a Kubernetes `Secret` name and data-key to sync to An example `AzureKeyVaultSecret` looks like this: ```yaml # secret-sync.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: secret-sync @@ -48,14 +48,13 @@ spec: ## The Controller -The Controller is responsible for syncing Azure Key Vault objects into Kubernetes `Secret`'s, for all `AzureKeyVaultSecret`'s having `spec.output.secret` defined (like in the example above). +The Controller is responsible for: -Periodically the Controller will poll Azure Key Vault for version changes of the secret and apply any changes to the Kubernetes `Secret`. +* syncing Azure Key Vault objects into Kubernetes `Secret`'s, where the `AzureKeyVaultSecret` has `spec.output.secret` defined (like in the example above) +* periodically poll Azure Key Vault for changes and apply to the Kubernetes `Secret` > **Note-1: Pods in Kubernetes currently do not get notifications when Secret resources change, and Pods will have to be re-created or use something like the Wave controller (https://github.com/pusher/wave) to get the changes** -> **Note-2: By default the Controller auto sync secrets every 10 minutes (configurable) and depending on how many secrets are synchronized can cause extra usage costs of Azure Key Vault.** - ## The Env Injector The Env Injector is a bit more complex than the Controller and consists of: @@ -63,18 +62,16 @@ The Env Injector is a bit more complex than the Controller and consists of: * a Mutating Admission Webhook (see [Kubernetes docs](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook)) * a Docker image (spvest/azure-keyvault-env) containing the `azure-keyvault-env` executable -Below is an outline of the steps that gets executed when a Pod is scheduled to start, in a namespace enabled for Env-Injector. +Below are the steps that gets executed for a Pod using env-injection. ### The Mutating Admission Webhook triggers -The Env Injector webhook gets triggered just before every Pod gets created and inspects the Pod definition for environment variables with values containing `@azurekeyvault` (see example below). If it does not find any, the Pod starts as normal. If it does find environment variables with values containing `@azurekeyvault`, it mutates (changes) the Pod with: +The Env Injector webhook gets triggered just before every Pod gets created and inspects the Pod definition for environment variables containing `@azurekeyvault` (see example below). If it does not find any, the Pod starts as normal. If it does, it mutates (changes) the Pod with: -* A init-container (image: spvest/azure-keyvault-env) with these volumes: - * A in-memory volume at `/azure-keyvault/` - * A host volume at `/etc/kubernetes/azure.json` (only for default auth) +* A init-container (image: spvest/azure-keyvault-env) with a in-memory volume at `/azure-keyvault/` * Changes the executable for the Pod container (more on that later) Example where environment variable has value containing `@azurekeyvault`: @@ -92,34 +89,29 @@ As mentioned, the Pod container gets mutated to use a different executable. It d ### The Pod starts the init-container -When the Env Injector webhook is finished, Kubernetes will start the Pod with its new changes. This will trigger the following sequence: +When the Env Injector webhook is finished, Kubernetes will start the Pod with the mutated changes. This will trigger the following sequence: 1. The init-container will start 2. The init-container copies the `azure-keyvault-env` executable into `/azure-keyvault/` -3. If default authentication is used, the `/etc/kubernetes/azure.json` located on the node, containing Azure AKS default credentials is copied to `/azure-keyvault/` - -The volume `/azure-keyvault/` is a shared in-memory volume accessible to both the init-container and the original container. This is how the init-container can "give" the original container access to files. -> Note: All files located in the volume `/azure-keyvault/` will be deleted as soon as the original container starts up. It would be a security issue to have these files available to the container after startup. +The volume `/azure-keyvault/` in the Pod is shared between its containers (the init-container and the original container) and is how the init-container can "give" the original container its executable. ### The Pod starts the original container -When the original container starts it will execute the `azure-keyvault-env` command, which will: +When the original container starts, it will execute the `azure-keyvault-env` command, which will: -1. Connect to Azure Key Vault, using credentials found in `/azure-keyvault/azure.json` (when default auth is used) - or use custom credentials -2. Download any Azure Key Vault secrets, identified by the environment placeholders -3. Delete all content from the shared volume `/azure-keyvault/`: - 1. Delete itself (`azure-keyvault-env`) - 2. Delete `/azure-keyvault/azure.json` - default credentials +1. Get a OAuth token from the Env-Injector auth service for authenticating with Azure Key Vault (default - other options exists - see [Authentication](security/authentication) for details) +2. Connect to Azure Key Vault, using credentials from previous step +3. Download any Azure Key Vault objects, identified by the environment placeholders 4. Execute the original command and params, pass on the updated environment variables with real secret values -**✨The end result is that all secrets gets injected transparently in-memory during container startup. It will not reveal any secret content in the container spec, disk or logs. The only component that can read the secrets, are the program running inside the container. ✨** +**✨The end result is secrets injected transparently in-memory during container startup. It will not reveal any of the actual secrets in the container spec, disk or logs. The only component containing the actual secrets is the application process.✨** diff --git a/docs/source/content/quick-start.mdx b/docs/source/content/quick-start.mdx index 8db8024c..cdf4b846 100644 --- a/docs/source/content/quick-start.mdx +++ b/docs/source/content/quick-start.mdx @@ -43,7 +43,7 @@ Create a `AzureKeyVaultSecret` resource in the namespace you want the Kubernetes ```yaml # secret-sync.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: secret-sync diff --git a/docs/source/content/tutorials/env-injection/1-secret.md b/docs/source/content/tutorials/env-injection/1-secret.md index 6350d0d3..00f35a57 100644 --- a/docs/source/content/tutorials/env-injection/1-secret.md +++ b/docs/source/content/tutorials/env-injection/1-secret.md @@ -8,7 +8,7 @@ description: "Inject an Azure Key Vault secret directly into a container applica We start by creating a definition for the Azure Key Vault secret we want to inject: ```yaml:title=akvs-secret-inject.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: secret-inject diff --git a/docs/source/content/tutorials/env-injection/2-certificate.md b/docs/source/content/tutorials/env-injection/2-certificate.md index 29e1c738..e0234fc6 100644 --- a/docs/source/content/tutorials/env-injection/2-certificate.md +++ b/docs/source/content/tutorials/env-injection/2-certificate.md @@ -8,7 +8,7 @@ description: "Inject an Azure Key Vault certificate key pair directly into a con We start by creating a definition for the Azure Key Vault secret pointing to the certificate we want to sync: ```yaml:title=akvs-certificate-inject.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: certificate-inject diff --git a/docs/source/content/tutorials/env-injection/3-signing-key.md b/docs/source/content/tutorials/env-injection/3-signing-key.md index cc1a4ba2..17dc6c6f 100644 --- a/docs/source/content/tutorials/env-injection/3-signing-key.md +++ b/docs/source/content/tutorials/env-injection/3-signing-key.md @@ -8,7 +8,7 @@ description: "Inject a signing key from Azure Key Vault as environment variable We start by creating a definition for the Azure Key Vault signing key we want to inject: ```yaml:title=akvs-signing-key-inject.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: signing-key-inject diff --git a/docs/source/content/tutorials/env-injection/5-pfx-certificate.md b/docs/source/content/tutorials/env-injection/5-pfx-certificate.md index e375937e..4d91d785 100755 --- a/docs/source/content/tutorials/env-injection/5-pfx-certificate.md +++ b/docs/source/content/tutorials/env-injection/5-pfx-certificate.md @@ -13,7 +13,7 @@ This tutorial is EXACTLY like the [Inject Certificate](2-certificate) tutorial, last line below: ```yaml{11}:title=akvs-certificate-inject.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: certificate-inject diff --git a/docs/source/content/tutorials/sync/1-secret.md b/docs/source/content/tutorials/sync/1-secret.md index a9ad5d88..2f259e2f 100644 --- a/docs/source/content/tutorials/sync/1-secret.md +++ b/docs/source/content/tutorials/sync/1-secret.md @@ -9,7 +9,7 @@ We start by creating a definition for the Azure Key Vault secret we want to sync: ```yaml:title=akvs-secret-sync.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: secret-sync diff --git a/docs/source/content/tutorials/sync/2-certificate.md b/docs/source/content/tutorials/sync/2-certificate.md index aa1e7435..083af59a 100644 --- a/docs/source/content/tutorials/sync/2-certificate.md +++ b/docs/source/content/tutorials/sync/2-certificate.md @@ -8,7 +8,7 @@ description: "Sync a certificate from Azure Key Vault into a Kubernetes Secret." We start by creating a definition for the Azure Key Vault secret pointing to the certificate we want to sync: ```yaml:title=akvs-certificate-sync.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: certificate-sync diff --git a/docs/source/content/tutorials/sync/3-signing-key.md b/docs/source/content/tutorials/sync/3-signing-key.md index 3b150f4b..810d3491 100644 --- a/docs/source/content/tutorials/sync/3-signing-key.md +++ b/docs/source/content/tutorials/sync/3-signing-key.md @@ -8,7 +8,7 @@ description: "Sync signing key from Azure Key Vault into a Kubernetes Secret" We start by creating a definition for the Azure Key Vault signing-key we want to sync: ```yaml:title=akvs-signing-key-sync.yaml -apiVersion: spv.no/v1alpha1 +apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: signing-key-sync From 296f76399481e7a2946ff08e2e47a4bb925cc151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 17 Oct 2020 10:51:38 +0200 Subject: [PATCH 193/251] Add faq to docs --- docs/package-lock.json | 557 ++++++++++++++++++++++++++++--------- docs/package.json | 5 +- docs/source/content/faq.md | 47 +++- 3 files changed, 470 insertions(+), 139 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 9c801ed4..16b00ecf 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3248,9 +3248,9 @@ } }, "@babel/standalone": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.4.tgz", - "integrity": "sha512-OHOugVBx/LrhbCxaRVUviICe0SlC7zLYueYiMLsJk6qoCAC8RXpOxpwOxeps5YXWWmGmbombDkOFq6iDK1xQSA==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.6.tgz", + "integrity": "sha512-Ye1pj3fN76OWlJyi+Ocy1kTr1BNs5vFWHsq2oKPp3lB4Q0r2WrHi+n/Y2w3sZK+1QSKAkDXTp12tCuBprBHZ1w==", "dev": true }, "@babel/template": { @@ -12218,34 +12218,34 @@ } }, "gatsby-cli": { - "version": "2.12.88", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.88.tgz", - "integrity": "sha512-LBV6j9FFwGMCmbjvutTInwJV+fSrIhqHTYw6TZjVcXzUuk5jj/llj4CDUep5iPLjCZJvvzwtG2kDpkFPOPfsoA==", + "version": "2.12.107", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.107.tgz", + "integrity": "sha512-MEmqvYcz0TEVHVIZAjAClu9HY5SG0cRygizVRXrimQr7td7lg172zGIq3NJ6PgRbmQZIUF3MmQ8ublYqAjdg7g==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.3", + "@babel/code-frame": "^7.10.4", "@hapi/joi": "^15.1.1", "@types/common-tags": "^1.8.0", - "better-opn": "^1.0.0", + "better-opn": "^2.0.0", "chalk": "^2.4.2", "clipboardy": "^2.3.0", "common-tags": "^1.8.0", "configstore": "^5.0.1", "convert-hrtime": "^3.0.0", - "envinfo": "^7.5.1", + "envinfo": "^7.7.3", "execa": "^3.4.0", "fs-exists-cached": "^1.0.0", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.16", - "gatsby-recipes": "^0.2.17", - "gatsby-telemetry": "^1.3.28", - "hosted-git-info": "^3.0.4", + "gatsby-core-utils": "^1.3.23", + "gatsby-recipes": "^0.2.31", + "gatsby-telemetry": "^1.3.38", + "hosted-git-info": "^3.0.5", "ink": "^2.7.1", "ink-spinner": "^3.1.0", "is-valid-path": "^0.1.1", - "lodash": "^4.17.15", - "meant": "^1.0.1", - "node-fetch": "^2.6.0", + "lodash": "^4.17.20", + "meant": "^1.0.2", + "node-fetch": "^2.6.1", "opentracing": "^0.14.4", "pretty-error": "^2.1.1", "progress": "^2.0.3", @@ -12258,9 +12258,9 @@ "source-map": "0.7.3", "stack-trace": "^0.0.10", "strip-ansi": "^5.2.0", - "update-notifier": "^4.1.0", + "update-notifier": "^4.1.1", "uuid": "3.4.0", - "yargs": "^15.3.1", + "yargs": "^15.4.1", "yurnalist": "^1.1.2" }, "dependencies": { @@ -12290,15 +12290,30 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, + "better-opn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.0.0.tgz", + "integrity": "sha512-PPbGRgO/K0LowMHbH/JNvaV3qY3Vt+A2nH28fzJxy16h/DfR5OsVti6ldGl6S9SMsyUqT13sltikiAVtI6tKLA==", + "dev": true, + "requires": { + "open": "^7.0.3" + } + }, "hosted-git-info": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", - "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.6.tgz", + "integrity": "sha512-VRvqVD5T6t9HdmNDWTwbi8H/EC722MemAhOSP5QvYAXpDAY0Nhu2I/i+bXsktu4sU5LVHSh/wmXtVU8bDtjedQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -12309,11 +12324,21 @@ } }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", "dev": true }, + "open": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", @@ -12344,9 +12369,9 @@ } }, "gatsby-core-utils": { - "version": "1.3.16", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.16.tgz", - "integrity": "sha512-RezVD6iwMBARVcb+/bMR6TNm7bW73ceM2fh6v+TPBlb6WCXrete87gJkURLaIVQY+HOPy9+iQsg5LljAIV7hwg==", + "version": "1.3.23", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.23.tgz", + "integrity": "sha512-H6n6dDeRZ22HAJaBUIt5YjB/BSaE8Jq+kayMUv/YzL1RL2yFZ5lqcLwIL1OE2vWk1mQjMUBZCRxLODU0q1i3bQ==", "dev": true, "requires": { "ci-info": "2.0.0", @@ -13294,19 +13319,19 @@ } }, "gatsby-recipes": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.17.tgz", - "integrity": "sha512-BwscTYe1d1wxVUrBt9DZSrDTAhZjjvCj5ncEdfxHXz5BgiJcz6KUb4AVBboI/frOtSGbcSNWBGRJbEWcBQMCvA==", + "version": "0.2.31", + "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.31.tgz", + "integrity": "sha512-5sF1U+VbGpuHE4E+CdODraAZmzQS8DbHDWP/rpNYBzFalLdFs0HPngg8zb7TbzDY0p6b5umS32OF/2P9PAuVJg==", "dev": true, "requires": { - "@babel/core": "^7.9.6", - "@babel/generator": "^7.9.6", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.4", - "@babel/plugin-transform-react-jsx": "^7.9.4", - "@babel/standalone": "^7.10.2", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.6", + "@babel/core": "^7.11.6", + "@babel/generator": "^7.11.6", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/standalone": "^7.11.6", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.5", "@emotion/core": "^10.0.14", "@emotion/styled": "^10.0.14", "@graphql-tools/schema": "^6.0.14", @@ -13321,10 +13346,11 @@ "ansi-html": "^0.0.7", "babel-plugin-remove-export-keywords": "^1.6.5", "better-queue": "^3.8.10", - "chokidar": "3.4.0", + "chokidar": "^3.4.2", "concurrently": "^5.0.0", "contentful-management": "^5.26.3", "cors": "^2.8.5", + "cross-fetch": "^3.0.6", "debug": "^4.1.1", "detect-port": "^1.3.0", "dotenv": "^8.2.0", @@ -13334,9 +13360,9 @@ "flatted": "^3.0.0", "formik": "^2.0.8", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.16", - "gatsby-interface": "^0.0.166", - "gatsby-telemetry": "^1.3.28", + "gatsby-core-utils": "^1.3.23", + "gatsby-interface": "^0.0.193", + "gatsby-telemetry": "^1.3.38", "glob": "^7.1.6", "graphql": "^14.6.0", "graphql-compose": "^6.3.8", @@ -13347,10 +13373,9 @@ "ink-box": "^1.0.0", "is-binary-path": "^2.1.0", "is-url": "^1.2.4", - "isomorphic-fetch": "^2.1.0", "jest-diff": "^25.5.0", "lock": "^1.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.20", "mitt": "^1.2.0", "mkdirp": "^0.5.1", "node-fetch": "^2.5.0", @@ -13367,6 +13392,7 @@ "remark-parse": "^6.0.3", "remark-stringify": "^8.1.0", "resolve-cwd": "^3.0.0", + "resolve-from": "^5.0.0", "semver": "^7.3.2", "single-trailing-newline": "^1.0.0", "strip-ansi": "^6.0.0", @@ -13377,7 +13403,7 @@ "unist-util-remove": "^2.0.0", "unist-util-visit": "^2.0.2", "urql": "^1.9.7", - "uuid": "^8.2.0", + "uuid": "3.4.0", "ws": "^7.3.0", "xstate": "^4.9.1", "yoga-layout-prebuilt": "^1.9.6", @@ -13393,17 +13419,84 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/core": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.6", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", "dev": true, "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -13416,9 +13509,9 @@ } }, "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", "dev": true }, "@babel/template": { @@ -13432,10 +13525,27 @@ "@babel/types": "^7.10.4" } }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -13444,18 +13554,18 @@ } }, "@mdx-js/mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", - "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.8.tgz", + "integrity": "sha512-OT3bkvsA+rmqv378+UWFgeQuchaafhVgOO46+hc5U7KrGK3iPI2yGTcFwD3/KzSu+JGPCEUBREE96ncpvYqKjA==", "dev": true, "requires": { "@babel/core": "7.10.5", "@babel/plugin-syntax-jsx": "7.10.4", "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "^2.0.0-next.7", - "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", - "babel-plugin-extract-export-names": "^2.0.0-next.7", - "babel-plugin-extract-import-names": "^2.0.0-next.7", + "@mdx-js/util": "^2.0.0-next.8", + "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.8", + "babel-plugin-extract-export-names": "^2.0.0-next.8", + "babel-plugin-extract-import-names": "^2.0.0-next.8", "camelcase-css": "2.0.1", "detab": "2.0.3", "hast-to-hyperscript": "9.0.0", @@ -13463,8 +13573,8 @@ "lodash.uniq": "4.5.0", "mdast-util-to-hast": "9.1.0", "remark-footnotes": "1.0.0", - "remark-mdx": "^2.0.0-next.7", - "remark-mdxjs": "^2.0.0-next.7", + "remark-mdx": "^2.0.0-next.8", + "remark-mdxjs": "^2.0.0-next.8", "remark-parse": "8.0.2", "remark-squeeze-paragraphs": "4.0.0", "unified": "9.0.0", @@ -13472,6 +13582,43 @@ "unist-util-visit": "2.0.3" }, "dependencies": { + "@babel/core": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "remark-mdxjs": { + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/remark-mdxjs/-/remark-mdxjs-2.0.0-next.8.tgz", + "integrity": "sha512-Z/+0eWc7pBEABwg3a5ptL+vCTWHYMFnYzpLoJxTm2muBSk8XyB/CL+tEJ6SV3Q/fScHX2dtG4JRcGSpbZFLazQ==", + "dev": true, + "requires": { + "@babel/core": "7.10.5", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.10.4", + "@babel/plugin-syntax-jsx": "7.10.4", + "@mdx-js/util": "^2.0.0-next.8" + } + }, "remark-parse": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", @@ -13496,6 +13643,12 @@ "xtend": "^4.0.1" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "unified": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", @@ -13524,21 +13677,21 @@ } }, "@mdx-js/react": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", - "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==", + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.8.tgz", + "integrity": "sha512-I/ped8Wb1L4sUlumQmUlYQsH0tjd2Zj2eyCWbqgigpg+rtRlNFO9swkeyr0GY9hNZnwI8QOnJtNe+UdIZim8LQ==", "dev": true }, "@mdx-js/util": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", - "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==", + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.8.tgz", + "integrity": "sha512-T0BcXmNzEunFkuxrO8BFw44htvTPuAoKbLvTG41otyZBDV1Rs+JMddcUuaP5vXpTWtgD3grhcrPEwyx88RUumQ==", "dev": true }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "ansi-regex": { @@ -13547,39 +13700,42 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "babel-plugin-apply-mdx-type-prop": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", - "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.8.tgz", + "integrity": "sha512-Mcr9VAMxfS3ltNm3SXnSgP+7uqxx2zYS4xya2t8KvnLGejzSNsODSgjpNHUyfLihoDnfYaeCH7VFewZRKaRT8g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "^2.0.0-next.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } + "@mdx-js/util": "^2.0.0-next.8" + } + }, + "babel-plugin-extract-export-names": { + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-export-names/-/babel-plugin-extract-export-names-2.0.0-next.8.tgz", + "integrity": "sha512-W0DbJHAIlxSlb110h7uVq0aHmxPS985YSiEloTM7irvt8YkOFhxn4WkSAoOfTAJY/+xecRgwhMd8YTAZfoLq5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "7.10.4" } }, "babel-plugin-extract-import-names": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", - "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.8.tgz", + "integrity": "sha512-jdk6h7FaArjwMKqlF0hdozMwum5JDzLse99D5wWVbZWe0P7w/ghXDpE0VbooqJ/jyYwei5a6tHeTTU59Ds4WXg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } } }, "binary-extensions": { @@ -13588,6 +13744,40 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, + "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" + } + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "dev": true, + "requires": { + "node-fetch": "2.6.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -13600,12 +13790,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "execa": { @@ -13625,6 +13815,15 @@ "strip-final-newline": "^2.0.0" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -13636,11 +13835,48 @@ } }, "flatted": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.0.4.tgz", - "integrity": "sha512-4gZhsMc26tSiMgQ+0gRN818ST2KCkX/4EvqocCkE1+SRb7mapNk4KLSP+XAj02jc8rxuyD3DrmI3a0BQ/TNOpg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", "dev": true }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "gatsby-interface": { + "version": "0.0.193", + "resolved": "https://registry.npmjs.org/gatsby-interface/-/gatsby-interface-0.0.193.tgz", + "integrity": "sha512-4rSk8MLTtJXivKy2Znd6OgMBzEN7FRuhPd3/MZ99Te6ZG/3v0hHQ+GdtDu2fyMuaeznMSBDTfeipi7BO6mR9Eg==", + "dev": true, + "requires": { + "@mdx-js/react": "^1.5.2", + "@reach/alert": "0.10.3", + "@reach/combobox": "0.10.3", + "@reach/dialog": "0.10.3", + "@reach/menu-button": "0.10.3", + "@reach/popover": "0.10.3", + "@reach/tabs": "0.10.3", + "@reach/tooltip": "0.10.3", + "@types/lodash.sample": "^4.2.6", + "case": "^1.6.2", + "date-fns": "^2.8.1", + "gatsby-design-tokens": "^2.0.2", + "lodash.sample": "^4.2.1", + "theme-ui": "^0.2.49" + }, + "dependencies": { + "@mdx-js/react": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.18.tgz", + "integrity": "sha512-aFHsZVu7r9WamlP+WO/lyvHHZAubkQjkcRYlvS7fQElypfJvjKdHevjC3xiqlsQpasx/4KqRMoEIb++wNtd+6w==", + "dev": true + } + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -13650,6 +13886,15 @@ "pump": "^3.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -13665,6 +13910,12 @@ "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -13686,6 +13937,12 @@ "p-locate": "^4.1.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", @@ -13705,9 +13962,9 @@ } }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", "dev": true }, "npm-run-path": { @@ -13750,9 +14007,9 @@ } }, "prettier": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz", - "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", "dev": true }, "property-information": { @@ -13764,10 +14021,19 @@ "xtend": "^4.0.0" } }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "remark-mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", - "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", + "version": "2.0.0-next.8", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.8.tgz", + "integrity": "sha512-mjP0yo6BgjYrx5a+gKWYRFWbGnRiWi4Fdf17xGCr9VkSMnG4Dyo06spqbaLfHwl0KkQ/RQZlR2sn1mKnYduJdw==", "dev": true, "requires": { "parse-entities": "^2.0.0", @@ -13877,6 +14143,12 @@ "xtend": "^4.0.1" } }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", @@ -13920,11 +14192,14 @@ "ansi-regex": "^5.0.0" } }, - "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", - "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" + } }, "which": { "version": "2.0.2", @@ -14509,25 +14784,25 @@ } }, "gatsby-telemetry": { - "version": "1.3.28", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.28.tgz", - "integrity": "sha512-nG0lQdY4h+2tbtvHoPEm7UNOu6x/lITFqT1lkXsDl1vkvTMB9sgM2IIoyjBndRH41rjYtaYnPLBGRdYLtTXoZw==", + "version": "1.3.38", + "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.38.tgz", + "integrity": "sha512-8AoSNzVgrtPJ0Jgd+cPSuVGj2uBCXI2aJ2ANokOVjPbZO/Z+Z9hcOFdU+AkeBdZWCHaJaX0+qpE6KbgkwBoWPA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/runtime": "^7.10.3", - "@turist/fetch": "^7.1.6", + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.11.2", + "@turist/fetch": "^7.1.7", "@turist/time": "^0.0.1", "async-retry-ng": "^2.0.1", "boxen": "^4.2.0", "configstore": "^5.0.1", - "envinfo": "^7.5.1", + "envinfo": "^7.7.3", "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.16", - "git-up": "4.0.1", - "is-docker": "2.0.0", - "lodash": "^4.17.15", - "node-fetch": "2.6.0", + "gatsby-core-utils": "^1.3.23", + "git-up": "^4.0.2", + "is-docker": "^2.1.1", + "lodash": "^4.17.20", + "node-fetch": "^2.6.1", "uuid": "3.4.0" }, "dependencies": { @@ -14560,16 +14835,26 @@ "regenerator-runtime": "^0.13.4" } }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "git-up": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", + "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", "dev": true }, "regenerator-runtime": { diff --git a/docs/package.json b/docs/package.json index 5681def9..c00bb030 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,4 +1,7 @@ { + "engines": { + "node": ">=10.13.0" + }, "scripts": { "prestart": "gatsby clean", "start": "GATSBY_ALGOLIA_ENABLED=false gatsby develop", @@ -18,6 +21,6 @@ "react-instantsearch-dom": "^6.7.0" }, "devDependencies": { - "gatsby-cli": "^2.12.88" + "gatsby-cli": "^2.12.107" } } diff --git a/docs/source/content/faq.md b/docs/source/content/faq.md index cf982b3f..ad7fef08 100644 --- a/docs/source/content/faq.md +++ b/docs/source/content/faq.md @@ -3,6 +3,49 @@ title: "FAQ" description: "Most frequently asked questions" --- -### How does Akv2k8s compare to Azure Key Vault Provider for Secrets Store CSI Driver? +## How does Akv2k8s compare to Azure Key Vault Provider for Secrets Store CSI Driver? -On a high level Akv2k8s was created to securely pass secrets through environment variables into Docker containers and applications. Azure Key Vault Provider for Secrets Store CSI Driver on the other hand was created to access secrets through volumes. It boils down how to how you want your application to access secrets. The Akv2k8s project is highly motivated by the 12 Factor App principles and believes passing configuration (including secrets) through environment variables is the way to go. If you prefer accessing secrets from a volume, use Azure Key Vault Provider for Secrets Store CSI Driver. \ No newline at end of file +On a high level Akv2k8s was created to securely pass secrets through environment variables into Docker containers and applications. Azure Key Vault Provider for Secrets Store CSI Driver on the other hand was created to access secrets through volumes. It boils down how to how you want your application to access secrets. The Akv2k8s project is highly motivated by the 12 Factor App principles and believes passing configuration (including secrets) through environment variables is the way to go. If you prefer accessing secrets from a volume, use Azure Key Vault Provider for Secrets Store CSI Driver. + +## Can we see the secret value when using env-injection option? + +The secrets will not be revealed by env-injector and cannot be found in logs, volumes or in Kubernetes. The only place where the secrets exists is in the application process running inside the container. Depending on your security settings for your Pod and Container, you can exec into a shell in your pod and run: + +``` +cat /proc/1/environ | xargs -0 -L1 |sort +``` + +...replacing `[pid]` with your process ID - often this is 1 in a container. This will list all env variables for the process. + +To prevent this, see next question. + +## Can I prevent env-injected secrets from being listed in `/proc/[pid]/environ` inside the container? + +Yes. Follow Docker Container best-practices and don't run your container as root: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user + +## Is Akv2k8s compatible with Google distroless images? + +Yes. + +## Can I use a `AzureKeyVaultSecret` resource from a different namespace? + +No. `AzureKeyVaultSecret` behaves as Kubernetes `Secret` does. You cannot reference secrets across namespaces. + +> Secret resources reside in a namespace. Secrets can only be referenced by Pods in that same namespace. + +https://kubernetes.io/docs/concepts/configuration/secret/#restrictions + +## What are the different Azure Key Vault authentication options available? + +For the Controller: + +1. Using built-in AKS cluster credentials from azure cloud config (default) +2. Using custom credentials through environment variables +3. Using aad-pod-identity + +For the Env-Injector: + +Same 3 options as for the Controller, plus: + +1. Disable the env-injector auth service and use aad-pod-identity with your pod +2. Disable the env-injector auth service and pass credentials directly to your pod through environment variables From a116aaa893a8485df974e7575f25f2f392e08740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 18 Oct 2020 23:55:00 +0200 Subject: [PATCH 194/251] * use mtls with env-injector * remove ca bundle from controller * have env-injector webhook create secret with client cert --- .../controller/caBundleConfigMap.go | 89 ------- .../controller/caBundleNamespace.go | 218 ------------------ .../controller/caBundleSecret.go | 87 ------- .../controller/controller.go | 44 +--- .../controller/secret.go | 68 ------ cmd/azure-keyvault-controller/main.go | 29 +-- cmd/azure-keyvault-env/authentication.go | 32 ++- cmd/azure-keyvault-env/main.go | 11 +- .../clientCert.go | 93 ++++++++ .../clientCert_test.go | 82 +++++++ cmd/azure-keyvault-secrets-webhook/main.go | 116 +++++++--- cmd/azure-keyvault-secrets-webhook/pod.go | 158 +++++++++---- .../registry.go | 4 +- 13 files changed, 422 insertions(+), 609 deletions(-) delete mode 100644 cmd/azure-keyvault-controller/controller/caBundleConfigMap.go delete mode 100644 cmd/azure-keyvault-controller/controller/caBundleNamespace.go delete mode 100644 cmd/azure-keyvault-controller/controller/caBundleSecret.go create mode 100644 cmd/azure-keyvault-secrets-webhook/clientCert.go create mode 100644 cmd/azure-keyvault-secrets-webhook/clientCert_test.go diff --git a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go b/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go deleted file mode 100644 index 32bcf235..00000000 --- a/cmd/azure-keyvault-controller/controller/caBundleConfigMap.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "fmt" - - log "github.com/sirupsen/logrus" - - corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/tools/cache" - "kmodules.xyz/client-go/tools/queue" -) - -func (c *Controller) initConfigMap() { - c.kubeInformerFactory.Core().V1().ConfigMaps().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - DeleteFunc: func(obj interface{}) { - cm, err := convertToConfigMap(obj) - if err != nil { - log.Errorf("failed to convert to configmap: %v", err) - } - - if c.isCABundleConfigMap(cm) { - ns, err := c.getNamespaceFromConfigMap(cm) - if err != nil { - log.Errorf("failed to get namespace %s to replace deleted configmap %s/%s, error: %+v", cm.Namespace, cm.Namespace, cm.Name, err) - return - } - - queue.Enqueue(c.namespaceQueue.GetQueue(), ns) - } - }, - }) -} - -func (c *Controller) getNamespaceFromConfigMap(cm *corev1.ConfigMap) (*corev1.Namespace, error) { - return c.namespaceLister.Get(cm.Namespace) -} - -func (c *Controller) isCABundleConfigMap(cm *corev1.ConfigMap) bool { - return cm.Name == c.caBundle.ConfigMapName -} - -func (c *Controller) getConfigMap(key string) (*corev1.ConfigMap, error) { - namespace, name, err := cache.SplitMetaNamespaceKey(key) - if err != nil { - return nil, fmt.Errorf("invalid resource key: %s", key) - } - - log.Debugf("getting configmap %s from namespace %s", name, namespace) - cm, err := c.configMapLister.ConfigMaps(namespace).Get(name) - - if err != nil { - return nil, err - } - return cm, err -} - -func convertToConfigMap(obj interface{}) (*corev1.ConfigMap, error) { - cm, ok := obj.(*corev1.ConfigMap) - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) - } - cm, ok = tombstone.Obj.(*corev1.ConfigMap) - if !ok { - return nil, fmt.Errorf("tombstone contained object that is not a configmap %#v", obj) - } - } - return cm, nil -} diff --git a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go b/cmd/azure-keyvault-controller/controller/caBundleNamespace.go deleted file mode 100644 index 10eba216..00000000 --- a/cmd/azure-keyvault-controller/controller/caBundleNamespace.go +++ /dev/null @@ -1,218 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "fmt" - - log "github.com/sirupsen/logrus" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/cache" - "kmodules.xyz/client-go/tools/queue" -) - -func (c *Controller) initNamespace() { - c.kubeInformerFactory.Core().V1().Namespaces().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { // When a new namespace gets added, that we should add ConfigMap to - ns, err := convertToNamespace(obj) - if err != nil { - log.Errorf("failed to convert to namespace: %v", err) - } - - if c.isInjectorEnabledForNamespace(ns) { - queue.Enqueue(c.namespaceQueue.GetQueue(), ns) - } - }, - UpdateFunc: func(old, new interface{}) { // When an existing namespace gets updated, that potentually have akv2k8s label on it - newNs, err := convertToNamespace(new) - if err != nil { - log.Errorf("failed to convert to namespace: %v", err) - } - - oldNs, err := convertToNamespace(old) - if err != nil { - log.Errorf("failed to convert to namespace: %v", err) - } - - if newNs.ResourceVersion == oldNs.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } - - if c.isInjectorEnabledForNamespace(newNs) || c.isInjectorEnabledForNamespace(oldNs) { - if c.hasNamespaceLabelChanged(oldNs, newNs) { - queue.Enqueue(c.namespaceQueue.GetQueue(), newNs) - } - } - }, - }) -} - -func (c *Controller) syncCABundleInNamespace(key string) error { - ns, err := c.namespaceLister.Get(key) - if err != nil { - return err - } - - isLabelled := c.isInjectorEnabledForNamespace(ns) - - if !isLabelled { - log.Debugf("Looking for configmap '%s' in non labelled namespace '%s'", c.caBundle.ConfigMapName, ns.Name) - cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundle.ConfigMapName) - - if err != nil { - return nil // ignore if not found in non-labelled namespace - } - - log.Infof("configmap '%s' exists in namespace '%s', but is no longer labelled to keep CA Bundle - deleting now", c.caBundle.ConfigMapName, key) - err = c.kubeclientset.CoreV1().ConfigMaps(key).Delete(c.caBundle.ConfigMapName, &metav1.DeleteOptions{}) - if err != nil { - return err - } - - log.Infof("successfully deleted configmap %s with ca bundle in namespace %s", c.caBundle.ConfigMapName, key) - - msg := fmt.Sprintf("%s successfully deleted ConfigMap %s with CA Bundle", ControllerName, c.caBundle.ConfigMapName) - c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) - return nil - } - - log.Debugf("Looking for configmap '%s' in labelled namespace '%s'", c.caBundle.ConfigMapName, ns.Name) - cm, err := c.configMapLister.ConfigMaps(ns.Name).Get(c.caBundle.ConfigMapName) - - if err != nil { - if errors.IsNotFound(err) { // if configmap does not exist, create it - log.Infof("configmap '%s' with ca bundle not found in labelled namespace '%s' - creating now", c.caBundle.ConfigMapName, key) - - log.Debugf("getting secret %s with ca bundle in namespace %s", c.caBundle.SecretName, c.caBundle.SecretNamespace) - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundle.SecretNamespace).Get(c.caBundle.SecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - log.Debugf("creating new configmap %s with ca bundle in namespace %s", c.caBundle.ConfigMapName, ns.Name) - newConfigMap, err := newConfigMap(c.caBundle.ConfigMapName, ns.Name, secret) - if err != nil { - log.Errorf("failed to create new configmap, error: %+v", err) - } - - cm, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Create(newConfigMap) - if err != nil { - return err - } - - log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundle.ConfigMapName, key) - - msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s ", ControllerName, c.caBundle.ConfigMapName) - c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) - return nil - } - - return err - } - - //Get ca bundle from Secret - secret, err := c.kubeclientset.CoreV1().Secrets(c.caBundle.SecretNamespace).Get(c.caBundle.SecretName, metav1.GetOptions{}) - if err != nil { - return err - } - - secretCABundle, err := getCABundleFromSecret(secret) - if err != nil { - return err - } - - cmCABundle := getCABundleFromConfigMap(cm) - - if secretCABundle != cmCABundle { - log.Infof("configmap '%s' with ca bundle exists in namespace '%s' with old ca bundle - updating now", c.caBundle.ConfigMapName, key) - - newConfigMap, err := newConfigMap(c.caBundle.ConfigMapName, ns.Name, secret) - if err != nil { - log.Errorf("failed to create new configmap, error: %+v", err) - } - - cm, err = c.kubeclientset.CoreV1().ConfigMaps(ns.Name).Update(newConfigMap) - if err != nil { - return err - } - - log.Infof("ca bundle successfully synced to configmap '%s' in namespace '%s'", c.caBundle.ConfigMapName, key) - - msg := fmt.Sprintf("%s successfully synced CA Bundle to ConfigMap %s", ControllerName, c.caBundle.ConfigMapName) - c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, msg) - } - - return nil -} - -func (c *Controller) getAllAkvsLabelledNamespaces() ([]*corev1.Namespace, error) { - log.Debugf("getting all namespaces labelled %s=%s", c.namespaceAkvsLabel, "enabled") - labelSelector := &metav1.LabelSelector{ - MatchLabels: map[string]string{ - c.namespaceAkvsLabel: "enabled", - }, - } - - selector, err := metav1.LabelSelectorAsSelector(labelSelector) - if err != nil { - return nil, err - } - - return c.namespaceLister.List(selector) -} - -func convertToNamespace(obj interface{}) (*corev1.Namespace, error) { - ns, ok := obj.(*corev1.Namespace) - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) - } - ns, ok = tombstone.Obj.(*corev1.Namespace) - if !ok { - return nil, fmt.Errorf("tombstone contained object that is not a Secret %#v", obj) - } - } - return ns, nil -} - -func (c *Controller) isInjectorEnabledForNamespace(ns *corev1.Namespace) bool { - lbl := ns.Labels[c.namespaceAkvsLabel] - if lbl == "enabled" { - return true - } - - return false -} - -func (c *Controller) hasNamespaceLabelChanged(oldNs, newNs *corev1.Namespace) bool { - newLbl, newLblExist := newNs.Labels[c.namespaceAkvsLabel] - oldLbl, oldLblExist := oldNs.Labels[c.namespaceAkvsLabel] - - if newLblExist == oldLblExist && newLbl == oldLbl { - return false - } - return true -} diff --git a/cmd/azure-keyvault-controller/controller/caBundleSecret.go b/cmd/azure-keyvault-controller/controller/caBundleSecret.go deleted file mode 100644 index eda39cd7..00000000 --- a/cmd/azure-keyvault-controller/controller/caBundleSecret.go +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright Sparebanken Vest - -Based on the Kubernetes controller example at -https://github.com/kubernetes/sample-controller - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package controller - -import ( - "fmt" - - log "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -func (c *Controller) syncCABundleSecret(key string) error { - labelledNamespaces, err := c.getAllAkvsLabelledNamespaces() - if err != nil { - return err - } - - log.Debugf("looping all labelled namespaces looking for ca bundle configmap '%s' to update", c.caBundle.ConfigMapName) - - for _, ns := range labelledNamespaces { - if err := c.syncCABundleInNamespace(ns.Name); err != nil { - return err - } - } - return nil -} - -func getCABundleFromSecret(secret *corev1.Secret) (string, error) { - dataByte, found := secret.Data["ca.crt"] - if !found { - return "", fmt.Errorf("did not find key ca.crt in secret %s", secret.Name) - } - - caBundle := string(dataByte) - if caBundle == "" { - return "", fmt.Errorf("did find key ca.crt in secret %s, but no data was found", secret.Name) - } - - return caBundle, nil -} - -func getCABundleFromConfigMap(cm *corev1.ConfigMap) string { - return cm.Data["caCert"] -} - -func newConfigMap(name string, ns string, secret *corev1.Secret) (*corev1.ConfigMap, error) { - caCert, err := getCABundleFromSecret(secret) - if err != nil { - return nil, err - } - - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: ns, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(secret, schema.GroupVersionKind{ - Group: corev1.SchemeGroupVersion.Group, - Version: corev1.SchemeGroupVersion.Version, - Kind: "Secret", - }), - }, - }, - Data: map[string]string{ - "caCert": caCert, - }, - }, nil -} diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 4f472d19..67371100 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -106,42 +106,28 @@ type Controller struct { akvsCrdQueue *queue.Worker azureKeyVaultQueue *queue.Worker - // CA Bundle - caBundleSecretQueue *queue.Worker - caBundle CABundle - - // Namespace - namespaceLister corelisters.NamespaceLister - namespaceQueue *queue.Worker - - // ConfigMap - configMapLister corelisters.ConfigMapLister - options *Options clock Timer - akvLogger *log.Entry - caBundleLogger *log.Entry + akvLogger *log.Entry } // Options contains options for the controller type Options struct { - NumThreads int - MaxNumRequeues int - ResyncPeriod time.Duration - AkvsRef corev1.ObjectReference - CABundleConfigMapName string + NumThreads int + MaxNumRequeues int + ResyncPeriod time.Duration + AkvsRef corev1.ObjectReference } // NewController returns a new AzureKeyVaultSecret controller -func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, caBundle CABundle, nsSelector NamespaceSelectorLabel, options *Options) *Controller { +func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, options *Options) *Controller { // Create event broadcaster // Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be // logged for azure-keyvault-controller types. utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) akvLogger := log.WithFields(log.Fields{"component": "akvs"}) - caBundleLogger := log.WithFields(log.Fields{"component": "caBundle"}) controller := &Controller{ kubeclientset: client, @@ -149,34 +135,24 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI recorder: recorder, vaultService: vaultService, - caBundle: caBundle, - akvsInformerFactory: akvInformerFactory, kubeInformerFactory: kubeInformerFactory, secretsLister: kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretLister: akvInformerFactory.Keyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), - configMapLister: kubeInformerFactory.Core().V1().ConfigMaps().Lister(), - namespaceLister: kubeInformerFactory.Core().V1().Namespaces().Lister(), options: options, clock: &Clock{}, - akvLogger: akvLogger, - caBundleLogger: caBundleLogger, + akvLogger: akvLogger, } controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) controller.akvsSecretQueue = queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, controller.syncSecret) controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) - controller.caBundleSecretQueue = queue.New("CABundleSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleSecret) - controller.namespaceQueue = queue.New("Namespaces", options.MaxNumRequeues, options.NumThreads, controller.syncCABundleInNamespace) log.Info("Setting up event handlers") controller.initAzureKeyVaultSecret() - controller.initSecret() - controller.initNamespace() - controller.initConfigMap() return controller } @@ -213,12 +189,6 @@ func (c *Controller) Run(stopCh <-chan struct{}) { log.Info("starting azure key vault queue") c.azureKeyVaultQueue.Run(stopCh) - log.Info("starting ca bundle secret queue") - c.caBundleSecretQueue.Run(stopCh) - - log.Info("starting ca bundle namespace queue") - c.namespaceQueue.Run(stopCh) - log.Info("started workers") <-stopCh log.Info("Shutting down workers") diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index ef03d1ab..883aac7a 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -38,70 +38,6 @@ import ( "k8s.io/client-go/tools/cache" ) -func (c *Controller) initSecret() { - c.kubeInformerFactory.Core().V1().Secrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - secret, err := convertToSecret(obj) - if err != nil { - log.Errorf("failed to convert to secret: %v", err) - } - - if c.isCABundleSecret(secret) { - queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) - return - } - - if c.isOwnedByAzureKeyVaultSecret(secret) { - log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret added. Adding to queue.", secret.Namespace, secret.Name) - queue.Enqueue(c.akvsSecretQueue.GetQueue(), secret) - } - }, - UpdateFunc: func(old, new interface{}) { - newSecret, err := convertToSecret(new) - if err != nil { - log.Errorf("failed to convert to secret: %v", err) - } - - oldSecret, err := convertToSecret(old) - if err != nil { - log.Errorf("failed to convert to secret: %v", err) - } - - if newSecret.ResourceVersion == oldSecret.ResourceVersion { - // Periodic resync will send update events for all known Secrets. - // Two different versions of the same Secret will always have different RVs. - return - } - - if c.isCABundleSecret(newSecret) { - queue.Enqueue(c.caBundleSecretQueue.GetQueue(), newSecret) - return - } - - if c.isOwnedByAzureKeyVaultSecret(newSecret) { - log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret changed. Handling.", newSecret.Namespace, newSecret.Name) - queue.Enqueue(c.akvsSecretQueue.GetQueue(), newSecret) - } - }, - DeleteFunc: func(obj interface{}) { - secret, err := convertToSecret(obj) - if err != nil { - log.Errorf("failed to convert to secret: %v", err) - } - - if c.isCABundleSecret(secret) { - queue.Enqueue(c.caBundleSecretQueue.GetQueue(), secret) - return - } - - if c.isOwnedByAzureKeyVaultSecret(secret) { - log.Debugf("Secret %s/%s controlled by AzureKeyVaultSecret deleted. Handling.", secret.Namespace, secret.Name) - queue.Enqueue(c.akvsSecretQueue.GetQueue(), secret) - } - }, - }) -} - func convertToSecret(obj interface{}) (*corev1.Secret, error) { secret, ok := obj.(*corev1.Secret) if !ok { @@ -136,10 +72,6 @@ func (c *Controller) syncSecret(key string) error { return nil } -func (c *Controller) isCABundleSecret(secret *corev1.Secret) bool { - return secret.Namespace == c.caBundle.SecretNamespace && secret.Name == c.caBundle.SecretName -} - func (c *Controller) isOwnedByAzureKeyVaultSecret(secret *corev1.Secret) bool { if ownerRef := metav1.GetControllerOf(secret); ownerRef != nil { if ownerRef.Kind == "AzureKeyVaultSecret" { diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index b219fa0a..4682f1c8 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -56,9 +56,6 @@ var ( func initConfig() { viper.SetDefault("version", "dev") viper.SetDefault("log_format", "fmt") - viper.SetDefault("namespace_label_selector_name", "azure-key-vault-env-injection") - viper.SetDefault("namespace_label_selector_value", "enabled") - viper.SetDefault("akv_ca_config_map_name", "akv2k8s-ca") viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") viper.SetDefault("custom_auth", false) @@ -89,25 +86,6 @@ func main() { customAuth := viper.GetBool("custom_auth") - nsSelector := &controller.NamespaceSelectorLabel{ - Name: viper.GetString("namespace_label_selector_name"), - Value: viper.GetString("namespace_label_selector_value"), - } - - caBundle := &controller.CABundle{ - ConfigMapName: viper.GetString("akv_ca_config_map_name"), - SecretName: viper.GetString("akv_ca_secret_name"), - SecretNamespace: viper.GetString("akv_ca_namespace"), - } - - if caBundle.SecretName == "" { - log.Fatalf("env var AKV_CA_SECRET_NAME required") - } - - if caBundle.SecretNamespace == "" { - log.Fatalf("env var AKV_CA_NAMESPACE required") - } - // set up signals so we handle the first shutdown signal gracefully stopCh := signals.SetupSignalHandler() @@ -165,9 +143,8 @@ func main() { recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) options := &controller.Options{ - MaxNumRequeues: 5, - NumThreads: 1, - CABundleConfigMapName: caConfigMapName, + MaxNumRequeues: 5, + NumThreads: 1, } controller := controller.NewController( @@ -177,8 +154,6 @@ func main() { kubeInformerFactory, recorder, vaultService, - caBundle, - nsSelector, options) controller.Run(stopCh) diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go index 2ff2a3ed..9b695bf9 100644 --- a/cmd/azure-keyvault-env/authentication.go +++ b/cmd/azure-keyvault-env/authentication.go @@ -27,18 +27,26 @@ import ( "encoding/json" "encoding/pem" "fmt" + "io/ioutil" "net/http" + "path" "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" ) -func createHTTPClientWithTrustedCA(caCert []byte) (*http.Client, error) { +func createHTTPClientWithTrustedCAAndMtls(caCert, clientCert, clientKey []byte) (*http.Client, error) { caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) + clientKeyPair, err := tls.X509KeyPair(clientCert, clientKey) + if err != nil { + return nil, err + } + tlsConf := &tls.Config{ - RootCAs: caCertPool, + RootCAs: caCertPool, + Certificates: []tls.Certificate{clientKeyPair}, } tlsConf.BuildNameToCertificate() @@ -51,9 +59,25 @@ func createHTTPClientWithTrustedCA(caCert []byte) (*http.Client, error) { return tlsClient, nil } -func getCredentials(useAuthService bool, authServiceAddress, caCert string) (*credentialprovider.AzureKeyVaultCredentials, error) { +func getCredentials(useAuthService bool, authServiceAddress string, clientCertDir string) (*credentialprovider.AzureKeyVaultCredentials, error) { if useAuthService { - client, err := createHTTPClientWithTrustedCA([]byte(caCert)) + // caCert, clientCert, clientKey []byte + caCert, err := ioutil.ReadFile(path.Join(clientCertDir, "ca.crt")) + if err != nil { + return nil, err + } + + clientCert, err := ioutil.ReadFile(path.Join(clientCertDir, "tls.crt")) + if err != nil { + return nil, err + } + + clientKey, err := ioutil.ReadFile(path.Join(clientCertDir, "tls.key")) + if err != nil { + return nil, err + } + + client, err := createHTTPClientWithTrustedCAAndMtls(caCert, clientCert, clientKey) if err != nil { logger.Fatalf("failed to download ca cert, error: %+v", err) } diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 02030c72..ce3efd12 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -43,12 +43,13 @@ const ( type injectorConfig struct { namespace string podName string + clientCertDir string + akvDir string retryTimes int waitTimeBetweenRetries int useAuthService bool skipArgsValidation bool authServiceAddress string - caCert string signatureB64 string pubKeyBase64 string } @@ -171,19 +172,19 @@ func main() { config = injectorConfig{ namespace: viper.GetString("env_injector_pod_namespace"), podName: viper.GetString("env_injector_pod_name"), + clientCertDir: viper.GetString("env_injector_client_cert_dir"), + akvDir: viper.GetString("env_injector_exec_dir"), retryTimes: viper.GetInt("env_injector_retries"), waitTimeBetweenRetries: viper.GetInt("env_injector_wait_before_retry"), useAuthService: viper.GetBool("env_injector_use_auth_service"), skipArgsValidation: viper.GetBool("env_injector_skip_args_validation"), authServiceAddress: viper.GetString("env_injector_auth_service"), - caCert: viper.GetString("env_injector_ca_cert"), signatureB64: viper.GetString("env_injector_args_signature"), pubKeyBase64: viper.GetString("env_injector_args_key"), } requiredEnvVars := map[string]string{ "env_injector_auth_service": config.authServiceAddress, - "env_injector_ca_cert": config.caCert, "env_injector_args_signature": config.signatureB64, "env_injector_args_key": config.pubKeyBase64, } @@ -220,11 +221,11 @@ func main() { logger.Infof("found original container command to be %s %s", origCommand, origArgs) } - creds, err := getCredentials(config.useAuthService, config.authServiceAddress, config.caCert) + creds, err := getCredentials(config.useAuthService, config.authServiceAddress, config.clientCertDir) if err != nil { log.Warnf("failed to get credentials, will retry %d times", config.retryTimes) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { - creds, err = getCredentials(config.useAuthService, config.authServiceAddress, config.caCert) + creds, err = getCredentials(config.useAuthService, config.authServiceAddress, config.clientCertDir) if err != nil { logger.Warnf("failed to get credentials, error: %+v", err) return err diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert.go b/cmd/azure-keyvault-secrets-webhook/clientCert.go new file mode 100644 index 00000000..32d54be9 --- /dev/null +++ b/cmd/azure-keyvault-secrets-webhook/clientCert.go @@ -0,0 +1,93 @@ +package main + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "fmt" + "math/big" + "time" + + corev1 "k8s.io/api/core/v1" +) + +type ClientCertificate struct { + CA []byte + Crt []byte + Key []byte +} + +func generateClientCert(pod *corev1.Pod, validMonths int, caCert, caKey []byte) (*ClientCertificate, error) { + ca, err := tls.X509KeyPair(caCert, caKey) + if err != nil { + return nil, err + } + + x509Ca, err := x509.ParseCertificate(ca.Certificate[0]) + if err != nil { + return nil, err + } + + clientKey, err := rsa.GenerateKey(rand.Reader, 1024) + if err != nil { + return nil, err + } + + // clientKey, err := ecdsa.GenerateKey(elliptic., rand.Reader) + // if err != nil { + // return nil, err + // } + + now := time.Now() + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, fmt.Errorf("failed to generate serial number: %s", err) + } + + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{"akv2k8s"}, + CommonName: pod.Name, + }, + NotBefore: now, + NotAfter: now.AddDate(0, validMonths, 0), + KeyUsage: x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, + BasicConstraintsValid: true, + IsCA: false, + } + + certByte, err := x509.CreateCertificate(rand.Reader, &template, x509Ca, &clientKey.PublicKey, ca.PrivateKey) + if err != nil { + return nil, err + } + + certBlock := &pem.Block{ + Type: "CERTIFICATE", + Bytes: certByte, + } + pemCert := pem.EncodeToMemory(certBlock) + + keyBytes, err := x509.MarshalPKCS8PrivateKey(clientKey) + if err != nil { + return nil, err + } + + keyBlock := &pem.Block{ + Type: "PRIVATE KEY", + Bytes: keyBytes, + } + + pemKey := pem.EncodeToMemory(keyBlock) + + return &ClientCertificate{ + CA: caCert, + Crt: pemCert, + Key: pemKey, + }, nil +} diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert_test.go b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go new file mode 100644 index 00000000..615a8e07 --- /dev/null +++ b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go @@ -0,0 +1,82 @@ +package main + +import ( + "testing" + + corev1 "k8s.io/api/core/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var caCert = []byte(`-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIRAMVFSUuItvjfIauE8C6Px2EwDQYJKoZIhvcNAQELBQAw +TzEVMBMGA1UEChMMY2VydC1tYW5hZ2VyMTYwNAYDVQQDEy1jYS5henVyZS1rZXkt +dmF1bHQtdG8ta3ViZXJuZXRlcy5jZXJ0LW1hbmFnZXIwHhcNMjAxMDEwMDgyNjE3 +WhcNMjUxMDA5MDgyNjE3WjBPMRUwEwYDVQQKEwxjZXJ0LW1hbmFnZXIxNjA0BgNV +BAMTLWNhLmF6dXJlLWtleS12YXVsdC10by1rdWJlcm5ldGVzLmNlcnQtbWFuYWdl +cjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKRhWMdyTVekaduaV4zs +tL3qmF0MJ/kxkGg07NftdSgg0fa31cMGlKmQdKOnsDmH4ZniKl7XX0cRq1R8nHTS +bJNhukphY2xwwfCHF428EdrvOqqXUE6tiJ0vf0C2hTIDzGYvUR8b3NczCuYReNDy +RDHw4Z+tTux8wtUB/Lvzrvy6A/Jp6tObAsWxuk6uFneblk+ukV5NCgq6WAtoCQGW +IMsMverczuTipFrUBruveYIN7shWEv0jaQBetUAojiR9tfUpM4e07svxZOd/uVm/ +YQFBaczVuU4pA7RLWN3KwviR46sG9zSeUTn8wiKOmG94IrZQN0qDrXYnzegNk20H +W2kCAwEAAaM4MDYwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMB +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACMFfqNNfOaNYQRA +nymlHdB5vVMtCR6dLez8E93Nh+rZifzvdHEiom0JK1OrTqTkBboyl3aFleMpJYno +sNI10sbYZTy+AAkQ3GEuG6CKofltvf/GoaN/WY4BDO2bc9gmlGTNTZCS/bctOO9C +5OEk9q8BwfBje5QOjgCGFL6QtmxJHrdXHvfed79GhxWKggwdKbR6ZM6di/TG93rK +OP5m876o9+xuQ2qV+f2TMY4c/B05OMzj01yHs27F13dFdyuEDzib+zcQR84HtjVY +zQBk+teA64qVmrS1d5geAXlSfNmC/QQm7Yr2Q3OVRUvnFcgW+1fUopbbbfsLQ6TO +a4UbAEg= +-----END CERTIFICATE-----`) + +var caKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEApGFYx3JNV6Rp25pXjOy0veqYXQwn+TGQaDTs1+11KCDR9rfV +wwaUqZB0o6ewOYfhmeIqXtdfRxGrVHycdNJsk2G6SmFjbHDB8IcXjbwR2u86qpdQ +Tq2InS9/QLaFMgPMZi9RHxvc1zMK5hF40PJEMfDhn61O7HzC1QH8u/Ou/LoD8mnq +05sCxbG6Tq4Wd5uWT66RXk0KCrpYC2gJAZYgywy96tzO5OKkWtQGu695gg3uyFYS +/SNpAF61QCiOJH219Skzh7Tuy/Fk53+5Wb9hAUFpzNW5TikDtEtY3crC+JHjqwb3 +NJ5ROfzCIo6Yb3gitlA3SoOtdifN6A2TbQdbaQIDAQABAoIBAQCXkX834Eg6cMp/ +B/CEa9o4Z7D30vakyrPZsjtU2oo1ZxXTBS1gd5fqRd2W7U8LrSQzLRxeeP5MXJl6 +/K+S9FfTCcCpRuVTHyFkdFwef3SDSCTzGTSeZ1pZfWs7s1Bbjq8Q5b5KDfnyoAkD +nMam+0wwNGkGP9pPKrbHi96LO6V1N2GDIJ6XFpCbvejJDM+cXEw8DmD2BiU6Cslq +q3AOIHfNbqcDQGQVFRjFJwvximKZ0AvvF49UwoQSgZq5+FJXi+Em7ypzGlm9BwZW +uCWKQFllv269M8Zv/3l9ojuCTQAtYXfsFfh7z9EvwuvDTPQLpoYznIIRmej8Pg8I +lAGldbIRAoGBAMm+BEuGBUiZSylJYiTUGkWFlUeiwfJy9pOYpEYM3NWppmYZnNl0 +F3iWtjfQNbE4z++N4pP+zDBmtbqmvKrMeGT41yjHKGMmQXvLElA0mr9hPA3lJZJO +k/28OKUNBVrFi3BX2JLcLge/g8FLCn0yt363tCuAUq4a6j8lVKWvc8+1AoGBANCW +85Nzb61phEP3JQaXUUXF+4+wvo36QqqFDcJut24FjVmGaZwBI5Fcn151X2Oe2Al1 +ZfNZNi2V5132CXIw1mvCpA+UmgfSgTljIWV1L4dfMUACkekOFn04+tEuCGUTU22r +1y8KQUjQqUqhUBP3EwwXGe1WmQPWfTquzGxsVGVlAoGAQ5lwRv45dwImtUbpo/2O +cA064C4hXuQ2y24yXWah+NZH855ReGv2EWou1LTnyOKIinS4n26ZbP59lnWYcoLh +NLRNJFTXq6F9/8Uj9cwqrkYeoWlPFZ9O547STDv4t1nKR3KoF02//sillXdXpGwC +IGvd61WsXrqWE2Km4n3QCKECgYEAhVLGs0uIaR3VdZ+lYdYcE23dQdWlppf8PoO2 +7LzZr5AK7dr068rqkgHSt4xsAP/JdBo+pNEzyOVUsgENvpgqpUwOkwrXfQJ2qFiN +Qw0o6OzWTOSXoI/pnfZqkoNKyFgW7jV039M9MS511obO6UP2P7cQUlwUh5h0CKsr +bG29b+UCgYAb6tUPKHEQEvWEONNEy66vBtTIJXxjZISoExk40eaV/kAtEchlGXey +IrepX5pgiugqVP5K+xYTIiQ28X3xstrq4sZHYXuO2yAVaILlVBp5/df/riRbymbQ +7vphGG+/JeJJ6sb2yw48kYfQBroTO49aaf+A3LjykrkL+qAecX331w== +-----END RSA PRIVATE KEY-----`) + +func TestDockerPull(t *testing.T) { + pod := &corev1.Pod{ + ObjectMeta: v1.ObjectMeta{ + Name: "akv2k8s-envinjector-6b49f6bcd-j8mhh", + }, + } + + clientCert, err := generateClientCert(pod, 24, caCert, caKey) + if err != nil { + t.Error(err) + } + if clientCert == nil { + t.Fail() + } + + if string(clientCert.CA) != string(caCert) { + t.Fail() + } + + t.Logf("ca: \n%s", clientCert.CA) + t.Logf("cert: \n%s", clientCert.Crt) + t.Logf("key: \n%s", clientCert.Key) +} diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 8d0331a3..12e40085 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -19,10 +19,15 @@ package main import ( "context" + "crypto/tls" + "crypto/x509" "encoding/json" "fmt" + "io/ioutil" "net/http" "os" + "path/filepath" + "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" @@ -49,26 +54,25 @@ const ( oldDockerHubHost = "docker.io" injectorDir = "/azure-keyvault/" injectorExecutable = "azure-keyvault-env" - clientCertDir = "/client-cert/" + clientCertDir = "/var/client-cert/" initContainerVolumeName = "azure-keyvault-env" ) type azureKeyVaultConfig struct { port string - runningInsideAzureAks bool - customAuth bool - namespace string cloudConfigHostPath string serveMetrics bool httpPort string - certFile string - keyFile string + tlsCertFile string + tlsKeyFile string + caCert []byte + caKey []byte + authType string useAuthService bool dockerImageInspectionTimeout int useAksCredentialsWithAcs bool authServiceName string authServicePort string - caBundleConfigMapName string kubeClient *kubernetes.Clientset credentials credentialprovider.Credentials } @@ -122,12 +126,11 @@ func setLogFormat(logFormat string) { func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { req := whcontext.GetAdmissionRequest(ctx) - config.namespace = req.Namespace var pod *corev1.Pod switch v := obj.(type) { case *corev1.Pod: - log.Infof("found pod to mutate in namespace '%s'", config.namespace) + log.Infof("found pod to mutate in namespace '%s'", req.Namespace) pod = v default: return false, nil @@ -135,7 +138,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { podsInspectedCounter.Inc() - err := mutatePodSpec(pod) + err := mutatePodSpec(pod, req.Namespace) if err != nil { log.Errorf("failed to mutate pod, error: %+v", err) podsMutatedFailedCounter.Inc() @@ -208,11 +211,10 @@ func healthHandler(w http.ResponseWriter, r *http.Request) { } func initConfig() { - viper.SetDefault("running_inside_azure_aks", true) - viper.SetDefault("ca_config_map_name", "akv2k8s-ca") viper.SetDefault("azurekeyvault_env_image", "spvest/azure-keyvault-env:latest") viper.SetDefault("docker_image_inspection_timeout", 20) viper.SetDefault("docker_image_inspection_use_acs_credentials", true) + viper.SetDefault("auth_type", "cloudConfig") viper.SetDefault("use_auth_service", true) viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json") viper.SetDefault("metrics_enabled", false) @@ -238,39 +240,29 @@ func main() { config = azureKeyVaultConfig{ port: viper.GetString("port"), httpPort: viper.GetString("port_http"), - runningInsideAzureAks: viper.GetBool("running_inside_azure_aks"), - customAuth: viper.GetBool("custom_auth"), + authType: viper.GetString("auth_type"), serveMetrics: viper.GetBool("metrics_enabled"), - certFile: viper.GetString("tls_cert_file"), - keyFile: viper.GetString("tls_private_key_file"), + tlsCertFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.crt"), + tlsKeyFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.key"), useAuthService: viper.GetBool("use_auth_service"), authServiceName: viper.GetString("webhook_auth_service"), authServicePort: viper.GetString("webhook_auth_service_port"), - caBundleConfigMapName: viper.GetString("ca_config_map_name"), cloudConfigHostPath: viper.GetString("cloud_config_host_path"), dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), } - if !config.runningInsideAzureAks { - config.useAksCredentialsWithAcs = false - } - log.Info("Active settings:") - log.Infof(" Running inside Azure AKS : %t", config.runningInsideAzureAks) log.Infof(" Webhook port : %s", config.port) log.Infof(" Serve metrics : %t", config.serveMetrics) - log.Infof(" Use custom auth : %t", config.customAuth) + log.Infof(" Auth type : %s", config.authType) log.Infof(" Use auth service : %t", config.useAuthService) if config.useAuthService { log.Infof(" Auth service name : %s", config.authServiceName) log.Infof(" Auth service port : %s", config.authServicePort) } - if config.runningInsideAzureAks { - log.Infof(" Use AKS creds with ACS : %t", config.useAksCredentialsWithAcs) - } + log.Infof(" Use AKS creds with ACS : %t", config.useAksCredentialsWithAcs) log.Infof(" Docker inspection timeout : %d", config.dockerImageInspectionTimeout) - log.Infof(" CA ConfigMap name : %s", config.caBundleConfigMapName) log.Infof(" Cloud config path : %s", config.cloudConfigHostPath) mutator := mutating.MutatorFunc(vaultSecretsMutator) @@ -280,8 +272,30 @@ func main() { podHandler := handlerFor(mutating.WebhookConfig{Name: "azurekeyvault-secrets-pods", Obj: &corev1.Pod{}}, mutator, metricsRecorder, internalLogger) var err error - if !config.runningInsideAzureAks || config.customAuth { - log.Debug("using custom auth - looking for azure key vault credentials in envrionment") + if config.useAuthService { + log.Debug("loading ca to use for mtls and auth service") + + caCertDir := viper.GetString("ca_cert_dir") + if caCertDir == "" { + log.Fatalf("env var CA_CERT_DIR not provided - must exist to use auth service") + } + + caCertFile := filepath.Join(caCertDir, "tls.crt") + caKeyFile := filepath.Join(caCertDir, "tls.key") + + config.caCert, err = ioutil.ReadFile(caCertFile) + if err != nil { + log.Fatalf("failed to read pem file for ca cert %s, error: %+v", caCertFile, err) + } + + config.caKey, err = ioutil.ReadFile(caKeyFile) + if err != nil { + log.Fatalf("failed to read pem file for ca key %s, error: %+v", caKeyFile, err) + } + } + + if config.authType != "cloudConfig" { + log.Debug("not using cloudConfig for auth - looking for azure key vault credentials in envrionment") cProvider, err := credentialprovider.NewFromEnvironment() if err != nil { log.Fatal(fmt.Errorf("failed to create credentials provider for azure key vault, error %+v", err)) @@ -292,8 +306,8 @@ func main() { log.Fatal(fmt.Errorf("failed to get credentials for azure key vault, error %+v", err)) } - log.Debugf("using custom auth") } else { + log.Debugf("using cloudConfig for auth - reading credentials from %s", config.cloudConfigHostPath) f, err := os.Open(config.cloudConfigHostPath) if err != nil { log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) @@ -311,6 +325,14 @@ func main() { } } + log.Debug("checking credentials by getting authorizer from credentials") + _, err = config.credentials.Authorizer() + if err != nil { + log.Fatal("failed to get authorizer for azure key vault credentials") + } + + log.Debug("getting azure key vault authorizer succeded") + cfg, err := rest.InClusterConfig() if err != nil { log.Fatalf("failed to get kubernetes in cluster config, error: %+v", err) @@ -348,13 +370,41 @@ func main() { router.HandleFunc("/healthz", healthHandler) log.Infof("Serving encrypted healthz at %s/healthz", tlsURL) + var server *http.Server + if config.useAuthService { router.HandleFunc("/auth/{namespace}/{pod}", authHandler) log.Infof("Serving encrypted auth at %s/auth", tlsURL) + server = createServerWithMTLS(config.caCert, router, tlsURL) + } else { + server = createServer(router, tlsURL, nil) } - err = http.ListenAndServeTLS(tlsURL, config.certFile, config.keyFile, router) - if err != nil { - log.Fatalf("error serving webhook: %+v", err) + log.Fatal(server.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile)) +} + +func createServerWithMTLS(caCert []byte, router http.Handler, url string) *http.Server { + clientCertPool := x509.NewCertPool() + clientCertPool.AppendCertsFromPEM(caCert) + + tlsConfig := &tls.Config{ + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: clientCertPool, + PreferServerCipherSuites: true, + MinVersion: tls.VersionTLS12, + } + + tlsConfig.BuildNameToCertificate() + + return createServer(router, url, tlsConfig) +} + +func createServer(router http.Handler, url string, tlsConfig *tls.Config) *http.Server { + return &http.Server{ + Addr: url, + TLSConfig: tlsConfig, + Handler: router, + WriteTimeout: 15 * time.Second, + ReadTimeout: 15 * time.Second, } } diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index 3c0789c4..db2fe68e 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -29,10 +29,17 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/viper" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) +const ( + authSecretVolumeName = "akv2k8s-client-cert" + keyVaultEnvVolumeName = "azure-keyvault-env" +) + // This init-container copies a program to /azure-keyvault/ and // if default auth copies a read only version of azure config into // the /azure-keyvault/ folder to use as auth @@ -57,10 +64,10 @@ func getInitContainers() []corev1.Container { return []corev1.Container{container} } -func getVolumes() []corev1.Volume { +func getVolumes(authSecret *corev1.Secret) []corev1.Volume { volumes := []corev1.Volume{ { - Name: "azure-keyvault-env", + Name: keyVaultEnvVolumeName, VolumeSource: corev1.VolumeSource{ EmptyDir: &corev1.EmptyDirVolumeSource{ Medium: corev1.StorageMediumMemory, @@ -69,10 +76,25 @@ func getVolumes() []corev1.Volume { }, } + if config.useAuthService { + mode := int32(420) + volumes = append(volumes, []corev1.Volume{ + { + Name: authSecretVolumeName, + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + SecretName: authSecret.Name, + DefaultMode: &mode, + }, + }, + }, + }...) + } + return volumes } -func mutateContainers(clientset kubernetes.Interface, containers []corev1.Container, podSpec *corev1.PodSpec) (bool, error) { +func mutateContainers(clientset kubernetes.Interface, containers []corev1.Container, podSpec *corev1.PodSpec, namespace string, authServiceSecret *corev1.Secret) (bool, error) { mutated := false for i, container := range containers { @@ -104,7 +126,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai continue } - autoArgs, err := getContainerCmd(clientset, &container, podSpec) + autoArgs, err := getContainerCmd(clientset, &container, podSpec, namespace) if err != nil { return false, fmt.Errorf("failed to get auto cmd, error: %+v", err) } @@ -140,30 +162,14 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{ { - Name: "azure-keyvault-env", + Name: keyVaultEnvVolumeName, MountPath: injectorDir, ReadOnly: true, }, }...) - log.Debugf("mounting volume '%s' to '%s'", "azure-keyvault-env", injectorDir) + log.Debugf("mounting volume '%s' to '%s'", keyVaultEnvVolumeName, injectorDir) container.Env = append(container.Env, []corev1.EnvVar{ - { - Name: "ENV_INJECTOR_POD_NAMESPACE", - ValueFrom: &corev1.EnvVarSource{ - FieldRef: &corev1.ObjectFieldSelector{ - FieldPath: "metadata.namespace", - }, - }, - }, - { - Name: "ENV_INJECTOR_POD_NAME", - ValueFrom: &corev1.EnvVarSource{ - FieldRef: &corev1.ObjectFieldSelector{ - FieldPath: "metadata.name", - }, - }, - }, { Name: "ENV_INJECTOR_ARGS_SIGNATURE", Value: base64.StdEncoding.EncodeToString([]byte(signature)), @@ -172,33 +178,66 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai Name: "ENV_INJECTOR_ARGS_KEY", Value: base64.StdEncoding.EncodeToString([]byte(publicSigningKey)), }, - }...) - - log.Debugf("setting ENV_INJECTOR_USE_AUTH_SERVICE=%t for container %s", useAuthService, container.Name) - container.Env = append(container.Env, []corev1.EnvVar{ { Name: "ENV_INJECTOR_USE_AUTH_SERVICE", Value: strconv.FormatBool(useAuthService), }, + { + Name: "ENV_INJECTOR_EXEC_DIR", + Value: injectorDir, + }, }...) if useAuthService { + _, err := config.kubeClient.CoreV1().Secrets(namespace).Create(authServiceSecret) + if err != nil { + return false, err + } + + container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{ + { + Name: authSecretVolumeName, + MountPath: clientCertDir, + ReadOnly: true, + }, + }...) + container.Env = append(container.Env, []corev1.EnvVar{ { - Name: "ENV_INJECTOR_AUTH_SERVICE", - Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, namespace(), config.authServicePort), + Name: "ENV_INJECTOR_CLIENT_CERT_DIR", + Value: clientCertDir, + }, + { + Name: "ENV_INJECTOR_POD_NAMESPACE", + ValueFrom: &corev1.EnvVarSource{ + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "metadata.namespace", + }, + }, }, { - Name: "ENV_INJECTOR_CA_CERT", + Name: "ENV_INJECTOR_POD_NAME", ValueFrom: &corev1.EnvVarSource{ - ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ - LocalObjectReference: corev1.LocalObjectReference{ - Name: config.caBundleConfigMapName, - }, - Key: "caCert", + FieldRef: &corev1.ObjectFieldSelector{ + FieldPath: "metadata.name", }, }, }, + { + Name: "ENV_INJECTOR_AUTH_SERVICE", + Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, currentNamespace(), config.authServicePort), + }, + // { + // Name: "ENV_INJECTOR_CA_CERT", + // ValueFrom: &corev1.EnvVarSource{ + // ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ + // LocalObjectReference: corev1.LocalObjectReference{ + // Name: config.caBundleConfigMapName, + // }, + // Key: "caCert", + // }, + // }, + // }, }...) } @@ -208,7 +247,40 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai return mutated, nil } -func mutatePodSpec(pod *corev1.Pod) error { +func createAuthServicePodSecret(pod *corev1.Pod, namespace string, caCert, caKey []byte) (*corev1.Secret, error) { + // Create secret containing CA cert and mTLS credentials + + clientCert, err := generateClientCert(pod, 24, caCert, caKey) + if err != nil { + return nil, err + } + + value := map[string][]byte{ + "ca.crt": clientCert.CA, + "tls.crt": clientCert.Crt, + "tls.key": clientCert.Key, + } + + secret := &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("akv2k8s-%s", pod.Name), + Namespace: namespace, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(pod, schema.GroupVersionKind{ + Group: metav1.SchemeGroupVersion.Group, + Version: metav1.SchemeGroupVersion.Version, + Kind: "Pod", + }), + }, + }, + Type: corev1.SecretTypeTLS, + Data: value, + } + + return secret, nil +} + +func mutatePodSpec(pod *corev1.Pod, namespace string) error { podSpec := &pod.Spec kubeConfig, err := rest.InClusterConfig() @@ -221,19 +293,27 @@ func mutatePodSpec(pod *corev1.Pod) error { return err } - initContainersMutated, err := mutateContainers(clientset, podSpec.InitContainers, podSpec) + var authServiceSecret *corev1.Secret + if config.useAuthService { + authServiceSecret, err = createAuthServicePodSecret(pod, namespace, config.caCert, config.caKey) + if err != nil { + return err + } + } + + initContainersMutated, err := mutateContainers(clientset, podSpec.InitContainers, podSpec, namespace, authServiceSecret) if err != nil { return err } - containersMutated, err := mutateContainers(clientset, podSpec.Containers, podSpec) + containersMutated, err := mutateContainers(clientset, podSpec.Containers, podSpec, namespace, authServiceSecret) if err != nil { return err } if initContainersMutated || containersMutated { podSpec.InitContainers = append(getInitContainers(), podSpec.InitContainers...) - podSpec.Volumes = append(podSpec.Volumes, getVolumes()...) + podSpec.Volumes = append(podSpec.Volumes, getVolumes(authServiceSecret)...) log.Info("containers mutated and pod updated with init-container and volumes") podsMutatedCounter.Inc() } else { @@ -243,7 +323,7 @@ func mutatePodSpec(pod *corev1.Pod) error { return nil } -func namespace() string { +func currentNamespace() string { if ns, ok := os.LookupEnv("POD_NAMESPACE"); ok { return ns } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 9434e166..a2bec37f 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -24,7 +24,7 @@ import ( "k8s.io/client-go/kubernetes" ) -func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container, podSpec *corev1.PodSpec) ([]string, error) { +func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container, podSpec *corev1.PodSpec, namespace string) ([]string, error) { log.Debugf("getting container command for container '%s'", container.Name) cmd := container.Command @@ -33,7 +33,7 @@ func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container if len(cmd) == 0 { log.Debugf("no cmd override in kubernetes for container %s, checking docker image configuration for entrypoint and cmd for %s", container.Name, container.Image) - imgConfig, err := registry.GetImageConfig(clientset, config.namespace, container, podSpec, config.cloudConfigHostPath) + imgConfig, err := registry.GetImageConfig(clientset, namespace, container, podSpec, config.cloudConfigHostPath) if err != nil { return nil, err } From de38815107150a23a4db609b4b3600d5c7c246b7 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 14 Oct 2020 18:20:05 +0200 Subject: [PATCH 195/251] fix Typo --- cmd/azure-keyvault-env/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index ce3efd12..43e702a8 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -199,7 +199,7 @@ func main() { }) if config.useAuthService { - logger.Info("using sentralized akv2k8s auth service for authentiction with azure key vault") + logger.Info("using centralized akv2k8s auth service for authentiction with azure key vault") } else { logger.Debug("akv2k8s auth service not enabled - will look for azure key vault credentials locally") } From f939bc874c80e1e6039ab321def1a4c5f2b1d014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 09:10:42 +0200 Subject: [PATCH 196/251] controller: handle auth type instead of custom auth --- cmd/azure-keyvault-controller/main.go | 59 ++++++++++++++++----------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 4682f1c8..fa60b479 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -57,7 +57,7 @@ func initConfig() { viper.SetDefault("version", "dev") viper.SetDefault("log_format", "fmt") viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") - viper.SetDefault("custom_auth", false) + viper.SetDefault("auth_type", "azureCloudConfig") viper.AutomaticEnv() } @@ -82,9 +82,9 @@ func main() { // kubeconfig := viper.GetString("kubeconfig") // masterURL := viper.GetString("master") - // cloudconfig := viper.GetString("cloudconfig") + cloudConfig := viper.GetString("cloudconfig") - customAuth := viper.GetBool("custom_auth") + authType := viper.GetString("auth_type") // set up signals so we handle the first shutdown signal gracefully stopCh := signals.SetupSignalHandler() @@ -113,30 +113,19 @@ func main() { eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) var vaultAuth *credentialprovider.AzureKeyVaultCredentials - if customAuth { - provider, err := credentialprovider.NewFromEnvironment() + switch authType { + case "azureCloudConfig": + vaultAuth, err = getCredentialsFromCloudConfig(cloudConfig) if err != nil { - log.Fatalf("failed to create azure credentials provider, error: %+v", err.Error()) - } - - if vaultAuth, err = provider.GetAzureKeyVaultCredentials(); err != nil { - log.Fatalf("failed to get azure key vault credentials, error: %+v", err.Error()) - } - } else { - f, err := os.Open(cloudconfig) - if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) + log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) } - defer f.Close() - - cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) + case "environment": + vaultAuth, err = getCredentialsFromEnvironment() if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) - } - - if vaultAuth, err = cloudCnfProvider.GetAzureKeyVaultCredentials(); err != nil { - log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) + log.Fatalf("failed to get azure key vault credentials, error: %+v", err.Error()) } + default: + log.Fatalf("auth type %s not supported", authType) } vaultService := vault.NewService(vaultAuth) @@ -184,3 +173,27 @@ func setLogLevel(logLevel string) { } log.SetLevel(logrusLevel) } + +func getCredentialsFromCloudConfig(cloudconfig string) (*credentialprovider.AzureKeyVaultCredentials, error) { + f, err := os.Open(cloudconfig) + if err != nil { + log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) + } + defer f.Close() + + cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) + if err != nil { + log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) + } + + return cloudCnfProvider.GetAzureKeyVaultCredentials() +} + +func getCredentialsFromEnvironment() (*credentialprovider.AzureKeyVaultCredentials, error) { + provider, err := credentialprovider.NewFromEnvironment() + if err != nil { + log.Fatalf("failed to create azure credentials provider, error: %+v", err.Error()) + } + + return provider.GetAzureKeyVaultCredentials() +} From 213a24e5daec4a7e1cca6b7397c0761cc0bd65fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 09:52:20 +0200 Subject: [PATCH 197/251] env-injector: add seperate endpoint for auth --- cmd/azure-keyvault-secrets-webhook/main.go | 55 +++++++++++++------ .../registry.go | 2 +- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 12e40085..4d2121ea 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -22,6 +22,7 @@ import ( "crypto/tls" "crypto/x509" "encoding/json" + "flag" "fmt" "io/ioutil" "net/http" @@ -60,7 +61,7 @@ const ( type azureKeyVaultConfig struct { port string - cloudConfigHostPath string + cloudConfig string serveMetrics bool httpPort string tlsCertFile string @@ -73,8 +74,13 @@ type azureKeyVaultConfig struct { useAksCredentialsWithAcs bool authServiceName string authServicePort string + authServicePortInternal string kubeClient *kubernetes.Clientset credentials credentialprovider.Credentials + version string + versionEnvImage string + kubeconfig string + masterURL string } var config azureKeyVaultConfig @@ -216,16 +222,26 @@ func initConfig() { viper.SetDefault("docker_image_inspection_use_acs_credentials", true) viper.SetDefault("auth_type", "cloudConfig") viper.SetDefault("use_auth_service", true) - viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json") viper.SetDefault("metrics_enabled", false) viper.SetDefault("port_http", "80") viper.SetDefault("port", "443") + viper.SetDefault("webhook_auth_service_port", "8443") + viper.SetDefault("webhook_auth_service_port_internal", "8443") viper.SetDefault("log_level", "Info") viper.SetDefault("log_format", "fmt") viper.AutomaticEnv() } +func init() { + flag.StringVar(&config.version, "version", "", "Version of this component.") + flag.StringVar(&config.versionEnvImage, "versionenvimage", "", "Version of the env image component.") + flag.StringVar(&config.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") + flag.StringVar(&config.masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") + flag.StringVar(&config.cloudConfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") +} + func main() { + flag.Parse() initConfig() akv2k8s.Version = viper.GetString("version") @@ -247,7 +263,7 @@ func main() { useAuthService: viper.GetBool("use_auth_service"), authServiceName: viper.GetString("webhook_auth_service"), authServicePort: viper.GetString("webhook_auth_service_port"), - cloudConfigHostPath: viper.GetString("cloud_config_host_path"), + authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), } @@ -260,10 +276,11 @@ func main() { if config.useAuthService { log.Infof(" Auth service name : %s", config.authServiceName) log.Infof(" Auth service port : %s", config.authServicePort) + log.Infof(" Auth service internal port: %s", config.authServicePortInternal) } log.Infof(" Use AKS creds with ACS : %t", config.useAksCredentialsWithAcs) log.Infof(" Docker inspection timeout : %d", config.dockerImageInspectionTimeout) - log.Infof(" Cloud config path : %s", config.cloudConfigHostPath) + log.Infof(" Cloud config path : %s", config.cloudConfig) mutator := mutating.MutatorFunc(vaultSecretsMutator) metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer) @@ -307,16 +324,16 @@ func main() { } } else { - log.Debugf("using cloudConfig for auth - reading credentials from %s", config.cloudConfigHostPath) - f, err := os.Open(config.cloudConfigHostPath) + log.Debugf("using cloudConfig for auth - reading credentials from %s", config.cloudConfig) + f, err := os.Open(config.cloudConfig) if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) + log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfig, err) } defer f.Close() cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfigHostPath, err) + log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfig, err) } config.credentials, err = cloudCnfProvider.GetAzureKeyVaultCredentials() @@ -354,7 +371,6 @@ func main() { log.Infof("Serving healthz at %s/healthz", httpURL) go func() { - err := http.ListenAndServe(httpURL, httpMux) if err != nil { log.Fatalf("error serving metrics at %s: %+v", httpURL, err) @@ -370,16 +386,23 @@ func main() { router.HandleFunc("/healthz", healthHandler) log.Infof("Serving encrypted healthz at %s/healthz", tlsURL) - var server *http.Server - if config.useAuthService { - router.HandleFunc("/auth/{namespace}/{pod}", authHandler) - log.Infof("Serving encrypted auth at %s/auth", tlsURL) - server = createServerWithMTLS(config.caCert, router, tlsURL) - } else { - server = createServer(router, tlsURL, nil) + authURL := fmt.Sprintf(":%s", config.authServicePortInternal) + authRouter := mux.NewRouter() + + authRouter.HandleFunc("/auth/{namespace}/{pod}", authHandler) + authServer := createServerWithMTLS(config.caCert, authRouter, authURL) + log.Infof("Serving encrypted auth with mtls at %s/auth", authURL) + + go func() { + err := authServer.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile) + if err != nil { + log.Fatalf("error serving auth at %s: %+v", authURL, err) + } + }() } + server := createServer(router, tlsURL, nil) log.Fatal(server.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile)) } diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index a2bec37f..10007fc8 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -33,7 +33,7 @@ func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container if len(cmd) == 0 { log.Debugf("no cmd override in kubernetes for container %s, checking docker image configuration for entrypoint and cmd for %s", container.Name, container.Image) - imgConfig, err := registry.GetImageConfig(clientset, namespace, container, podSpec, config.cloudConfigHostPath) + imgConfig, err := registry.GetImageConfig(clientset, namespace, container, podSpec, config.cloudConfig) if err != nil { return nil, err } From 29781e26802bdce15677fd1f33b31f3be0efa707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 11:52:30 +0200 Subject: [PATCH 198/251] env-injector: fix handing of cmd params --- cmd/azure-keyvault-secrets-webhook/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 4d2121ea..5c02c812 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -243,7 +243,7 @@ func init() { func main() { flag.Parse() initConfig() - akv2k8s.Version = viper.GetString("version") + akv2k8s.Version = config.version logLevel := viper.GetString("log_level") setLogLevel(logLevel) @@ -266,6 +266,7 @@ func main() { authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), + cloudConfig: viper.GetString("cloudconfig"), } log.Info("Active settings:") From a1272a8b55557162d9704324b7e9c11387b9c9e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 12:10:12 +0200 Subject: [PATCH 199/251] env-injector: move viper env extraction into init --- cmd/azure-keyvault-secrets-webhook/main.go | 31 +++++++++++----------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 5c02c812..2b6db838 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -233,6 +233,21 @@ func initConfig() { } func init() { + config = azureKeyVaultConfig{ + port: viper.GetString("port"), + httpPort: viper.GetString("port_http"), + authType: viper.GetString("auth_type"), + serveMetrics: viper.GetBool("metrics_enabled"), + tlsCertFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.crt"), + tlsKeyFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.key"), + useAuthService: viper.GetBool("use_auth_service"), + authServiceName: viper.GetString("webhook_auth_service"), + authServicePort: viper.GetString("webhook_auth_service_port"), + authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), + dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), + useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), + } + flag.StringVar(&config.version, "version", "", "Version of this component.") flag.StringVar(&config.versionEnvImage, "versionenvimage", "", "Version of the env image component.") flag.StringVar(&config.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") @@ -253,22 +268,6 @@ func main() { akv2k8s.LogVersion() - config = azureKeyVaultConfig{ - port: viper.GetString("port"), - httpPort: viper.GetString("port_http"), - authType: viper.GetString("auth_type"), - serveMetrics: viper.GetBool("metrics_enabled"), - tlsCertFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.crt"), - tlsKeyFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.key"), - useAuthService: viper.GetBool("use_auth_service"), - authServiceName: viper.GetString("webhook_auth_service"), - authServicePort: viper.GetString("webhook_auth_service_port"), - authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), - dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), - useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), - cloudConfig: viper.GetString("cloudconfig"), - } - log.Info("Active settings:") log.Infof(" Webhook port : %s", config.port) log.Infof(" Serve metrics : %t", config.serveMetrics) From 715cc379ad97a86f59b6edc45589d734f87c1722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 12:22:21 +0200 Subject: [PATCH 200/251] env-injector: move viper env extract out of init and handle cmd params seperatly --- cmd/azure-keyvault-secrets-webhook/main.go | 52 +++++++++++++--------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 2b6db838..74c6a133 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -83,7 +83,16 @@ type azureKeyVaultConfig struct { masterURL string } +type cmdParams struct { + version string + versionEnvImage string + kubeconfig string + masterURL string + cloudConfig string +} + var config azureKeyVaultConfig +var params cmdParams var ( podsMutatedCounter = promauto.NewCounter(prometheus.CounterOpts{ @@ -233,26 +242,11 @@ func initConfig() { } func init() { - config = azureKeyVaultConfig{ - port: viper.GetString("port"), - httpPort: viper.GetString("port_http"), - authType: viper.GetString("auth_type"), - serveMetrics: viper.GetBool("metrics_enabled"), - tlsCertFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.crt"), - tlsKeyFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.key"), - useAuthService: viper.GetBool("use_auth_service"), - authServiceName: viper.GetString("webhook_auth_service"), - authServicePort: viper.GetString("webhook_auth_service_port"), - authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), - dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), - useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), - } - - flag.StringVar(&config.version, "version", "", "Version of this component.") - flag.StringVar(&config.versionEnvImage, "versionenvimage", "", "Version of the env image component.") - flag.StringVar(&config.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") - flag.StringVar(&config.masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") - flag.StringVar(&config.cloudConfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") + flag.StringVar(¶ms.version, "version", "", "Version of this component.") + flag.StringVar(¶ms.versionEnvImage, "versionenvimage", "", "Version of the env image component.") + flag.StringVar(¶ms.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") + flag.StringVar(¶ms.masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") + flag.StringVar(¶ms.cloudConfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") } func main() { @@ -268,6 +262,24 @@ func main() { akv2k8s.LogVersion() + config = azureKeyVaultConfig{ + port: viper.GetString("port"), + httpPort: viper.GetString("port_http"), + authType: viper.GetString("auth_type"), + serveMetrics: viper.GetBool("metrics_enabled"), + tlsCertFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.crt"), + tlsKeyFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.key"), + useAuthService: viper.GetBool("use_auth_service"), + authServiceName: viper.GetString("webhook_auth_service"), + authServicePort: viper.GetString("webhook_auth_service_port"), + authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), + dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), + useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), + version: params.version, + versionEnvImage: params.versionEnvImage, + cloudConfig: params.cloudConfig, + } + log.Info("Active settings:") log.Infof(" Webhook port : %s", config.port) log.Infof(" Serve metrics : %t", config.serveMetrics) From 6919f6c6632e4d9673f20d2a01820b80a77d95d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 12:48:15 +0200 Subject: [PATCH 201/251] env-injector: using go wait groups when spawning http servers --- cmd/azure-keyvault-secrets-webhook/main.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 74c6a133..19c07241 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -28,6 +28,7 @@ import ( "net/http" "os" "path/filepath" + "sync" "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" @@ -372,6 +373,9 @@ func main() { log.Fatalf("Error building kubernetes clientset: %s", err.Error()) } + wg := new(sync.WaitGroup) + wg.Add(2) + httpMux := http.NewServeMux() httpURL := fmt.Sprintf(":%s", config.httpPort) @@ -387,6 +391,7 @@ func main() { if err != nil { log.Fatalf("error serving metrics at %s: %+v", httpURL, err) } + wg.Done() }() router := mux.NewRouter() @@ -399,6 +404,7 @@ func main() { log.Infof("Serving encrypted healthz at %s/healthz", tlsURL) if config.useAuthService { + wg.Add(1) authURL := fmt.Sprintf(":%s", config.authServicePortInternal) authRouter := mux.NewRouter() @@ -411,11 +417,17 @@ func main() { if err != nil { log.Fatalf("error serving auth at %s: %+v", authURL, err) } + wg.Done() }() } - server := createServer(router, tlsURL, nil) - log.Fatal(server.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile)) + go func() { + server := createServer(router, tlsURL, nil) + log.Fatal(server.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile)) + wg.Done() + }() + + wg.Wait() } func createServerWithMTLS(caCert []byte, router http.Handler, url string) *http.Server { From ce858e2b2dbe618f7831e8e84fe2bac57dfd2d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 14:53:03 +0200 Subject: [PATCH 202/251] env-injector: get pod name from webhook context, as this is empty in pod object --- cmd/azure-keyvault-secrets-webhook/clientCert.go | 6 ++---- .../clientCert_test.go | 11 +---------- cmd/azure-keyvault-secrets-webhook/main.go | 14 +++++++++----- cmd/azure-keyvault-secrets-webhook/pod.go | 10 +++++----- 4 files changed, 17 insertions(+), 24 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert.go b/cmd/azure-keyvault-secrets-webhook/clientCert.go index 32d54be9..155cc664 100644 --- a/cmd/azure-keyvault-secrets-webhook/clientCert.go +++ b/cmd/azure-keyvault-secrets-webhook/clientCert.go @@ -10,8 +10,6 @@ import ( "fmt" "math/big" "time" - - corev1 "k8s.io/api/core/v1" ) type ClientCertificate struct { @@ -20,7 +18,7 @@ type ClientCertificate struct { Key []byte } -func generateClientCert(pod *corev1.Pod, validMonths int, caCert, caKey []byte) (*ClientCertificate, error) { +func generateClientCert(podName string, validMonths int, caCert, caKey []byte) (*ClientCertificate, error) { ca, err := tls.X509KeyPair(caCert, caKey) if err != nil { return nil, err @@ -52,7 +50,7 @@ func generateClientCert(pod *corev1.Pod, validMonths int, caCert, caKey []byte) SerialNumber: serialNumber, Subject: pkix.Name{ Organization: []string{"akv2k8s"}, - CommonName: pod.Name, + CommonName: podName, }, NotBefore: now, NotAfter: now.AddDate(0, validMonths, 0), diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert_test.go b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go index 615a8e07..01c6f6e6 100644 --- a/cmd/azure-keyvault-secrets-webhook/clientCert_test.go +++ b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go @@ -2,9 +2,6 @@ package main import ( "testing" - - corev1 "k8s.io/api/core/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) var caCert = []byte(`-----BEGIN CERTIFICATE----- @@ -58,13 +55,7 @@ IrepX5pgiugqVP5K+xYTIiQ28X3xstrq4sZHYXuO2yAVaILlVBp5/df/riRbymbQ -----END RSA PRIVATE KEY-----`) func TestDockerPull(t *testing.T) { - pod := &corev1.Pod{ - ObjectMeta: v1.ObjectMeta{ - Name: "akv2k8s-envinjector-6b49f6bcd-j8mhh", - }, - } - - clientCert, err := generateClientCert(pod, 24, caCert, caKey) + clientCert, err := generateClientCert("akv2k8s-envinjector-6b49f6bcd-j8mhh", 24, caCert, caKey) if err != nil { t.Error(err) } diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 19c07241..a799b1f2 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -44,11 +44,11 @@ import ( whcontext "github.com/slok/kubewebhook/pkg/webhook/context" "github.com/slok/kubewebhook/pkg/webhook/mutating" "github.com/spf13/viper" + "k8s.io/client-go/tools/clientcmd" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" ) const ( @@ -154,7 +154,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { podsInspectedCounter.Inc() - err := mutatePodSpec(pod, req.Namespace) + err := mutatePodSpec(pod, req.Namespace, req.Name) if err != nil { log.Errorf("failed to mutate pod, error: %+v", err) podsMutatedFailedCounter.Inc() @@ -363,11 +363,16 @@ func main() { log.Debug("getting azure key vault authorizer succeded") - cfg, err := rest.InClusterConfig() + cfg, err := clientcmd.BuildConfigFromFlags(params.masterURL, params.kubeconfig) if err != nil { - log.Fatalf("failed to get kubernetes in cluster config, error: %+v", err) + log.Fatalf("Error building kubeconfig: %s", err.Error()) } + // cfg, err := rest.InClusterConfig() + // if err != nil { + // log.Fatalf("failed to get kubernetes in cluster config, error: %+v", err) + // } + config.kubeClient, err = kubernetes.NewForConfig(cfg) if err != nil { log.Fatalf("Error building kubernetes clientset: %s", err.Error()) @@ -410,7 +415,6 @@ func main() { authRouter.HandleFunc("/auth/{namespace}/{pod}", authHandler) authServer := createServerWithMTLS(config.caCert, authRouter, authURL) - log.Infof("Serving encrypted auth with mtls at %s/auth", authURL) go func() { err := authServer.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index db2fe68e..40515f01 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -247,10 +247,10 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai return mutated, nil } -func createAuthServicePodSecret(pod *corev1.Pod, namespace string, caCert, caKey []byte) (*corev1.Secret, error) { +func createAuthServicePodSecret(pod *corev1.Pod, namespace string, podName string, caCert, caKey []byte) (*corev1.Secret, error) { // Create secret containing CA cert and mTLS credentials - clientCert, err := generateClientCert(pod, 24, caCert, caKey) + clientCert, err := generateClientCert(podName, 24, caCert, caKey) if err != nil { return nil, err } @@ -263,7 +263,7 @@ func createAuthServicePodSecret(pod *corev1.Pod, namespace string, caCert, caKey secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("akv2k8s-%s", pod.Name), + Name: fmt.Sprintf("akv2k8s-%s", podName), Namespace: namespace, OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(pod, schema.GroupVersionKind{ @@ -280,7 +280,7 @@ func createAuthServicePodSecret(pod *corev1.Pod, namespace string, caCert, caKey return secret, nil } -func mutatePodSpec(pod *corev1.Pod, namespace string) error { +func mutatePodSpec(pod *corev1.Pod, namespace, podName string) error { podSpec := &pod.Spec kubeConfig, err := rest.InClusterConfig() @@ -295,7 +295,7 @@ func mutatePodSpec(pod *corev1.Pod, namespace string) error { var authServiceSecret *corev1.Secret if config.useAuthService { - authServiceSecret, err = createAuthServicePodSecret(pod, namespace, config.caCert, config.caKey) + authServiceSecret, err = createAuthServicePodSecret(pod, namespace, podName, config.caCert, config.caKey) if err != nil { return err } From 05a3901ff8db8e8924c0ada2f31fd65185d56e26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 15:06:11 +0200 Subject: [PATCH 203/251] env-injector: use mutation id for create secret containing client-cert --- cmd/azure-keyvault-secrets-webhook/clientCert.go | 6 ++++-- cmd/azure-keyvault-secrets-webhook/pod.go | 11 ++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert.go b/cmd/azure-keyvault-secrets-webhook/clientCert.go index 155cc664..099fa926 100644 --- a/cmd/azure-keyvault-secrets-webhook/clientCert.go +++ b/cmd/azure-keyvault-secrets-webhook/clientCert.go @@ -10,6 +10,8 @@ import ( "fmt" "math/big" "time" + + "k8s.io/apimachinery/pkg/types" ) type ClientCertificate struct { @@ -18,7 +20,7 @@ type ClientCertificate struct { Key []byte } -func generateClientCert(podName string, validMonths int, caCert, caKey []byte) (*ClientCertificate, error) { +func generateClientCert(mutationID types.UID, validMonths int, caCert, caKey []byte) (*ClientCertificate, error) { ca, err := tls.X509KeyPair(caCert, caKey) if err != nil { return nil, err @@ -50,7 +52,7 @@ func generateClientCert(podName string, validMonths int, caCert, caKey []byte) ( SerialNumber: serialNumber, Subject: pkix.Name{ Organization: []string{"akv2k8s"}, - CommonName: podName, + CommonName: string(mutationID), }, NotBefore: now, NotAfter: now.AddDate(0, validMonths, 0), diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index 40515f01..c364cb49 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -31,6 +31,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) @@ -247,10 +248,10 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai return mutated, nil } -func createAuthServicePodSecret(pod *corev1.Pod, namespace string, podName string, caCert, caKey []byte) (*corev1.Secret, error) { +func createAuthServicePodSecret(pod *corev1.Pod, namespace string, mutationID types.UID, caCert, caKey []byte) (*corev1.Secret, error) { // Create secret containing CA cert and mTLS credentials - clientCert, err := generateClientCert(podName, 24, caCert, caKey) + clientCert, err := generateClientCert(mutationID, 24, caCert, caKey) if err != nil { return nil, err } @@ -263,7 +264,7 @@ func createAuthServicePodSecret(pod *corev1.Pod, namespace string, podName strin secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("akv2k8s-%s", podName), + Name: fmt.Sprintf("akv2k8s-%s", mutationID), Namespace: namespace, OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(pod, schema.GroupVersionKind{ @@ -280,7 +281,7 @@ func createAuthServicePodSecret(pod *corev1.Pod, namespace string, podName strin return secret, nil } -func mutatePodSpec(pod *corev1.Pod, namespace, podName string) error { +func mutatePodSpec(pod *corev1.Pod, namespace string, mutationID types.UID) error { podSpec := &pod.Spec kubeConfig, err := rest.InClusterConfig() @@ -295,7 +296,7 @@ func mutatePodSpec(pod *corev1.Pod, namespace, podName string) error { var authServiceSecret *corev1.Secret if config.useAuthService { - authServiceSecret, err = createAuthServicePodSecret(pod, namespace, podName, config.caCert, config.caKey) + authServiceSecret, err = createAuthServicePodSecret(pod, namespace, mutationID, config.caCert, config.caKey) if err != nil { return err } From f16d1b0e1f2cdeff40a369edb71876334dbf5b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 15:12:47 +0200 Subject: [PATCH 204/251] env-injector: have test for client cert use uid for pod name --- cmd/azure-keyvault-secrets-webhook/clientCert_test.go | 7 +++++-- cmd/azure-keyvault-secrets-webhook/main.go | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert_test.go b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go index 01c6f6e6..e7d2df4a 100644 --- a/cmd/azure-keyvault-secrets-webhook/clientCert_test.go +++ b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go @@ -2,6 +2,8 @@ package main import ( "testing" + + "k8s.io/apimachinery/pkg/types" ) var caCert = []byte(`-----BEGIN CERTIFICATE----- @@ -54,8 +56,9 @@ IrepX5pgiugqVP5K+xYTIiQ28X3xstrq4sZHYXuO2yAVaILlVBp5/df/riRbymbQ 7vphGG+/JeJJ6sb2yw48kYfQBroTO49aaf+A3LjykrkL+qAecX331w== -----END RSA PRIVATE KEY-----`) -func TestDockerPull(t *testing.T) { - clientCert, err := generateClientCert("akv2k8s-envinjector-6b49f6bcd-j8mhh", 24, caCert, caKey) +func TestCreateClientCert(t *testing.T) { + uid := types.UID("asdlkfjalsdjflj") + clientCert, err := generateClientCert(uid, 24, caCert, caKey) if err != nil { t.Error(err) } diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index a799b1f2..19804abf 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -154,7 +154,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { podsInspectedCounter.Inc() - err := mutatePodSpec(pod, req.Namespace, req.Name) + err := mutatePodSpec(pod, req.Namespace, req.UID) if err != nil { log.Errorf("failed to mutate pod, error: %+v", err) podsMutatedFailedCounter.Inc() From 470b4159e39b35257491bbf28d04158f08fc1c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 15:35:07 +0200 Subject: [PATCH 205/251] env-injector: remove owner ref for client-cert secret, as we cannot get the name of pod --- cmd/azure-keyvault-secrets-webhook/pod.go | 25 +++++++++++++++-------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index c364cb49..edf9adbe 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -29,8 +29,8 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/viper" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -192,7 +192,14 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai if useAuthService { _, err := config.kubeClient.CoreV1().Secrets(namespace).Create(authServiceSecret) if err != nil { - return false, err + if errors.IsAlreadyExists(err) { + _, err = config.kubeClient.CoreV1().Secrets(namespace).Update(authServiceSecret) + if err != nil { + return false, err + } + } else { + return false, err + } } container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{ @@ -266,13 +273,13 @@ func createAuthServicePodSecret(pod *corev1.Pod, namespace string, mutationID ty ObjectMeta: metav1.ObjectMeta{ Name: fmt.Sprintf("akv2k8s-%s", mutationID), Namespace: namespace, - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(pod, schema.GroupVersionKind{ - Group: metav1.SchemeGroupVersion.Group, - Version: metav1.SchemeGroupVersion.Version, - Kind: "Pod", - }), - }, + // OwnerReferences: []metav1.OwnerReference{ + // *metav1.NewControllerRef(pod, schema.GroupVersionKind{ + // Group: metav1.SchemeGroupVersion.Group, + // Version: metav1.SchemeGroupVersion.Version, + // Kind: "Pod", + // }), + // }, }, Type: corev1.SecretTypeTLS, Data: value, From 624b38e6c47858383bbcd0780faeb79045df184b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 16:07:31 +0200 Subject: [PATCH 206/251] env-injector: use env var for env-injector dir --- cmd/azure-keyvault-env/main.go | 2 -- cmd/azure-keyvault-secrets-webhook/main.go | 4 +++- cmd/azure-keyvault-secrets-webhook/pod.go | 16 +++++----------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 43e702a8..a9a50695 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -44,7 +44,6 @@ type injectorConfig struct { namespace string podName string clientCertDir string - akvDir string retryTimes int waitTimeBetweenRetries int useAuthService bool @@ -173,7 +172,6 @@ func main() { namespace: viper.GetString("env_injector_pod_namespace"), podName: viper.GetString("env_injector_pod_name"), clientCertDir: viper.GetString("env_injector_client_cert_dir"), - akvDir: viper.GetString("env_injector_exec_dir"), retryTimes: viper.GetInt("env_injector_retries"), waitTimeBetweenRetries: viper.GetInt("env_injector_wait_before_retry"), useAuthService: viper.GetBool("env_injector_use_auth_service"), diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 19804abf..7a54f4f5 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -54,7 +54,6 @@ import ( const ( dockerHubHost = "index.docker.io" oldDockerHubHost = "docker.io" - injectorDir = "/azure-keyvault/" injectorExecutable = "azure-keyvault-env" clientCertDir = "/var/client-cert/" initContainerVolumeName = "azure-keyvault-env" @@ -82,6 +81,7 @@ type azureKeyVaultConfig struct { versionEnvImage string kubeconfig string masterURL string + injectorDir string } type cmdParams struct { @@ -239,6 +239,7 @@ func initConfig() { viper.SetDefault("webhook_auth_service_port_internal", "8443") viper.SetDefault("log_level", "Info") viper.SetDefault("log_format", "fmt") + viper.SetDefault("env_injector_exec_dir", "/azure-keyvault/") viper.AutomaticEnv() } @@ -276,6 +277,7 @@ func main() { authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), + injectorDir: viper.GetString("env_injector_exec_dir"), version: params.version, versionEnvImage: params.versionEnvImage, cloudConfig: params.cloudConfig, diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index edf9adbe..862f0631 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -45,9 +45,7 @@ const ( // if default auth copies a read only version of azure config into // the /azure-keyvault/ folder to use as auth func getInitContainers() []corev1.Container { - fullExecPath := filepath.Join(injectorDir, injectorExecutable) - cmd := fmt.Sprintf("echo 'Copying %s to %s'", fullExecPath, injectorDir) - cmd = cmd + fmt.Sprintf(" && cp /usr/local/bin/%s %s", injectorExecutable, injectorDir) + cmd := fmt.Sprintf("cp /usr/local/bin/%s %s", injectorExecutable, config.injectorDir) container := corev1.Container{ Name: "copy-azurekeyvault-env", @@ -57,7 +55,7 @@ func getInitContainers() []corev1.Container { VolumeMounts: []corev1.VolumeMount{ { Name: initContainerVolumeName, - MountPath: injectorDir, + MountPath: config.injectorDir, }, }, } @@ -155,7 +153,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai mutated = true - fullExecPath := filepath.Join(injectorDir, injectorExecutable) + fullExecPath := filepath.Join(config.injectorDir, injectorExecutable) log.Debugf("full exec path: %s", fullExecPath) container.Command = []string{fullExecPath} container.Args = autoArgs @@ -164,11 +162,11 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{ { Name: keyVaultEnvVolumeName, - MountPath: injectorDir, + MountPath: config.injectorDir, ReadOnly: true, }, }...) - log.Debugf("mounting volume '%s' to '%s'", keyVaultEnvVolumeName, injectorDir) + log.Debugf("mounting volume '%s' to '%s'", keyVaultEnvVolumeName, config.injectorDir) container.Env = append(container.Env, []corev1.EnvVar{ { @@ -183,10 +181,6 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai Name: "ENV_INJECTOR_USE_AUTH_SERVICE", Value: strconv.FormatBool(useAuthService), }, - { - Name: "ENV_INJECTOR_EXEC_DIR", - Value: injectorDir, - }, }...) if useAuthService { From a67ce926ccf54a5bfb8f7d9c611f7b285e7a916d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 17:18:50 +0200 Subject: [PATCH 207/251] vaultenv: changed from distroless to alpine - need cp cmd --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 85321dda..9c1e60f0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -79,7 +79,7 @@ ENTRYPOINT ["/usr/local/bin/ca-bundle-controller"] # -------- # vaultenv # -------- -FROM $BASEIMAGE AS vaultenv +FROM $BASE_ALPINE AS vaultenv ARG VCS_REF ARG BUILD_DATE ARG VCS_URL From 299927561f2fb12cf50be3e6ce6918c9e44a3e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 18:39:09 +0200 Subject: [PATCH 208/251] made AzureKeyVaultCredentials a interface to handle token serialization --- cmd/azure-keyvault-controller/main.go | 6 ++--- cmd/azure-keyvault-env/authentication.go | 4 +-- cmd/azure-keyvault-secrets-webhook/main.go | 2 +- pkg/azure/credentialprovider/akv.go | 25 +++++++++++-------- .../credentialprovider/credential_test.go | 4 +-- pkg/azure/credentialprovider/oauth.go | 4 +-- .../keyvault/client/azure_keyvault_service.go | 4 +-- 7 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index fa60b479..f7fcd0ea 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -112,7 +112,7 @@ func main() { eventBroadcaster.StartLogging(log.Tracef) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) - var vaultAuth *credentialprovider.AzureKeyVaultCredentials + var vaultAuth credentialprovider.AzureKeyVaultCredentials switch authType { case "azureCloudConfig": vaultAuth, err = getCredentialsFromCloudConfig(cloudConfig) @@ -174,7 +174,7 @@ func setLogLevel(logLevel string) { log.SetLevel(logrusLevel) } -func getCredentialsFromCloudConfig(cloudconfig string) (*credentialprovider.AzureKeyVaultCredentials, error) { +func getCredentialsFromCloudConfig(cloudconfig string) (credentialprovider.AzureKeyVaultCredentials, error) { f, err := os.Open(cloudconfig) if err != nil { log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) @@ -189,7 +189,7 @@ func getCredentialsFromCloudConfig(cloudconfig string) (*credentialprovider.Azur return cloudCnfProvider.GetAzureKeyVaultCredentials() } -func getCredentialsFromEnvironment() (*credentialprovider.AzureKeyVaultCredentials, error) { +func getCredentialsFromEnvironment() (credentialprovider.AzureKeyVaultCredentials, error) { provider, err := credentialprovider.NewFromEnvironment() if err != nil { log.Fatalf("failed to create azure credentials provider, error: %+v", err.Error()) diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go index 9b695bf9..2bb96323 100644 --- a/cmd/azure-keyvault-env/authentication.go +++ b/cmd/azure-keyvault-env/authentication.go @@ -59,7 +59,7 @@ func createHTTPClientWithTrustedCAAndMtls(caCert, clientCert, clientKey []byte) return tlsClient, nil } -func getCredentials(useAuthService bool, authServiceAddress string, clientCertDir string) (*credentialprovider.AzureKeyVaultCredentials, error) { +func getCredentials(useAuthService bool, authServiceAddress string, clientCertDir string) (credentialprovider.AzureKeyVaultCredentials, error) { if useAuthService { // caCert, clientCert, clientKey []byte caCert, err := ioutil.ReadFile(path.Join(clientCertDir, "ca.crt")) @@ -95,7 +95,7 @@ func getCredentials(useAuthService bool, authServiceAddress string, clientCertDi return nil, fmt.Errorf("failed to get credentials, %s", res.Status) } - var creds *credentialprovider.AzureKeyVaultCredentials + var creds *credentialprovider.OAuthCredentials err = json.NewDecoder(res.Body).Decode(&creds) if err != nil { diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 7a54f4f5..3b1a52c8 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -76,7 +76,7 @@ type azureKeyVaultConfig struct { authServicePort string authServicePortInternal string kubeClient *kubernetes.Clientset - credentials credentialprovider.Credentials + credentials credentialprovider.AzureKeyVaultCredentials version string versionEnvImage string kubeconfig string diff --git a/pkg/azure/credentialprovider/akv.go b/pkg/azure/credentialprovider/akv.go index c833ba11..4edbad92 100644 --- a/pkg/azure/credentialprovider/akv.go +++ b/pkg/azure/credentialprovider/akv.go @@ -30,27 +30,32 @@ const ( vmTypeStandard = "standard" ) +type AzureKeyVaultCredentials interface { + Authorizer() (autorest.Authorizer, error) + Endpoint(keyVaultName string) string +} + // AzureKeyVaultCredentials has credentials needed to authenticate with azure key vault. // These credentials will never expire -type AzureKeyVaultCredentials struct { +type keyVaultCredentials struct { ClientID string Token *adal.ServicePrincipalToken EndpointPartial string } // Authorizer gets an Authorizer from credentials -func (c AzureKeyVaultCredentials) Authorizer() (autorest.Authorizer, error) { +func (c *keyVaultCredentials) Authorizer() (autorest.Authorizer, error) { return createAuthorizerFromServicePrincipalToken(c.Token) } // Endpoint takes the name of the keyvault and creates a correct andpoint url -func (c AzureKeyVaultCredentials) Endpoint(keyVaultName string) string { +func (c *keyVaultCredentials) Endpoint(keyVaultName string) string { return fmt.Sprintf(c.EndpointPartial, keyVaultName) } // MarshalJSON will get a fresh oauth token from the service principal token and serialize. // This token will expire after the default oauth token lifetime for the service principal. -func (c AzureKeyVaultCredentials) MarshalJSON() ([]byte, error) { +func (c *keyVaultCredentials) MarshalJSON() ([]byte, error) { err := c.Token.Refresh() if err != nil { return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err) @@ -63,7 +68,7 @@ func (c AzureKeyVaultCredentials) MarshalJSON() ([]byte, error) { } // GetAzureKeyVaultCredentials will get Azure credentials -func (c UserAssignedManagedIdentityProvider) GetAzureKeyVaultCredentials(azureIdentity string, hostname string) (*AzureKeyVaultCredentials, error) { +func (c *UserAssignedManagedIdentityProvider) GetAzureKeyVaultCredentials(azureIdentity string, hostname string) (AzureKeyVaultCredentials, error) { err := c.aadClient.Init() if err != nil { return nil, err @@ -98,14 +103,14 @@ func (c UserAssignedManagedIdentityProvider) GetAzureKeyVaultCredentials(azureId return nil, err } - return &AzureKeyVaultCredentials{ + return &keyVaultCredentials{ Token: token, EndpointPartial: endpoint, }, nil } // GetAzureKeyVaultCredentials will get Azure credentials -func (c CloudConfigCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyVaultCredentials, error) { +func (c CloudConfigCredentialProvider) GetAzureKeyVaultCredentials() (AzureKeyVaultCredentials, error) { resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2) endpoint := resourceSplit[0] + "%s." + resourceSplit[1] @@ -114,18 +119,18 @@ func (c CloudConfigCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyV return nil, err } - return &AzureKeyVaultCredentials{ + return &keyVaultCredentials{ Token: token, EndpointPartial: endpoint, }, nil } // GetAzureKeyVaultCredentials will get Azure credentials -func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (*AzureKeyVaultCredentials, error) { +func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (AzureKeyVaultCredentials, error) { resourceSplit := strings.SplitAfterN(c.envSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2) endpoint := resourceSplit[0] + "%s." + resourceSplit[1] - akvCreds := &AzureKeyVaultCredentials{ + akvCreds := &keyVaultCredentials{ EndpointPartial: endpoint, } diff --git a/pkg/azure/credentialprovider/credential_test.go b/pkg/azure/credentialprovider/credential_test.go index 1419d919..fe5e6a77 100644 --- a/pkg/azure/credentialprovider/credential_test.go +++ b/pkg/azure/credentialprovider/credential_test.go @@ -78,7 +78,7 @@ func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) { t.Error(err) } - token := creds.Token + token := creds.(*keyVaultCredentials).Token err = token.Refresh() if err != nil { t.Error(err) @@ -146,7 +146,7 @@ func TestIntegrationAuthFromConfigAudience(t *testing.T) { t.Error(err) } - token := creds.Token + token := creds.(*keyVaultCredentials).Token err = token.Refresh() if err != nil { t.Error(err) diff --git a/pkg/azure/credentialprovider/oauth.go b/pkg/azure/credentialprovider/oauth.go index 7ab3069d..5f1b2d04 100644 --- a/pkg/azure/credentialprovider/oauth.go +++ b/pkg/azure/credentialprovider/oauth.go @@ -40,8 +40,8 @@ func (t crendentialsToken) OAuthToken() string { return t.token } -// AzureKeyVaultEndpoint takes the name of the keyvault and creates a correct andpoint url -func (c OAuthCredentials) AzureKeyVaultEndpoint(keyVaultName string) string { +// Endpoint takes the name of the keyvault and creates a correct andpoint url +func (c OAuthCredentials) Endpoint(keyVaultName string) string { return fmt.Sprintf(c.EndpointPartial, keyVaultName) } diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index e407ec61..134b047d 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -40,11 +40,11 @@ type Service interface { } type azureKeyVaultService struct { - credentials *credentialprovider.AzureKeyVaultCredentials + credentials credentialprovider.AzureKeyVaultCredentials } // NewService creates a new AzureKeyVaultService -func NewService(credentials *credentialprovider.AzureKeyVaultCredentials) Service { +func NewService(credentials credentialprovider.AzureKeyVaultCredentials) Service { return &azureKeyVaultService{ credentials: credentials, } From 02982c68acb9a3a0c0ab017e56ba9574d8199afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 20:14:23 +0200 Subject: [PATCH 209/251] env-injector: use owner ref and pod name with secret owner ref for client-cert --- cmd/azure-keyvault-secrets-webhook/main.go | 1 + cmd/azure-keyvault-secrets-webhook/pod.go | 25 ++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 3b1a52c8..277ef828 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -417,6 +417,7 @@ func main() { authRouter.HandleFunc("/auth/{namespace}/{pod}", authHandler) authServer := createServerWithMTLS(config.caCert, authRouter, authURL) + log.Infof("Serving encrypted auth at %s/auth", authURL) go func() { err := authServer.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index 862f0631..3b98631e 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -263,17 +263,24 @@ func createAuthServicePodSecret(pod *corev1.Pod, namespace string, mutationID ty "tls.key": clientCert.Key, } + name := pod.GetName() + ownerReferences := pod.GetOwnerReferences() + if name == "" { + if len(ownerReferences) > 0 { + if strings.Contains(ownerReferences[0].Name, "-") { + generateNameSlice := strings.Split(ownerReferences[0].Name, "-") + name = strings.Join(generateNameSlice[:len(generateNameSlice)-1], "-") + } else { + name = ownerReferences[0].Name + } + } + } + secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("akv2k8s-%s", mutationID), - Namespace: namespace, - // OwnerReferences: []metav1.OwnerReference{ - // *metav1.NewControllerRef(pod, schema.GroupVersionKind{ - // Group: metav1.SchemeGroupVersion.Group, - // Version: metav1.SchemeGroupVersion.Version, - // Kind: "Pod", - // }), - // }, + Name: fmt.Sprintf("akv2k8s-%s", name), + Namespace: namespace, + OwnerReferences: ownerReferences, }, Type: corev1.SecretTypeTLS, Data: value, From f32d619af75b46f7c183647ed6306f473fc20a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 19 Oct 2020 23:10:41 +0200 Subject: [PATCH 210/251] remove old ca-bundle-controller image --- Dockerfile | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9c1e60f0..bb56bf70 100644 --- a/Dockerfile +++ b/Dockerfile @@ -55,27 +55,6 @@ COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubern ENV DEBUG false ENTRYPOINT ["/usr/local/bin/azure-keyvault-controller"] -# -------------------- -# CA Bundle Controller -# -------------------- -FROM $BASEIMAGE AS ca-bundle-controller -ARG VCS_REF -ARG BUILD_DATE -ARG VCS_URL -LABEL org.label-schema.schema-version="1.0" -LABEL org.label-schema.build-date=$BUILD_DATE -LABEL org.label-schema.vcs-ref=$VCS_REF -LABEL org.label-schema.vcs-url=$VCS_URL -LABEL org.label-schema.url=$VCS_URL -LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault" -LABEL org.label-schema.vendor="Sparebanken Vest" -LABEL org.label-schema.author="Jon Arild Tørresdal" - -COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/ca-bundle-controller /usr/local/bin/ -ENV DEBUG false -USER 65534 -ENTRYPOINT ["/usr/local/bin/ca-bundle-controller"] - # -------- # vaultenv # -------- From 4ba6723e23ba537564146dffb01acd42e9249b28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 20 Oct 2020 11:56:29 +0200 Subject: [PATCH 211/251] update temple for bug report --- .github/ISSUE_TEMPLATE/bug_report.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 626203fe..a4848a2b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,7 +7,14 @@ assignees: '' --- -**Note: Make sure to check out known issues (https://github.com/sparebankenvest/azure-key-vault-to-kubernetes#known-issues) before submitting** +**Note: Make sure to check out known issues (https://akv2k8s.io/troubleshooting/known-issues/) before submitting** + +**Components and versions** +Select which component(s) the bug relates to with [X]. + +[ ] Controller, version: `x.x.x` (docker image tag) +[ ] Env-Injector (webhook), version: `x.x.x` (docker image tag) +[ ] Other **Describe the bug** A clear and concise description of what the bug is. @@ -21,5 +28,9 @@ A clear and concise description of what you expected to happen. **Logs** If applicable, add logs to help explain your problem. +``` +paste log here... +``` + **Additional context** Add any other context about the problem here. From a4a23c8608c2b09c8133704cab9ab49e2a396c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Tue, 20 Oct 2020 21:21:59 +0200 Subject: [PATCH 212/251] controller: support sync to configmap --- .../controller/azureKeyVaultSecret.go | 258 +++++++++++++----- .../controller/configmap.go | 192 +++++++++++++ .../controller/controller.go | 11 +- .../controller/secret.go | 31 +-- .../controller/secret_handler.go | 148 ++++++++-- .../controller/secret_handler_test.go | 49 +++- .../keyvault/client/azure_keyvault_service.go | 2 +- pkg/k8s/apis/azurekeyvault/v2alpha1/types.go | 22 +- .../v2alpha1/zz_generated.deepcopy.go | 17 ++ 9 files changed, 585 insertions(+), 145 deletions(-) create mode 100644 cmd/azure-keyvault-controller/controller/configmap.go diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 2aaa949b..28eed69b 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -43,7 +43,7 @@ func (c *Controller) initAzureKeyVaultSecret() { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } - if c.akvsHasSecretOutput(secret) { + if c.akvsHasOutputDefined(secret) { log.Debugf("AzureKeyVaultSecret %s/%s added. Adding to queue.", secret.Namespace, secret.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) // queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), obj) @@ -61,13 +61,13 @@ func (c *Controller) initAzureKeyVaultSecret() { } // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv - if newSecret.ResourceVersion == oldSecret.ResourceVersion && c.akvsHasSecretOutput(newSecret) { + if newSecret.ResourceVersion == oldSecret.ResourceVersion && c.akvsHasOutputDefined(newSecret) { log.Debugf("AzureKeyVaultSecret %s/%s not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newSecret.Namespace, newSecret.Name) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } - if c.akvsHasSecretOutput(newSecret) || c.akvsHasSecretOutput(oldSecret) { + if c.akvsHasOutputDefined(newSecret) || c.akvsHasOutputDefined(oldSecret) { log.Debugf("AzureKeyVaultSecret %s/%s changed. Adding to queue.", newSecret.Namespace, newSecret.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), new) } @@ -78,7 +78,7 @@ func (c *Controller) initAzureKeyVaultSecret() { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } - if c.akvsHasSecretOutput(secret) { + if c.akvsHasOutputDefined(secret) { log.Debugf("AzureKeyVaultSecret %s/%s deleted. Adding to delete queue.", secret.Namespace, secret.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) @@ -94,97 +94,156 @@ func (c *Controller) initAzureKeyVaultSecret() { }) } -func convertToAzureKeyVaultSecret(obj interface{}) (*akv.AzureKeyVaultSecret, error) { - secret, ok := obj.(*akv.AzureKeyVaultSecret) - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) - } - secret, ok = tombstone.Obj.(*akv.AzureKeyVaultSecret) - if !ok { - return nil, fmt.Errorf("tombstone contained object that is not a AzureKeyVaultSecret %#v", obj) - } - } - return secret, nil -} - func (c *Controller) syncAzureKeyVaultSecret(key string) error { - var azureKeyVaultSecret *akv.AzureKeyVaultSecret - var secret *corev1.Secret + var akvs *akv.AzureKeyVaultSecret var err error log.Debugf("Processing AzureKeyVaultSecret %s", key) - if azureKeyVaultSecret, err = c.getAzureKeyVaultSecret(key); err != nil { + if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil } return err } - if secret, err = c.getOrCreateKubernetesSecret(azureKeyVaultSecret); err != nil { - return err + var outputObject metav1.Object + if c.akvsHasOutputSecret(akvs) { + secret, err := c.getOrCreateKubernetesSecret(akvs) + if err != nil { + return err + } + + log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) + c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) + outputObject = secret } - if !metav1.IsControlledBy(secret, azureKeyVaultSecret) { // checks if the object has a controllerRef set to the given owner - msg := fmt.Sprintf(MessageResourceExists, secret.Name) + if c.akvsHasOutputConfigMap(akvs) { + cm, err := c.getOrCreateKubernetesConfigMap(akvs) + if err != nil { + return err + } + + log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes configmap %s", key, fmt.Sprintf("%s/%s", cm.Namespace, cm.Name)) + c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) + outputObject = cm + } + + if !metav1.IsControlledBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner + msg := fmt.Sprintf(MessageResourceExists, outputObject.GetName()) log.Warning(msg) - c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrResourceExists, msg) + c.recorder.Event(akvs, corev1.EventTypeWarning, ErrResourceExists, msg) return fmt.Errorf(msg) } - log.Debugf("Successfully synced AzureKeyVaultSecret %s with Kubernetes Secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) - c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) return nil } -func (c *Controller) akvsHasSecretOutput(secret *akv.AzureKeyVaultSecret) bool { +func convertToAzureKeyVaultSecret(obj interface{}) (*akv.AzureKeyVaultSecret, error) { + secret, ok := obj.(*akv.AzureKeyVaultSecret) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) + } + secret, ok = tombstone.Obj.(*akv.AzureKeyVaultSecret) + if !ok { + return nil, fmt.Errorf("tombstone contained object that is not a AzureKeyVaultSecret %#v", obj) + } + } + return secret, nil +} + +func (c *Controller) akvsHasOutputDefined(secret *akv.AzureKeyVaultSecret) bool { + return c.akvsHasOutputSecret(secret) || c.akvsHasOutputConfigMap(secret) +} + +func (c *Controller) akvsHasOutputSecret(secret *akv.AzureKeyVaultSecret) bool { + return secret.Spec.Output.Secret.Name != "" +} + +func (c *Controller) akvsHasOutputConfigMap(secret *akv.AzureKeyVaultSecret) bool { return secret.Spec.Output.Secret.Name != "" } func (c *Controller) syncAzureKeyVault(key string) error { - var azureKeyVaultSecret *akv.AzureKeyVaultSecret - var secret *corev1.Secret - var secretValue map[string][]byte + var akvs *akv.AzureKeyVaultSecret + var secretHash string + var cmHash string var err error log.Debugf("Checking state for %s in Azure", key) - if azureKeyVaultSecret, err = c.getAzureKeyVaultSecret(key); err != nil { + if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil } return err } - log.Debugf("Getting secret value for %s in Azure", key) - if secretValue, err = c.getSecretFromKeyVault(azureKeyVaultSecret); err != nil { - msg := fmt.Sprintf(FailedAzureKeyVault, azureKeyVaultSecret.Name, azureKeyVaultSecret.Spec.Vault.Name) - log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, azureKeyVaultSecret.Spec.Vault.Name, azureKeyVaultSecret.Spec.Vault.Object.Name, err) - c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrAzureVault, msg) - return fmt.Errorf(msg) - } + if c.akvsHasOutputSecret(akvs) { + log.Debugf("Getting secret value for %s in Azure", key) + secretValue, err := c.getSecretFromKeyVault(akvs) + if err != nil { + msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) + log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) + c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg) + return fmt.Errorf(msg) + } - secretHash := getMD5Hash(secretValue) + secretHash = getMD5Hash(secretValue) - log.Debugf("Checking if secret value for %s has changed in Azure", key) - if azureKeyVaultSecret.Status.SecretHash != secretHash { - log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", azureKeyVaultSecret.Name) + log.Debugf("Checking if secret value for %s has changed in Azure", key) + if akvs.Status.SecretHash != secretHash { + log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", akvs.Name) - if secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secretValue)); err != nil { - log.Warningf("Failed to create Secret, Error: %+v", err) - return err + secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(createNewSecret(akvs, secretValue)) + if err != nil { + log.Warningf("Failed to create Secret, Error: %+v", err) + return err + } + + log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secret must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) } - log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secret must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) + log.Debugf("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, secretHash); err != nil { + return err + } } - log.Debugf("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) - if err = c.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, secretHash); err != nil { - return err + if c.akvsHasOutputConfigMap(akvs) { + log.Debugf("Getting secret value for %s in Azure", key) + cmValue, err := c.getConfigMapFromKeyVault(akvs) + if err != nil { + msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) + log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) + c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg) + return fmt.Errorf(msg) + } + + cmHash = getMD5HashForConfigMapValues(cmValue) + + log.Debugf("Checking if secret value for %s has changed in Azure", key) + if akvs.Status.ConfigMapHash != cmHash { + log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", akvs.Name) + + cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(createNewConfigMap(akvs, cmValue)) + if err != nil { + log.Warningf("Failed to create Secret, Error: %+v", err) + return err + } + + log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secret must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", cm.Name) + } + + log.Debugf("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, cmHash); err != nil { + return err + } } log.Debugf("Successfully synced AzureKeyVaultSecret %s with Azure Key Vault", key) - c.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) + c.recorder.Event(akvs, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) return nil } @@ -192,8 +251,21 @@ func (c *Controller) getAzureKeyVaultSecretFromSecret(secret *corev1.Secret, own return c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(secret.Namespace).Get(owner.Name) } +func (c *Controller) getAzureKeyVaultSecretFromConfigMap(cm *corev1.ConfigMap, owner *metav1.OwnerReference) (*akv.AzureKeyVaultSecret, error) { + return c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(cm.Namespace).Get(owner.Name) +} + +func (c *Controller) isOwnedByAzureKeyVaultSecret(obj metav1.Object) bool { + if ownerRef := metav1.GetControllerOf(obj); ownerRef != nil { + if ownerRef.Kind == "AzureKeyVaultSecret" { + return true + } + } + return false +} + func (c *Controller) getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string][]byte, error) { - var secretHandler KubernetesSecretHandler + var secretHandler KubernetesHandler switch azureKeyVaultSecret.Spec.Vault.Object.Type { case akv.AzureKeyVaultObjectTypeSecret: @@ -211,7 +283,29 @@ func (c *Controller) getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaul default: return nil, fmt.Errorf("azure key vault object type '%s' not currently supported", azureKeyVaultSecret.Spec.Vault.Object.Type) } - return secretHandler.Handle() + return secretHandler.HandleSecret() +} + +func (c *Controller) getConfigMapFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string]string, error) { + var cmHandler KubernetesHandler + + switch azureKeyVaultSecret.Spec.Vault.Object.Type { + case akv.AzureKeyVaultObjectTypeSecret: + transformator, err := transformers.CreateTransformator(&azureKeyVaultSecret.Spec.Output) + if err != nil { + return nil, err + } + cmHandler = NewAzureSecretHandler(azureKeyVaultSecret, c.vaultService, *transformator) + case akv.AzureKeyVaultObjectTypeCertificate: + cmHandler = NewAzureCertificateHandler(azureKeyVaultSecret, c.vaultService) + case akv.AzureKeyVaultObjectTypeKey: + cmHandler = NewAzureKeyHandler(azureKeyVaultSecret, c.vaultService) + case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret: + cmHandler = NewAzureMultiKeySecretHandler(azureKeyVaultSecret, c.vaultService) + default: + return nil, fmt.Errorf("azure key vault object type '%s' not currently supported", azureKeyVaultSecret.Spec.Vault.Object.Type) + } + return cmHandler.HandleConfigMap() } func (c *Controller) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, error) { @@ -244,23 +338,49 @@ func hasAzureKeyVaultSecretChanged(vaultSecret *akv.AzureKeyVaultSecret, secret return false } -func (c *Controller) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.AzureKeyVaultSecret, secretHash string) error { - secretName := determineSecretName(azureKeyVaultSecret) +func hasAzureKeyVaultSecretChangedForConfigMap(vaultSecret *akv.AzureKeyVaultSecret, cm *corev1.ConfigMap) bool { + // Check if dataKey has changed by trying to lookup key + if vaultSecret.Spec.Output.ConfigMap.DataKey != "" { + if _, ok := cm.Data[vaultSecret.Spec.Output.ConfigMap.DataKey]; !ok { + return true + } + } + return false +} + +func (c *Controller) updateAzureKeyVaultSecretStatus(akvs *akv.AzureKeyVaultSecret, secretName, cmName, secretHash, cmHash string) error { + akvsCopy := akvs.DeepCopy() + akvsCopy.Status.SecretName = secretName + akvsCopy.Status.SecretHash = secretHash + akvsCopy.Status.ConfigMapName = cmName + akvsCopy.Status.ConfigMapHash = cmHash + akvsCopy.Status.LastAzureUpdate = c.clock.Now() + + _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + return err +} + +func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKeyVaultSecret, secretHash string) error { + secretName := determineSecretName(akvs) + + akvsCopy := akvs.DeepCopy() + akvsCopy.Status.SecretName = secretName + akvsCopy.Status.SecretHash = secretHash + akvsCopy.Status.LastAzureUpdate = c.clock.Now() + + _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + return err +} - // NEVER modify objects from the store. It's a read-only, local cache. - // You can use DeepCopy() to make a deep copy of original object and modify this copy - // Or create a copy manually for better performance +func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.AzureKeyVaultSecret, cmHash string) error { + cmName := determineConfigMapName(akvs) - azureKeyVaultSecretCopy := azureKeyVaultSecret.DeepCopy() - azureKeyVaultSecretCopy.Status.SecretHash = secretHash - azureKeyVaultSecretCopy.Status.LastAzureUpdate = c.clock.Now() - azureKeyVaultSecretCopy.Status.SecretName = secretName + akvsCopy := akvs.DeepCopy() + akvsCopy.Status.ConfigMapName = cmName + akvsCopy.Status.ConfigMapHash = cmHash + akvsCopy.Status.LastAzureUpdate = c.clock.Now() - // If the CustomResourceSubresources feature gate is not enabled, - // we must use Update instead of UpdateStatus to update the Status block of the AzureKeyVaultSecret resource. - // UpdateStatus will not allow changes to the Spec of the resource, - // which is ideal for ensuring nothing other than resource status has been updated. - _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy) + _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go new file mode 100644 index 00000000..b91d8a8a --- /dev/null +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -0,0 +1,192 @@ +/* +Copyright Sparebanken Vest + +Based on the Kubernetes controller example at +https://github.com/kubernetes/sample-controller + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controller + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "fmt" + "sort" + + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + log "github.com/sirupsen/logrus" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/tools/cache" +) + +func convertToConfigMap(obj interface{}) (*corev1.ConfigMap, error) { + cm, ok := obj.(*corev1.ConfigMap) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) + } + cm, ok = tombstone.Obj.(*corev1.ConfigMap) + if !ok { + return nil, fmt.Errorf("tombstone contained object that is not a ConfigMap %#v", obj) + } + } + return cm, nil +} + +func (c *Controller) getConfigMap(key string) (*corev1.ConfigMap, error) { + namespace, name, err := cache.SplitMetaNamespaceKey(key) + if err != nil { + return nil, fmt.Errorf("invalid resource key: %s", key) + } + + log.Debugf("getting configmap %s from namespace %s", name, namespace) + cm, err := c.configMapsLister.ConfigMaps(namespace).Get(name) + + if err != nil { + return nil, err + } + return cm, err +} + +func (c *Controller) getOrCreateKubernetesConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (*corev1.ConfigMap, error) { + var cm *corev1.ConfigMap + var cmValues map[string]string + var err error + + cmName := azureKeyVaultSecret.Spec.Output.ConfigMap.Name + if cmName == "" { + return nil, fmt.Errorf("output configmap name must be specified using spec.output.configMap.name") + } + + log.Debugf("get or create configmap %s in namespace %s", cmName, azureKeyVaultSecret.Namespace) + if cm, err = c.configMapsLister.ConfigMaps(azureKeyVaultSecret.Namespace).Get(cmName); err != nil { + if errors.IsNotFound(err) { + cmValues, err = c.getConfigMapFromKeyVault(azureKeyVaultSecret) + if err != nil { + return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, err) + } + + if cm, err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Create(createNewConfigMap(azureKeyVaultSecret, cmValues)); err != nil { + return nil, err + } + + log.Infof("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) + if err = c.updateAzureKeyVaultSecretStatusForConfigMap(azureKeyVaultSecret, getMD5HashForConfigMapValues(cmValues)); err != nil { + return nil, err + } + + return cm, nil + } + } + + if cmName != cm.Name { + // Name of configmap has changed in AzureKeyVaultSecret, so we need to delete current configmap and recreate + // under new name + + // Delete configmap + if err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Delete(cm.Name, nil); err != nil { + return nil, err + } + + // Recreate configmap under new Name + if cm, err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Create(createNewConfigMap(azureKeyVaultSecret, cmValues)); err != nil { + return nil, err + } + return cm, nil + } + + if hasAzureKeyVaultSecretChangedForConfigMap(azureKeyVaultSecret, cm) { + log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, cmName) + cm, err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Update(createNewConfigMap(azureKeyVaultSecret, cm.Data)) + } + + return cm, err +} + +// createNewConfigMap creates a new ConfigMap for a AzureKeyVaultSecret resource. It also sets +// the appropriate OwnerReferences on the resource so handleObject can discover +// the AzureKeyVaultSecret resource that 'owns' it. +func createNewConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretValue map[string]string) *corev1.ConfigMap { + cmName := determineSecretName(azureKeyVaultSecret) + + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: cmName, + Namespace: azureKeyVaultSecret.Namespace, + Labels: azureKeyVaultSecret.Labels, + Annotations: azureKeyVaultSecret.Annotations, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(azureKeyVaultSecret, schema.GroupVersionKind{ + Group: akv.SchemeGroupVersion.Group, + Version: akv.SchemeGroupVersion.Version, + Kind: "AzureKeyVaultSecret", + }), + }, + }, + Data: azureSecretValue, + } +} + +func determineConfigMapName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string { + name := azureKeyVaultSecret.Spec.Output.ConfigMap.Name + if name == "" { + name = azureKeyVaultSecret.Name + } + return name +} + +func getMD5HashForConfigMapValues(values map[string]string) string { + var mergedValues bytes.Buffer + + keys := sortValueKeysForConfigMap(values) + + for _, k := range keys { + mergedValues.WriteString(k + values[k]) + } + + hasher := md5.New() + hasher.Write([]byte(mergedValues.String())) + return hex.EncodeToString(hasher.Sum(nil)) +} + +func sortValueKeysForConfigMap(values map[string]string) []string { + var keys []string + for k := range values { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} + +func handleConfigMapError(err error, key string) bool { + log.Debugf("Handling error for '%s' in ConfigMap: %s", key, err.Error()) + if err != nil { + // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. + if errors.IsNotFound(err) { + log.Debugf("Error for '%s' was 'Not Found'", key) + + utilruntime.HandleError(fmt.Errorf("ConfigMap '%s' in work queue no longer exists", key)) + return true + } + } + return false +} diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 67371100..f57d74f5 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -97,8 +97,10 @@ type Controller struct { namespaceAkvsLabel string // Secret - secretsLister corelisters.SecretLister - akvsSecretQueue *queue.Worker + secretsLister corelisters.SecretLister + + // ConfigMap + configMapsLister corelisters.ConfigMapLister // AzureKeyVaultSecret azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister @@ -139,6 +141,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI kubeInformerFactory: kubeInformerFactory, secretsLister: kubeInformerFactory.Core().V1().Secrets().Lister(), + configMapsLister: kubeInformerFactory.Core().V1().ConfigMaps().Lister(), azureKeyVaultSecretLister: akvInformerFactory.Keyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), options: options, @@ -148,7 +151,6 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI } controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) - controller.akvsSecretQueue = queue.New("Secrets", options.MaxNumRequeues, options.NumThreads, controller.syncSecret) controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) log.Info("Setting up event handlers") @@ -183,9 +185,6 @@ func (c *Controller) Run(stopCh <-chan struct{}) { log.Info("starting azure key vault secret queue") c.akvsCrdQueue.Run(stopCh) - log.Info("starting secret queue for azure key vault secrets") - c.akvsSecretQueue.Run(stopCh) - log.Info("starting azure key vault queue") c.azureKeyVaultQueue.Run(stopCh) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 883aac7a..d6b03ff7 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -28,7 +28,6 @@ import ( akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" log "github.com/sirupsen/logrus" - "kmodules.xyz/client-go/tools/queue" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -53,34 +52,6 @@ func convertToSecret(obj interface{}) (*corev1.Secret, error) { return secret, nil } -func (c *Controller) syncSecret(key string) error { - secret, err := c.getSecret(key) - if err != nil { - return err - } - - if ownerRef := metav1.GetControllerOf(secret); ownerRef != nil { - azureKeyVaultSecret, err := c.getAzureKeyVaultSecretFromSecret(secret, ownerRef) - if err != nil { - return err - } - - if c.akvsHasSecretOutput(azureKeyVaultSecret) { - queue.Enqueue(c.akvsCrdQueue.GetQueue(), azureKeyVaultSecret) - } - } - return nil -} - -func (c *Controller) isOwnedByAzureKeyVaultSecret(secret *corev1.Secret) bool { - if ownerRef := metav1.GetControllerOf(secret); ownerRef != nil { - if ownerRef.Kind == "AzureKeyVaultSecret" { - return true - } - } - return false -} - func (c *Controller) getSecret(key string) (*corev1.Secret, error) { namespace, name, err := cache.SplitMetaNamespaceKey(key) if err != nil { @@ -119,7 +90,7 @@ func (c *Controller) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureK } log.Infof("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) - if err = c.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, getMD5Hash(secretValues)); err != nil { + if err = c.updateAzureKeyVaultSecretStatusForSecret(azureKeyVaultSecret, getMD5Hash(secretValues)); err != nil { return nil, err } diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 8f370995..9321b494 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -30,70 +30,80 @@ import ( ) // KubernetesSecretHandler handles getting and formatting secrets from Azure Key Vault to Kubernetes -type KubernetesSecretHandler interface { - Handle() (map[string][]byte, error) +type KubernetesHandler interface { + HandleSecret() (map[string][]byte, error) + HandleConfigMap() (map[string]string, error) } -// AzureSecretHandler handles getting and formatting Azure Key Vault Secret from Azure Key Vault to Kubernetes -type AzureSecretHandler struct { +// azureSecretHandler handles getting and formatting Azure Key Vault Secret from Azure Key Vault to Kubernetes +type azureSecretHandler struct { secretSpec *akv.AzureKeyVaultSecret vaultService vault.Service transformator transformers.Transformator } -// AzureCertificateHandler handles getting and formatting Azure Key Vault Certificate from Azure Key Vault to Kubernetes -type AzureCertificateHandler struct { +// azureCertificateHandler handles getting and formatting Azure Key Vault Certificate from Azure Key Vault to Kubernetes +type azureCertificateHandler struct { secretSpec *akv.AzureKeyVaultSecret vaultService vault.Service } -// AzureKeyHandler handles getting and formatting Azure Key Vault Key from Azure Key Vault to Kubernetes -type AzureKeyHandler struct { +// azureKeyHandler handles getting and formatting Azure Key Vault Key from Azure Key Vault to Kubernetes +type azureKeyHandler struct { secretSpec *akv.AzureKeyVaultSecret vaultService vault.Service } -// AzureMultiValueSecretHandler handles getting and formatting Azure Key Vault Secret containing multiple values from Azure Key Vault to Kubernetes -type AzureMultiValueSecretHandler struct { +// azureMultiValueSecretHandler handles getting and formatting Azure Key Vault Secret containing multiple values from Azure Key Vault to Kubernetes +type azureMultiValueSecretHandler struct { secretSpec *akv.AzureKeyVaultSecret vaultService vault.Service } // NewAzureSecretHandler return a new AzureSecretHandler -func NewAzureSecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service, transformator transformers.Transformator) *AzureSecretHandler { - return &AzureSecretHandler{ +func NewAzureSecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service, transformator transformers.Transformator) *azureSecretHandler { + return &azureSecretHandler{ secretSpec: secretSpec, vaultService: vaultService, transformator: transformator, } } +// // NewAzureSecretHandler return a new AzureSecretHandler +// func NewAzureSecretConfigMapHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service, transformator transformers.Transformator) *azureSecretHandlerForKubernetesConfigMap { +// return &azureSecretHandlerForKubernetesConfigMap{ +// secretSpec: secretSpec, +// vaultService: vaultService, +// transformator: transformator, +// } +// } + // NewAzureCertificateHandler return a new AzureCertificateHandler -func NewAzureCertificateHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *AzureCertificateHandler { - return &AzureCertificateHandler{ +func NewAzureCertificateHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *azureCertificateHandler { + return &azureCertificateHandler{ secretSpec: secretSpec, vaultService: vaultService, } } // NewAzureKeyHandler returns a new AzureKeyHandler -func NewAzureKeyHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *AzureKeyHandler { - return &AzureKeyHandler{ +func NewAzureKeyHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *azureKeyHandler { + return &azureKeyHandler{ secretSpec: secretSpec, vaultService: vaultService, } } // NewAzureMultiKeySecretHandler returns a new AzureMultiKeySecretHandler -func NewAzureMultiKeySecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *AzureMultiValueSecretHandler { - return &AzureMultiValueSecretHandler{ +func NewAzureMultiKeySecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *azureMultiValueSecretHandler { + return &azureMultiValueSecretHandler{ secretSpec: secretSpec, vaultService: vaultService, } } // Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes -func (h *AzureSecretHandler) Handle() (map[string][]byte, error) { +func (h *azureSecretHandler) HandleSecret() (map[string][]byte, error) { if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.Secret.DataKey != "" { log.Warnf("output data key for %s/%s ignored, since vault object type is '%s' it will use its own keys", h.secretSpec.Namespace, h.secretSpec.Name, akv.AzureKeyVaultObjectTypeMultiKeyValueSecret) } @@ -139,8 +149,35 @@ func (h *AzureSecretHandler) Handle() (map[string][]byte, error) { return values, nil } +// Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes +func (h *azureSecretHandler) HandleConfigMap() (map[string]string, error) { + if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.ConfigMap.DataKey != "" { + log.Warnf("output data key for %s/%s ignored, since vault object type is '%s' it will use its own keys", h.secretSpec.Namespace, h.secretSpec.Name, akv.AzureKeyVaultObjectTypeMultiKeyValueSecret) + } + + values := make(map[string]string) + + secret, err := h.vaultService.GetSecret(&h.secretSpec.Spec.Vault) + if err != nil { + return nil, err + } + + secret, err = h.transformator.Transform(secret) + if err != nil { + return nil, err + } + + if h.secretSpec.Spec.Vault.Object.Type != akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && + h.secretSpec.Spec.Output.Secret.DataKey == "" { + return nil, fmt.Errorf("no datakey spesified for output secret") + } + values[h.secretSpec.Spec.Output.ConfigMap.DataKey] = secret + + return values, nil +} + // Handle getting and formating Azure Key Vault Certificate from Azure Key Vault to Kubernetes -func (h *AzureCertificateHandler) Handle() (map[string][]byte, error) { +func (h *azureCertificateHandler) HandleSecret() (map[string][]byte, error) { values := make(map[string][]byte) var err error options := vault.CertificateOptions{ @@ -178,8 +215,28 @@ func (h *AzureCertificateHandler) Handle() (map[string][]byte, error) { return values, nil } +// Handle getting and formating Azure Key Vault Certificate from Azure Key Vault to Kubernetes +func (h *azureCertificateHandler) HandleConfigMap() (map[string]string, error) { + values := make(map[string]string) + var err error + + cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, nil) + if err != nil { + return nil, err + } + + value, err := cert.ExportPublicKeyAsPem() + if err != nil { + return nil, err + } + + values[h.secretSpec.Spec.Output.Secret.DataKey] = string(value) + + return values, nil +} + // Handle getting and formating Azure Key Vault Key from Azure Key Vault to Kubernetes -func (h *AzureKeyHandler) Handle() (map[string][]byte, error) { +func (h *azureKeyHandler) HandleSecret() (map[string][]byte, error) { key, err := h.vaultService.GetKey(&h.secretSpec.Spec.Vault) if err != nil { return nil, err @@ -190,8 +247,20 @@ func (h *AzureKeyHandler) Handle() (map[string][]byte, error) { return values, nil } +// Handle getting and formating Azure Key Vault Key from Azure Key Vault to Kubernetes +func (h *azureKeyHandler) HandleConfigMap() (map[string]string, error) { + key, err := h.vaultService.GetKey(&h.secretSpec.Spec.Vault) + if err != nil { + return nil, err + } + + values := make(map[string]string) + values[h.secretSpec.Spec.Output.Secret.DataKey] = key + return values, nil +} + // Handle getting and formating Azure Key Vault Secret containing mulitple values from Azure Key Vault to Kubernetes -func (h *AzureMultiValueSecretHandler) Handle() (map[string][]byte, error) { +func (h *azureMultiValueSecretHandler) HandleSecret() (map[string][]byte, error) { values := make(map[string][]byte) if h.secretSpec.Spec.Vault.Object.ContentType == "" { @@ -224,3 +293,38 @@ func (h *AzureMultiValueSecretHandler) Handle() (map[string][]byte, error) { return values, nil } + +// Handle getting and formating Azure Key Vault Secret containing mulitple values from Azure Key Vault to Kubernetes +func (h *azureMultiValueSecretHandler) HandleConfigMap() (map[string]string, error) { + values := make(map[string]string) + + if h.secretSpec.Spec.Vault.Object.ContentType == "" { + return nil, fmt.Errorf("cannot use '%s' without also specifying content type", akv.AzureKeyVaultObjectTypeMultiKeyValueSecret) + } + + secret, err := h.vaultService.GetSecret(&h.secretSpec.Spec.Vault) + if err != nil { + return nil, err + } + + var dat map[string]string + + switch h.secretSpec.Spec.Vault.Object.ContentType { + case akv.AzureKeyVaultObjectContentTypeJSON: + if err := json.Unmarshal([]byte(secret), &dat); err != nil { + return nil, err + } + case akv.AzureKeyVaultObjectContentTypeYaml: + if err := yaml.Unmarshal([]byte(secret), &dat); err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("content type '%s' not supported", h.secretSpec.Spec.Vault.Object.ContentType) + } + + for k, v := range dat { + values[k] = v + } + + return values, nil +} diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go index bb9ee362..c0f990a6 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go @@ -83,13 +83,21 @@ secondValue: some second value data`, secret.Spec.Vault.Object.ContentType = "application/x-yaml" handler := NewAzureMultiKeySecretHandler(secret, fakeVault) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } if len(values) != 2 { t.Errorf("number of values returned should be 2 but were %d", len(values)) } + + valuesCM, err := handler.HandleConfigMap() + if err != nil { + t.Error(err) + } + if len(valuesCM) != 2 { + t.Errorf("number of values returned should be 2 but were %d", len(values)) + } } func TestHandleSecretWithNoDataKey(t *testing.T) { @@ -100,7 +108,24 @@ func TestHandleSecretWithNoDataKey(t *testing.T) { secret := secret() transformator, err := transformers.CreateTransformator(&secret.Spec.Output) handler := NewAzureSecretHandler(secret, fakeVault, *transformator) - values, err := handler.Handle() + values, err := handler.HandleSecret() + if err == nil { + t.Error("Should fail when no datakey is spesified") + } + if values != nil { + t.Error("handler should not have returned values") + } +} + +func TestHandleConfigMapWithNoDataKey(t *testing.T) { + fakeVault := &fakeVaultService{ + fakeSecretValue: "Some very secret data", + } + + secret := secret() + transformator, err := transformers.CreateTransformator(&secret.Spec.Output) + handler := NewAzureSecretHandler(secret, fakeVault, *transformator) + values, err := handler.HandleConfigMap() if err == nil { t.Error("Should fail when no datakey is spesified") } @@ -119,7 +144,7 @@ func TestHandleCertificateWithTlsOutput(t *testing.T) { secret.Spec.Output.Secret.Type = corev1.SecretTypeTLS handler := NewAzureCertificateHandler(secret, fakeVault) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } @@ -147,7 +172,7 @@ func TestHandlePubliKeyCertificateOnlyWithTlsOutput(t *testing.T) { secret.Spec.Output.Secret.Type = corev1.SecretTypeTLS handler := NewAzureCertificateHandler(secret, fakeVault) - _, err := handler.Handle() + _, err := handler.HandleSecret() if err == nil { t.Error("Handler should fail because there are no private key in certificate") } @@ -163,7 +188,7 @@ func TestHandlePubliKeyCertificateWithDataKey(t *testing.T) { secret.Spec.Output.Secret.DataKey = "mykey" handler := NewAzureCertificateHandler(secret, fakeVault) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error("Should have returned error because there is no private key") } @@ -187,7 +212,7 @@ func TestHandleCertificateFailureWithNoOutputDataKey(t *testing.T) { secret.Spec.Vault.Object.Type = "certificate" handler := NewAzureCertificateHandler(secret, fakeVault) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err == nil { t.Error("Handler should fail because there are no dataKey defined") } @@ -206,7 +231,7 @@ func TestHandleCertificateWithOutputDataKey(t *testing.T) { secret.Spec.Output.Secret.DataKey = "my-key" handler := NewAzureCertificateHandler(secret, fakeVault) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } @@ -232,7 +257,7 @@ func TestHandleCertificateWithRawOutput(t *testing.T) { secret.Spec.Output.Secret.Type = corev1.SecretTypeOpaque handler := NewAzureCertificateHandler(secret, fakeVault) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } @@ -259,7 +284,7 @@ func TestHandleSecretWithBasicAuthOutput(t *testing.T) { transformator, err := transformers.CreateTransformator(&secret.Spec.Output) handler := NewAzureSecretHandler(secret, fakeVault, *transformator) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } @@ -288,7 +313,7 @@ func TestHandleSecretWithDockerConfigJsonAsOutput(t *testing.T) { transformator, err := transformers.CreateTransformator(&secret.Spec.Output) handler := NewAzureSecretHandler(secret, fakeVault, *transformator) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } @@ -314,7 +339,7 @@ func TestHandleSecretWithDockerConfigAsOutput(t *testing.T) { transformator, err := transformers.CreateTransformator(&secret.Spec.Output) handler := NewAzureSecretHandler(secret, fakeVault, *transformator) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } @@ -340,7 +365,7 @@ func TestHandleSecretWithSSHAuthAsOutput(t *testing.T) { transformator, err := transformers.CreateTransformator(&secret.Spec.Output) handler := NewAzureSecretHandler(secret, fakeVault, *transformator) - values, err := handler.Handle() + values, err := handler.HandleSecret() if err != nil { t.Error(err) } diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index 134b047d..5235933f 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -121,7 +121,7 @@ func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, opt return nil, fmt.Errorf("failed to get certificate from azure key vault, error: %+v", err) } - if options.ExportPrivateKey { + if options != nil && options.ExportPrivateKey { if !*certBundle.Policy.KeyProperties.Exportable { return nil, fmt.Errorf("cannot export private key because key is not exportable in azure key vault") } diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go index 3acfb574..ca767c73 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go @@ -95,7 +95,8 @@ const ( // AzureKeyVaultOutput defines output sources, currently only support Secret type AzureKeyVaultOutput struct { - Secret AzureKeyVaultOutputSecret `json:"secret"` + Secret AzureKeyVaultOutputSecret `json:"secret"` + ConfigMap AzureKeyVaultOutputConfigMap `json:"configMap"` // +optional Transforms []string `json:"transforms,omitempty"` } @@ -105,14 +106,25 @@ type AzureKeyVaultOutput struct { type AzureKeyVaultOutputSecret struct { Name string `json:"name"` // +optional - Type corev1.SecretType `json:"type,omitempty"` - DataKey string `json:"dataKey"` - ChainOrder string `json:"chainOrder"` + Type corev1.SecretType `json:"type,omitempty"` + // +optional + DataKey string `json:"dataKey,omitempty"` + // +optional + ChainOrder string `json:"chainOrder,omitempty"` +} + +// AzureKeyVaultOutputConfigMap has information needed to output +// a secret from Azure Key Vault to Kubertnetes as a ConfigMap resource +type AzureKeyVaultOutputConfigMap struct { + Name string `json:"name"` + DataKey string `json:"dataKey"` } // AzureKeyVaultSecretStatus is the status for a AzureKeyVaultSecret resource type AzureKeyVaultSecretStatus struct { SecretHash string `json:"secretHash"` - LastAzureUpdate metav1.Time `json:"lastAzureUpdate,omitempty"` SecretName string `json:"secretName"` + ConfigMapHash string `json:"configMapHash"` + ConfigMapName string `json:"configMapName"` + LastAzureUpdate metav1.Time `json:"lastAzureUpdate,omitempty"` } diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go index 6adfc04e..ab724864 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go +++ b/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go @@ -64,6 +64,7 @@ func (in *AzureKeyVaultObject) DeepCopy() *AzureKeyVaultObject { func (in *AzureKeyVaultOutput) DeepCopyInto(out *AzureKeyVaultOutput) { *out = *in out.Secret = in.Secret + out.ConfigMap = in.ConfigMap if in.Transforms != nil { in, out := &in.Transforms, &out.Transforms *out = make([]string, len(*in)) @@ -82,6 +83,22 @@ func (in *AzureKeyVaultOutput) DeepCopy() *AzureKeyVaultOutput { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureKeyVaultOutputConfigMap) DeepCopyInto(out *AzureKeyVaultOutputConfigMap) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultOutputConfigMap. +func (in *AzureKeyVaultOutputConfigMap) DeepCopy() *AzureKeyVaultOutputConfigMap { + if in == nil { + return nil + } + out := new(AzureKeyVaultOutputConfigMap) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AzureKeyVaultOutputSecret) DeepCopyInto(out *AzureKeyVaultOutputSecret) { *out = *in From 0ae8e07802601a731d91e2431ae8588cf9d2ac34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 00:07:23 +0200 Subject: [PATCH 213/251] controller: support sync from multiple akvs to one secret/configmap --- .../controller/azureKeyVaultSecret.go | 104 +++++++----- .../controller/configmap.go | 120 ++++++++++--- .../controller/secret.go | 160 +++++++++++++++--- 3 files changed, 294 insertions(+), 90 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 28eed69b..21f34dee 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -139,37 +139,8 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return nil } -func convertToAzureKeyVaultSecret(obj interface{}) (*akv.AzureKeyVaultSecret, error) { - secret, ok := obj.(*akv.AzureKeyVaultSecret) - if !ok { - tombstone, ok := obj.(cache.DeletedFinalStateUnknown) - if !ok { - return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) - } - secret, ok = tombstone.Obj.(*akv.AzureKeyVaultSecret) - if !ok { - return nil, fmt.Errorf("tombstone contained object that is not a AzureKeyVaultSecret %#v", obj) - } - } - return secret, nil -} - -func (c *Controller) akvsHasOutputDefined(secret *akv.AzureKeyVaultSecret) bool { - return c.akvsHasOutputSecret(secret) || c.akvsHasOutputConfigMap(secret) -} - -func (c *Controller) akvsHasOutputSecret(secret *akv.AzureKeyVaultSecret) bool { - return secret.Spec.Output.Secret.Name != "" -} - -func (c *Controller) akvsHasOutputConfigMap(secret *akv.AzureKeyVaultSecret) bool { - return secret.Spec.Output.Secret.Name != "" -} - func (c *Controller) syncAzureKeyVault(key string) error { var akvs *akv.AzureKeyVaultSecret - var secretHash string - var cmHash string var err error log.Debugf("Checking state for %s in Azure", key) @@ -190,23 +161,32 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf(msg) } - secretHash = getMD5Hash(secretValue) + akvsValuesHash := getMD5HashOfByteValues(secretValue) log.Debugf("Checking if secret value for %s has changed in Azure", key) - if akvs.Status.SecretHash != secretHash { + if akvs.Status.SecretHash != akvsValuesHash { log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", akvs.Name) - secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(createNewSecret(akvs, secretValue)) + existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) if err != nil { - log.Warningf("Failed to create Secret, Error: %+v", err) - return err + return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) + } + + newSecret, err := updateExistingSecret(akvs, secretValue, existingSecret) + if err != nil { + return fmt.Errorf("failed to update existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) + } + + secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(newSecret) + if err != nil { + return fmt.Errorf("failed to update secret, error: %+v", err) } log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secret must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) } log.Debugf("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) - if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, secretHash); err != nil { + if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, akvsValuesHash); err != nil { return err } } @@ -221,7 +201,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf(msg) } - cmHash = getMD5HashForConfigMapValues(cmValue) + cmHash := getMD5HashOfStringValues(cmValue) log.Debugf("Checking if secret value for %s has changed in Azure", key) if akvs.Status.ConfigMapHash != cmHash { @@ -247,6 +227,33 @@ func (c *Controller) syncAzureKeyVault(key string) error { return nil } +func convertToAzureKeyVaultSecret(obj interface{}) (*akv.AzureKeyVaultSecret, error) { + secret, ok := obj.(*akv.AzureKeyVaultSecret) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj) + } + secret, ok = tombstone.Obj.(*akv.AzureKeyVaultSecret) + if !ok { + return nil, fmt.Errorf("tombstone contained object that is not a AzureKeyVaultSecret %#v", obj) + } + } + return secret, nil +} + +func (c *Controller) akvsHasOutputDefined(secret *akv.AzureKeyVaultSecret) bool { + return c.akvsHasOutputSecret(secret) || c.akvsHasOutputConfigMap(secret) +} + +func (c *Controller) akvsHasOutputSecret(secret *akv.AzureKeyVaultSecret) bool { + return secret.Spec.Output.Secret.Name != "" +} + +func (c *Controller) akvsHasOutputConfigMap(secret *akv.AzureKeyVaultSecret) bool { + return secret.Spec.Output.Secret.Name != "" +} + func (c *Controller) getAzureKeyVaultSecretFromSecret(secret *corev1.Secret, owner *metav1.OwnerReference) (*akv.AzureKeyVaultSecret, error) { return c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(secret.Namespace).Get(owner.Name) } @@ -323,28 +330,39 @@ func (c *Controller) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecre return azureKeyVaultSecret, err } -func hasAzureKeyVaultSecretChanged(vaultSecret *akv.AzureKeyVaultSecret, secret *corev1.Secret) bool { - secretType := determineSecretType(vaultSecret) +func hasAzureKeyVaultSecretChangedForSecret(akvs *akv.AzureKeyVaultSecret, akvsValues map[string][]byte, secret *corev1.Secret) bool { + // check if secret type has changed + secretType := determineSecretType(akvs) if secretType != secret.Type { return true } // Check if dataKey has changed by trying to lookup key - if vaultSecret.Spec.Output.Secret.DataKey != "" { - if _, ok := secret.Data[vaultSecret.Spec.Output.Secret.DataKey]; !ok { + if akvs.Spec.Output.Secret.DataKey != "" { + if _, ok := secret.Data[akvs.Spec.Output.Secret.DataKey]; !ok { return true } } + + // Check if data content has changed + if akvs.Status.SecretHash != getMD5HashOfSecret(akvsValues, secret) { + return true + } return false } -func hasAzureKeyVaultSecretChangedForConfigMap(vaultSecret *akv.AzureKeyVaultSecret, cm *corev1.ConfigMap) bool { +func hasAzureKeyVaultSecretChangedForConfigMap(akvs *akv.AzureKeyVaultSecret, akvsValues map[string]string, cm *corev1.ConfigMap) bool { // Check if dataKey has changed by trying to lookup key - if vaultSecret.Spec.Output.ConfigMap.DataKey != "" { - if _, ok := cm.Data[vaultSecret.Spec.Output.ConfigMap.DataKey]; !ok { + if akvs.Spec.Output.ConfigMap.DataKey != "" { + if _, ok := cm.Data[akvs.Spec.Output.ConfigMap.DataKey]; !ok { return true } } + + // Check if data content has changed + if akvs.Status.ConfigMapHash != getMD5HashOfConfigMap(akvsValues, cm) { + return true + } return false } diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index b91d8a8a..91d789a3 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -67,30 +67,30 @@ func (c *Controller) getConfigMap(key string) (*corev1.ConfigMap, error) { return cm, err } -func (c *Controller) getOrCreateKubernetesConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (*corev1.ConfigMap, error) { +func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecret) (*corev1.ConfigMap, error) { var cm *corev1.ConfigMap var cmValues map[string]string var err error - cmName := azureKeyVaultSecret.Spec.Output.ConfigMap.Name + cmName := akvs.Spec.Output.ConfigMap.Name if cmName == "" { return nil, fmt.Errorf("output configmap name must be specified using spec.output.configMap.name") } - log.Debugf("get or create configmap %s in namespace %s", cmName, azureKeyVaultSecret.Namespace) - if cm, err = c.configMapsLister.ConfigMaps(azureKeyVaultSecret.Namespace).Get(cmName); err != nil { + log.Debugf("get or create configmap %s in namespace %s", cmName, akvs.Namespace) + if cm, err = c.configMapsLister.ConfigMaps(akvs.Namespace).Get(cmName); err != nil { if errors.IsNotFound(err) { - cmValues, err = c.getConfigMapFromKeyVault(azureKeyVaultSecret) + cmValues, err = c.getConfigMapFromKeyVault(akvs) if err != nil { - return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, err) + return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) } - if cm, err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Create(createNewConfigMap(azureKeyVaultSecret, cmValues)); err != nil { + if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(createNewConfigMap(akvs, cmValues)); err != nil { return nil, err } - log.Infof("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) - if err = c.updateAzureKeyVaultSecretStatusForConfigMap(azureKeyVaultSecret, getMD5HashForConfigMapValues(cmValues)); err != nil { + log.Infof("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, getMD5HashOfStringValues(cmValues)); err != nil { return nil, err } @@ -98,25 +98,39 @@ func (c *Controller) getOrCreateKubernetesConfigMap(azureKeyVaultSecret *akv.Azu } } + // get updated secret values from azure key vault + cmValues, err = c.getConfigMapFromKeyVault(akvs) + if err != nil { + return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) + } + if cmName != cm.Name { // Name of configmap has changed in AzureKeyVaultSecret, so we need to delete current configmap and recreate // under new name - // Delete configmap - if err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Delete(cm.Name, nil); err != nil { - return nil, err + // Only delete if this akvs is the only owner + if !hasMultipleOwners(cm.GetOwnerReferences()) { + // Delete configmap + if err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Delete(cm.Name, nil); err != nil { + return nil, err + } } - // Recreate configmap under new Name - if cm, err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Create(createNewConfigMap(azureKeyVaultSecret, cmValues)); err != nil { + if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(createNewConfigMap(akvs, cmValues)); err != nil { return nil, err } return cm, nil } - if hasAzureKeyVaultSecretChangedForConfigMap(azureKeyVaultSecret, cm) { - log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, cmName) - cm, err = c.kubeclientset.CoreV1().ConfigMaps(azureKeyVaultSecret.Namespace).Update(createNewConfigMap(azureKeyVaultSecret, cm.Data)) + if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) { + log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", akvs.Namespace, akvs.Name, cmName) + + updatedCM, err := updateExistingConfigMap(akvs, cmValues, cm) + if err != nil { + return nil, err + } + + cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(updatedCM) } return cm, err @@ -146,6 +160,53 @@ func createNewConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecre } } +// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets +// the appropriate OwnerReferences on the resource so handleObject can discover +// the AzureKeyVaultSecret resource that 'owns' it. +func updateExistingConfigMap(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) { + cmName := determineConfigMapName(akvs) + cmClone := existingCM.DeepCopy() + ownerRefs := cmClone.GetOwnerReferences() + + if !metav1.IsControlledBy(existingCM, akvs) { + ownerRefs = append(ownerRefs, *metav1.NewControllerRef(akvs, schema.GroupVersionKind{ + Group: akv.SchemeGroupVersion.Group, + Version: akv.SchemeGroupVersion.Version, + Kind: "AzureKeyVaultSecret", + })) + } + + mergedValues := mergeValuesWithExistingConfigMap(values, existingCM) + + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: cmName, + Namespace: akvs.Namespace, + Labels: akvs.Labels, + Annotations: akvs.Annotations, + OwnerReferences: ownerRefs, + }, + Data: mergedValues, + }, nil +} + +func mergeValuesWithExistingConfigMap(values map[string]string, cm *corev1.ConfigMap) map[string]string { + newValues := make(map[string]string) + + // copy existing values into new map + for k, v := range values { + newValues[k] = v + } + + // copy any values from existing secret that does not exist in akvs values + for key, val := range cm.Data { + if _, ok := values[key]; !ok { + newValues[key] = val + } + } + return newValues +} + func determineConfigMapName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string { name := azureKeyVaultSecret.Spec.Output.ConfigMap.Name if name == "" { @@ -154,10 +215,11 @@ func determineConfigMapName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string return name } -func getMD5HashForConfigMapValues(values map[string]string) string { +func getMD5HashOfStringValues(values map[string]string) string { var mergedValues bytes.Buffer - keys := sortValueKeysForConfigMap(values) + // sort keys to make sure hash is consistant + keys := sortStringValueKeys(values) for _, k := range keys { mergedValues.WriteString(k + values[k]) @@ -168,7 +230,25 @@ func getMD5HashForConfigMapValues(values map[string]string) string { return hex.EncodeToString(hasher.Sum(nil)) } -func sortValueKeysForConfigMap(values map[string]string) []string { +func getMD5HashOfConfigMap(akvsValues map[string]string, cm *corev1.ConfigMap) string { + // filter out only values related to this akvs, + // as multiple akvs can write to a single secret + values := filterStringValueKeys(akvsValues, cm.Data) + return getMD5HashOfStringValues(values) +} + +func filterStringValueKeys(akvsValues, cmValues map[string]string) map[string]string { + filtered := make(map[string]string) + + for key := range akvsValues { + if cmVal, ok := cmValues[key]; ok { + filtered[key] = cmVal + } + } + return filtered +} + +func sortStringValueKeys(values map[string]string) []string { var keys []string for k := range values { keys = append(keys, k) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index d6b03ff7..8658da6c 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -67,30 +67,30 @@ func (c *Controller) getSecret(key string) (*corev1.Secret, error) { return secret, err } -func (c *Controller) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (*corev1.Secret, error) { +func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) (*corev1.Secret, error) { var secret *corev1.Secret var secretValues map[string][]byte var err error - secretName := azureKeyVaultSecret.Spec.Output.Secret.Name + secretName := akvs.Spec.Output.Secret.Name if secretName == "" { return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name") } - log.Debugf("Get or create secret %s in namespace %s", secretName, azureKeyVaultSecret.Namespace) - if secret, err = c.secretsLister.Secrets(azureKeyVaultSecret.Namespace).Get(secretName); err != nil { + log.Debugf("Get or create secret %s in namespace %s", secretName, akvs.Namespace) + if secret, err = c.secretsLister.Secrets(akvs.Namespace).Get(secretName); err != nil { if errors.IsNotFound(err) { - secretValues, err = c.getSecretFromKeyVault(azureKeyVaultSecret) + secretValues, err = c.getSecretFromKeyVault(akvs) if err != nil { - return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, err) + return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) } - if secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil { + if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(createNewSecret(akvs, secretValues)); err != nil { return nil, err } - log.Infof("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name) - if err = c.updateAzureKeyVaultSecretStatusForSecret(azureKeyVaultSecret, getMD5Hash(secretValues)); err != nil { + log.Infof("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, getMD5HashOfByteValues(secretValues)); err != nil { return nil, err } @@ -98,45 +98,72 @@ func (c *Controller) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureK } } + // get updated secret values from azure key vault + secretValues, err = c.getSecretFromKeyVault(akvs) + if err != nil { + return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) + } + if secretName != secret.Name { // Name of secret has changed in AzureKeyVaultSecret, so we need to delete current Secret and recreate // under new name - // Delete secret - if err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Delete(secret.Name, nil); err != nil { - return nil, err + // Only delete if this akvs is the only owner + if !hasMultipleOwners(secret.GetOwnerReferences()) { + // Delete secret + if err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Delete(secret.Name, nil); err != nil { + return nil, err + } } // Recreate secret under new Name - if secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil { + if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(createNewSecret(akvs, secretValues)); err != nil { return nil, err } return secret, nil } - if hasAzureKeyVaultSecretChanged(azureKeyVaultSecret, secret) { - log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, secretName) - secret, err = c.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secret.Data)) + if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { + log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", akvs.Namespace, akvs.Name, secretName) + + updatedSecret, err := updateExistingSecret(akvs, secretValues, secret) + if err != nil { + return nil, err + } + secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(updatedSecret) } return secret, err } +func hasMultipleOwners(refs []metav1.OwnerReference) bool { + hits := 0 + for _, ref := range refs { + if ref.Kind == "AzureKeyVaultSecret" { + hits = hits + 1 + } + if hits > 1 { + return true + } + } + return false +} + // newSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. -func createNewSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretValue map[string][]byte) *corev1.Secret { - secretName := determineSecretName(azureKeyVaultSecret) - secretType := determineSecretType(azureKeyVaultSecret) +func createNewSecret(akvs *akv.AzureKeyVaultSecret, azureSecretValues map[string][]byte) *corev1.Secret { + secretName := determineSecretName(akvs) + secretType := determineSecretType(akvs) return &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, - Namespace: azureKeyVaultSecret.Namespace, - Labels: azureKeyVaultSecret.Labels, - Annotations: azureKeyVaultSecret.Annotations, + Namespace: akvs.Namespace, + Labels: akvs.Labels, + Annotations: akvs.Annotations, OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(azureKeyVaultSecret, schema.GroupVersionKind{ + *metav1.NewControllerRef(akvs, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, Version: akv.SchemeGroupVersion.Version, Kind: "AzureKeyVaultSecret", @@ -144,10 +171,70 @@ func createNewSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretVa }, }, Type: secretType, - Data: azureSecretValue, + Data: azureSecretValues, } } +// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets +// the appropriate OwnerReferences on the resource so handleObject can discover +// the AzureKeyVaultSecret resource that 'owns' it. +func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) { + secretName := determineSecretName(akvs) + secretType := determineSecretType(akvs) + + // if existing secret is not opaque and owned by a different akvs, + // we cannot update this secret, as none opaque secrets cannot have multiple owners, + // because they would overrite each others keys + if existingSecret.Type != corev1.SecretTypeOpaque { + if !metav1.IsControlledBy(existingSecret, akvs) { + controlledBy := metav1.GetControllerOf(existingSecret) + return nil, fmt.Errorf("cannot update existing secret %s/%s of type %s controlled by %s, as this azurekeyvalutsecret %s would overwrite keys", existingSecret.Namespace, existingSecret.Name, existingSecret.Type, controlledBy.Name, akvs.Name) + } + } + + secretClone := existingSecret.DeepCopy() + ownerRefs := secretClone.GetOwnerReferences() + + if !metav1.IsControlledBy(existingSecret, akvs) { + ownerRefs = append(ownerRefs, *metav1.NewControllerRef(akvs, schema.GroupVersionKind{ + Group: akv.SchemeGroupVersion.Group, + Version: akv.SchemeGroupVersion.Version, + Kind: "AzureKeyVaultSecret", + })) + } + + mergedValues := mergeValuesWithExistingSecret(values, existingSecret) + + return &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Namespace: akvs.Namespace, + Labels: akvs.Labels, + Annotations: akvs.Annotations, + OwnerReferences: ownerRefs, + }, + Type: secretType, + Data: mergedValues, + }, nil +} + +func mergeValuesWithExistingSecret(values map[string][]byte, secret *corev1.Secret) map[string][]byte { + newValues := make(map[string][]byte) + + // copy existing values into new map + for k, v := range values { + newValues[k] = v + } + + // copy any values from existing secret that does not exist in akvs values + for key, val := range secret.Data { + if _, ok := values[key]; !ok { + newValues[key] = val + } + } + return newValues +} + func determineSecretName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string { name := azureKeyVaultSecret.Spec.Output.Secret.Name if name == "" { @@ -164,10 +251,11 @@ func determineSecretType(azureKeyVaultSecret *akv.AzureKeyVaultSecret) corev1.Se return azureKeyVaultSecret.Spec.Output.Secret.Type } -func getMD5Hash(values map[string][]byte) string { +func getMD5HashOfByteValues(values map[string][]byte) string { var mergedValues bytes.Buffer - keys := sortValueKeys(values) + // sort keys to make sure hash is consistant + keys := sortByteValueKeys(values) for _, k := range keys { mergedValues.WriteString(k + string(values[k])) @@ -178,7 +266,25 @@ func getMD5Hash(values map[string][]byte) string { return hex.EncodeToString(hasher.Sum(nil)) } -func sortValueKeys(values map[string][]byte) []string { +func getMD5HashOfSecret(akvsValues map[string][]byte, secret *corev1.Secret) string { + // filter out only values related to this akvs, + // as multiple akvs can write to a single secret + values := filterByteValueKeys(akvsValues, secret.Data) + return getMD5HashOfByteValues(values) +} + +func filterByteValueKeys(akvsValues, secretValues map[string][]byte) map[string][]byte { + filtered := make(map[string][]byte) + + for key := range akvsValues { + if secretVal, ok := secretValues[key]; ok { + filtered[key] = secretVal + } + } + return filtered +} + +func sortByteValueKeys(values map[string][]byte) []string { var keys []string for k := range values { keys = append(keys, k) From 875f5fe6b8be93764ea62cf553e0d14c793b843d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 00:35:28 +0200 Subject: [PATCH 214/251] controller: fix configmap check, which checked secret --- .../controller/azureKeyVaultSecret.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 21f34dee..2f714922 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -172,12 +172,12 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) } - newSecret, err := updateExistingSecret(akvs, secretValue, existingSecret) + updatedSecret, err := updateExistingSecret(akvs, secretValue, existingSecret) if err != nil { return fmt.Errorf("failed to update existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) } - secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(newSecret) + secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(updatedSecret) if err != nil { return fmt.Errorf("failed to update secret, error: %+v", err) } @@ -251,7 +251,7 @@ func (c *Controller) akvsHasOutputSecret(secret *akv.AzureKeyVaultSecret) bool { } func (c *Controller) akvsHasOutputConfigMap(secret *akv.AzureKeyVaultSecret) bool { - return secret.Spec.Output.Secret.Name != "" + return secret.Spec.Output.ConfigMap.Name != "" } func (c *Controller) getAzureKeyVaultSecretFromSecret(secret *corev1.Secret, owner *metav1.OwnerReference) (*akv.AzureKeyVaultSecret, error) { From 4779237eb9204743ad62ea700bdff70dd1e9681a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 00:55:17 +0200 Subject: [PATCH 215/251] controller: fix wrong refs to secret for configmap --- .../controller/secret_handler.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 9321b494..50d7909a 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -168,8 +168,8 @@ func (h *azureSecretHandler) HandleConfigMap() (map[string]string, error) { } if h.secretSpec.Spec.Vault.Object.Type != akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && - h.secretSpec.Spec.Output.Secret.DataKey == "" { - return nil, fmt.Errorf("no datakey spesified for output secret") + h.secretSpec.Spec.Output.ConfigMap.DataKey == "" { + return nil, fmt.Errorf("no datakey spesified for output configmap") } values[h.secretSpec.Spec.Output.ConfigMap.DataKey] = secret @@ -230,7 +230,7 @@ func (h *azureCertificateHandler) HandleConfigMap() (map[string]string, error) { return nil, err } - values[h.secretSpec.Spec.Output.Secret.DataKey] = string(value) + values[h.secretSpec.Spec.Output.ConfigMap.DataKey] = string(value) return values, nil } @@ -255,7 +255,7 @@ func (h *azureKeyHandler) HandleConfigMap() (map[string]string, error) { } values := make(map[string]string) - values[h.secretSpec.Spec.Output.Secret.DataKey] = key + values[h.secretSpec.Spec.Output.ConfigMap.DataKey] = key return values, nil } From f530a7d507906bdf130726aaa76a254d58a29789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 01:45:42 +0200 Subject: [PATCH 216/251] controller: add more debugging info for configmap --- .../controller/configmap.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 91d789a3..46c40c21 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -79,19 +79,21 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre log.Debugf("get or create configmap %s in namespace %s", cmName, akvs.Namespace) if cm, err = c.configMapsLister.ConfigMaps(akvs.Namespace).Get(cmName); err != nil { + log.Debugf("failed to get configmap %s in namespace %s, error: %+v", cmName, akvs.Namespace, err) if errors.IsNotFound(err) { + log.Debug("getting secret from azure key vault") cmValues, err = c.getConfigMapFromKeyVault(akvs) if err != nil { return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) } if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(createNewConfigMap(akvs, cmValues)); err != nil { - return nil, err + return nil, fmt.Errorf("failed to create new configmap, err: %+v", err) } - log.Infof("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + log.Infof("updating status for azurekeyvaultsecret '%s'", akvs.Name) if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, getMD5HashOfStringValues(cmValues)); err != nil { - return nil, err + return nil, fmt.Errorf("failed to update status for azurekeyvaultsecret %s, error: %+v", akvs.Name, err) } return cm, nil @@ -99,6 +101,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } // get updated secret values from azure key vault + log.Debug("getting secret from azure key vault") cmValues, err = c.getConfigMapFromKeyVault(akvs) if err != nil { return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) @@ -123,7 +126,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) { - log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", akvs.Namespace, akvs.Name, cmName) + log.Infof("azurekeyvaultsecret %s/%s output.configmap values has changed and requires update to configmap %s", akvs.Namespace, akvs.Name, cmName) updatedCM, err := updateExistingConfigMap(akvs, cmValues, cm) if err != nil { @@ -133,6 +136,9 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(updatedCM) } + if err != nil { + log.Warnf("error still exists while creating/updating configmap %s, error: %+v", cmName, err) + } return cm, err } From db9f08774a1e2cd5df085b3fb8400f7a348c794a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 01:55:25 +0200 Subject: [PATCH 217/251] controller: fix issue where secret name was used instead of config map name --- cmd/azure-keyvault-controller/controller/configmap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 46c40c21..6d009313 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -146,7 +146,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. func createNewConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretValue map[string]string) *corev1.ConfigMap { - cmName := determineSecretName(azureKeyVaultSecret) + cmName := determineConfigMapName(azureKeyVaultSecret) return &corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ From 99ddb02dbb226d1deac28ce1a4d1dcccec70c644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 08:45:03 +0200 Subject: [PATCH 218/251] controller: don't set controller=true in ownerrefs --- .../controller/configmap.go | 17 +++++++++++++++-- .../controller/secret.go | 6 +++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 6d009313..d8bfe100 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -155,7 +155,7 @@ func createNewConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecre Labels: azureKeyVaultSecret.Labels, Annotations: azureKeyVaultSecret.Annotations, OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(azureKeyVaultSecret, schema.GroupVersionKind{ + *newOwnerRef(azureKeyVaultSecret, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, Version: akv.SchemeGroupVersion.Version, Kind: "AzureKeyVaultSecret", @@ -166,6 +166,19 @@ func createNewConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecre } } +func newOwnerRef(owner metav1.Object, gvk schema.GroupVersionKind) *metav1.OwnerReference { + blockOwnerDeletion := true + isController := false + return &metav1.OwnerReference{ + APIVersion: gvk.GroupVersion().String(), + Kind: gvk.Kind, + Name: owner.GetName(), + UID: owner.GetUID(), + BlockOwnerDeletion: &blockOwnerDeletion, + Controller: &isController, + } +} + // updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. @@ -175,7 +188,7 @@ func updateExistingConfigMap(akvs *akv.AzureKeyVaultSecret, values map[string]st ownerRefs := cmClone.GetOwnerReferences() if !metav1.IsControlledBy(existingCM, akvs) { - ownerRefs = append(ownerRefs, *metav1.NewControllerRef(akvs, schema.GroupVersionKind{ + ownerRefs = append(ownerRefs, *newOwnerRef(akvs, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, Version: akv.SchemeGroupVersion.Version, Kind: "AzureKeyVaultSecret", diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 8658da6c..82b4804c 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -124,7 +124,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) } if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { - log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", akvs.Namespace, akvs.Name, secretName) + log.Infof("azurekeyvaultsecret %s/%s values has changed and requires update to secret %s", akvs.Namespace, akvs.Name, secretName) updatedSecret, err := updateExistingSecret(akvs, secretValues, secret) if err != nil { @@ -163,7 +163,7 @@ func createNewSecret(akvs *akv.AzureKeyVaultSecret, azureSecretValues map[string Labels: akvs.Labels, Annotations: akvs.Annotations, OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(akvs, schema.GroupVersionKind{ + *newOwnerRef(akvs, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, Version: akv.SchemeGroupVersion.Version, Kind: "AzureKeyVaultSecret", @@ -196,7 +196,7 @@ func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byt ownerRefs := secretClone.GetOwnerReferences() if !metav1.IsControlledBy(existingSecret, akvs) { - ownerRefs = append(ownerRefs, *metav1.NewControllerRef(akvs, schema.GroupVersionKind{ + ownerRefs = append(ownerRefs, *newOwnerRef(akvs, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, Version: akv.SchemeGroupVersion.Version, Kind: "AzureKeyVaultSecret", From 8595a6d075f1175d105f7c7b7672c8d1d9b26b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 09:02:08 +0200 Subject: [PATCH 219/251] controller: create own owner ref check for secrets and configmaps, without controller=true --- .../controller/azureKeyVaultSecret.go | 2 +- .../controller/configmap.go | 2 +- .../controller/secret.go | 21 +++++++++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 2f714922..93f7dfe3 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -129,7 +129,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { outputObject = cm } - if !metav1.IsControlledBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner + if !isOwnedBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner msg := fmt.Sprintf(MessageResourceExists, outputObject.GetName()) log.Warning(msg) c.recorder.Event(akvs, corev1.EventTypeWarning, ErrResourceExists, msg) diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index d8bfe100..6960fe52 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -187,7 +187,7 @@ func updateExistingConfigMap(akvs *akv.AzureKeyVaultSecret, values map[string]st cmClone := existingCM.DeepCopy() ownerRefs := cmClone.GetOwnerReferences() - if !metav1.IsControlledBy(existingCM, akvs) { + if !isOwnedBy(existingCM, akvs) { ownerRefs = append(ownerRefs, *newOwnerRef(akvs, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, Version: akv.SchemeGroupVersion.Version, diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 82b4804c..9ea6e2de 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -186,7 +186,7 @@ func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byt // we cannot update this secret, as none opaque secrets cannot have multiple owners, // because they would overrite each others keys if existingSecret.Type != corev1.SecretTypeOpaque { - if !metav1.IsControlledBy(existingSecret, akvs) { + if !isOwnedBy(existingSecret, akvs) { controlledBy := metav1.GetControllerOf(existingSecret) return nil, fmt.Errorf("cannot update existing secret %s/%s of type %s controlled by %s, as this azurekeyvalutsecret %s would overwrite keys", existingSecret.Namespace, existingSecret.Name, existingSecret.Type, controlledBy.Name, akvs.Name) } @@ -195,7 +195,7 @@ func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byt secretClone := existingSecret.DeepCopy() ownerRefs := secretClone.GetOwnerReferences() - if !metav1.IsControlledBy(existingSecret, akvs) { + if !isOwnedBy(existingSecret, akvs) { ownerRefs = append(ownerRefs, *newOwnerRef(akvs, schema.GroupVersionKind{ Group: akv.SchemeGroupVersion.Group, Version: akv.SchemeGroupVersion.Version, @@ -218,6 +218,23 @@ func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byt }, nil } +func isOwnedBy(obj metav1.Object, owner metav1.Object) bool { + // APIVersion: gvk.GroupVersion().String(), + // Kind: gvk.Kind, + // Name: owner.GetName(), + // UID: owner.GetUID(), + // BlockOwnerDeletion: &blockOwnerDeletion, + // Controller: &isController, + ownerRefs := obj.GetOwnerReferences() + + for _, ref := range ownerRefs { + if ref.Kind == "AzureKeyVaultSecret" && ref.Name == owner.GetName() && ref.UID == owner.GetUID() { + return true + } + } + return false +} + func mergeValuesWithExistingSecret(values map[string][]byte, secret *corev1.Secret) map[string][]byte { newValues := make(map[string][]byte) From 969c9586e0f540e270feaddda71bec4d9b67e01c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 11:46:26 +0200 Subject: [PATCH 220/251] controller: delete values from secret/configmap with multiple owners --- .../controller/azureKeyVaultSecret.go | 84 ++++++++++++++++--- .../controller/configmap.go | 36 +++++++- .../controller/controller.go | 5 ++ .../controller/secret.go | 37 +++++++- 4 files changed, 144 insertions(+), 18 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 93f7dfe3..1b0a4a66 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -38,50 +38,55 @@ import ( func (c *Controller) initAzureKeyVaultSecret() { c.akvsInformerFactory.Keyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - secret, err := convertToAzureKeyVaultSecret(obj) + akvs, err := convertToAzureKeyVaultSecret(obj) if err != nil { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } - if c.akvsHasOutputDefined(secret) { - log.Debugf("AzureKeyVaultSecret %s/%s added. Adding to queue.", secret.Namespace, secret.Name) + if c.akvsHasOutputDefined(akvs) { + log.Debugf("AzureKeyVaultSecret %s/%s added. Adding to queue.", akvs.Namespace, akvs.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) // queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), obj) } }, UpdateFunc: func(old, new interface{}) { - newSecret, err := convertToAzureKeyVaultSecret(new) + newAkvs, err := convertToAzureKeyVaultSecret(new) if err != nil { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } - oldSecret, err := convertToAzureKeyVaultSecret(old) + oldAkvs, err := convertToAzureKeyVaultSecret(old) if err != nil { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv - if newSecret.ResourceVersion == oldSecret.ResourceVersion && c.akvsHasOutputDefined(newSecret) { - log.Debugf("AzureKeyVaultSecret %s/%s not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newSecret.Namespace, newSecret.Name) + if newAkvs.ResourceVersion == oldAkvs.ResourceVersion && c.akvsHasOutputDefined(newAkvs) { + log.Debugf("AzureKeyVaultSecret %s/%s not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newAkvs.Namespace, newAkvs.Name) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } - if c.akvsHasOutputDefined(newSecret) || c.akvsHasOutputDefined(oldSecret) { - log.Debugf("AzureKeyVaultSecret %s/%s changed. Adding to queue.", newSecret.Namespace, newSecret.Name) + if c.akvsHasOutputDefined(newAkvs) || c.akvsHasOutputDefined(oldAkvs) { + log.Debugf("AzureKeyVaultSecret %s/%s changed. Adding to queue.", newAkvs.Namespace, newAkvs.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), new) } }, DeleteFunc: func(obj interface{}) { - secret, err := convertToAzureKeyVaultSecret(obj) + akvs, err := convertToAzureKeyVaultSecret(obj) if err != nil { log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) } - if c.akvsHasOutputDefined(secret) { - log.Debugf("AzureKeyVaultSecret %s/%s deleted. Adding to delete queue.", secret.Namespace, secret.Name) + if c.akvsHasOutputDefined(akvs) { + log.Debugf("AzureKeyVaultSecret %s/%s deleted. Adding to delete queue.", akvs.Namespace, akvs.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) + err = c.deleteKubernetesValues(akvs) + if err != nil { + log.Errorf("failed to delete secret data from azurekeyvaultsecret %s, error: %+v", akvs.Name, err) + } + // Getting default key to remove from Azure work queue key, err := cache.MetaNamespaceKeyFunc(obj) if err != nil { @@ -94,6 +99,51 @@ func (c *Controller) initAzureKeyVaultSecret() { }) } +func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { + var akvs *akv.AzureKeyVaultSecret + var err error + + log.Debugf("Processing AzureKeyVaultSecret %s", key) + if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { + if exit := handleKeyVaultError(err, key); exit { + return nil + } + return err + } + + var outputObject metav1.Object + if c.akvsHasOutputSecret(akvs) { + secret, err := c.getOrCreateKubernetesSecret(akvs) + if err != nil { + return err + } + + log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) + c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) + outputObject = secret + } + + if c.akvsHasOutputConfigMap(akvs) { + cm, err := c.getOrCreateKubernetesConfigMap(akvs) + if err != nil { + return err + } + + log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes configmap %s", key, fmt.Sprintf("%s/%s", cm.Namespace, cm.Name)) + c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) + outputObject = cm + } + + if !isOwnedBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner + msg := fmt.Sprintf(MessageResourceExists, outputObject.GetName()) + log.Warning(msg) + c.recorder.Event(akvs, corev1.EventTypeWarning, ErrResourceExists, msg) + return fmt.Errorf(msg) + } + + return nil +} + func (c *Controller) syncAzureKeyVaultSecret(key string) error { var akvs *akv.AzureKeyVaultSecret var err error @@ -227,6 +277,16 @@ func (c *Controller) syncAzureKeyVault(key string) error { return nil } +func (c *Controller) deleteKubernetesValues(akvs *akv.AzureKeyVaultSecret) error { + if c.akvsHasOutputSecret(akvs) { + return c.deleteKubernetesSecretValues(akvs) + } + if c.akvsHasOutputConfigMap(akvs) { + return c.deleteKubernetesConfigMapValues(akvs) + } + return nil +} + func convertToAzureKeyVaultSecret(obj interface{}) (*akv.AzureKeyVaultSecret, error) { secret, ok := obj.(*akv.AzureKeyVaultSecret) if !ok { diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 6960fe52..349681a4 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -52,14 +52,17 @@ func convertToConfigMap(obj interface{}) (*corev1.ConfigMap, error) { return cm, nil } -func (c *Controller) getConfigMap(key string) (*corev1.ConfigMap, error) { +func (c *Controller) getConfigMapByKey(key string) (*corev1.ConfigMap, error) { namespace, name, err := cache.SplitMetaNamespaceKey(key) if err != nil { return nil, fmt.Errorf("invalid resource key: %s", key) } + return c.getConfigMap(namespace, name) +} - log.Debugf("getting configmap %s from namespace %s", name, namespace) - cm, err := c.configMapsLister.ConfigMaps(namespace).Get(name) +func (c *Controller) getConfigMap(ns, name string) (*corev1.ConfigMap, error) { + log.Debugf("getting configmap %s from namespace %s", name, ns) + cm, err := c.configMapsLister.ConfigMaps(ns).Get(name) if err != nil { return nil, err @@ -67,6 +70,33 @@ func (c *Controller) getConfigMap(key string) (*corev1.ConfigMap, error) { return cm, err } +func (c *Controller) deleteKubernetesConfigMapValues(akvs *akv.AzureKeyVaultSecret) error { + cm, err := c.getConfigMap(akvs.Namespace, akvs.Spec.Output.ConfigMap.Name) + if errors.IsNotFound(err) { + return nil + } + + cmClone := cm.DeepCopy() + if err != nil { + return err + } + + data, err := c.getConfigMapFromKeyVault(akvs) + if err != nil { + return err + } + + for key := range data { + delete(cmClone.Data, key) + } + + cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(cmClone) + if err != nil { + return err + } + return nil +} + func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecret) (*corev1.ConfigMap, error) { var cm *corev1.ConfigMap var cmValues map[string]string diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index f57d74f5..eedf3484 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -106,6 +106,7 @@ type Controller struct { azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister akvsInformerFactory akvInformers.SharedInformerFactory akvsCrdQueue *queue.Worker + akvsCrdDeletionQueue *queue.Worker azureKeyVaultQueue *queue.Worker options *Options @@ -151,6 +152,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI } controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) + controller.akvsCrdDeletionQueue = queue.New("DeletedAzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncDeletedAzureKeyVaultSecret) controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) log.Info("Setting up event handlers") @@ -185,6 +187,9 @@ func (c *Controller) Run(stopCh <-chan struct{}) { log.Info("starting azure key vault secret queue") c.akvsCrdQueue.Run(stopCh) + log.Info("starting azure key vault deleted secret queue") + c.akvsCrdDeletionQueue.Run(stopCh) + log.Info("starting azure key vault queue") c.azureKeyVaultQueue.Run(stopCh) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 9ea6e2de..356172d2 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -52,14 +52,18 @@ func convertToSecret(obj interface{}) (*corev1.Secret, error) { return secret, nil } -func (c *Controller) getSecret(key string) (*corev1.Secret, error) { +func (c *Controller) getSecretByKey(key string) (*corev1.Secret, error) { namespace, name, err := cache.SplitMetaNamespaceKey(key) if err != nil { return nil, fmt.Errorf("invalid resource key: %s", key) } - log.Debugf("Getting Secret %s from namespace %s", name, namespace) - secret, err := c.secretsLister.Secrets(namespace).Get(name) + return c.getSecret(namespace, name) +} + +func (c *Controller) getSecret(ns, name string) (*corev1.Secret, error) { + log.Debugf("Getting Secret %s from namespace %s", name, ns) + secret, err := c.secretsLister.Secrets(ns).Get(name) if err != nil { return nil, err @@ -67,6 +71,33 @@ func (c *Controller) getSecret(key string) (*corev1.Secret, error) { return secret, err } +func (c *Controller) deleteKubernetesSecretValues(akvs *akv.AzureKeyVaultSecret) error { + secret, err := c.getSecret(akvs.Namespace, akvs.Spec.Output.Secret.Name) + if errors.IsNotFound(err) { + return nil + } + + secretClone := secret.DeepCopy() + if err != nil { + return err + } + + data, err := c.getSecretFromKeyVault(akvs) + if err != nil { + return err + } + + for key := range data { + delete(secretClone.Data, key) + } + + secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(secretClone) + if err != nil { + return err + } + return nil +} + func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) (*corev1.Secret, error) { var secret *corev1.Secret var secretValues map[string][]byte From bbabb93e5f6a04d1276f6ba93614e73d0476128f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 12:06:23 +0200 Subject: [PATCH 221/251] controller: create new secret/configmap to update data values --- .../controller/configmap.go | 34 ++++++++++++++--- .../controller/secret.go | 37 ++++++++++++++++--- 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 349681a4..a9fd2e99 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -76,10 +76,7 @@ func (c *Controller) deleteKubernetesConfigMapValues(akvs *akv.AzureKeyVaultSecr return nil } - cmClone := cm.DeepCopy() - if err != nil { - return err - } + cmData := cm.Data data, err := c.getConfigMapFromKeyVault(akvs) if err != nil { @@ -87,10 +84,15 @@ func (c *Controller) deleteKubernetesConfigMapValues(akvs *akv.AzureKeyVaultSecr } for key := range data { - delete(cmClone.Data, key) + delete(cmData, key) + } + + newCM, err := updateExistingConfigMapValues(akvs, cmData, cm) + if err != nil { + return err } - cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(cmClone) + cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(newCM) if err != nil { return err } @@ -239,6 +241,26 @@ func updateExistingConfigMap(akvs *akv.AzureKeyVaultSecret, values map[string]st }, nil } +// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets +// the appropriate OwnerReferences on the resource so handleObject can discover +// the AzureKeyVaultSecret resource that 'owns' it. +func updateExistingConfigMapValues(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) { + cmName := determineConfigMapName(akvs) + cmClone := existingCM.DeepCopy() + ownerRefs := cmClone.GetOwnerReferences() + + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: cmName, + Namespace: akvs.Namespace, + Labels: akvs.Labels, + Annotations: akvs.Annotations, + OwnerReferences: ownerRefs, + }, + Data: values, + }, nil +} + func mergeValuesWithExistingConfigMap(values map[string]string, cm *corev1.ConfigMap) map[string]string { newValues := make(map[string]string) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 356172d2..8a9cafd6 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -77,10 +77,7 @@ func (c *Controller) deleteKubernetesSecretValues(akvs *akv.AzureKeyVaultSecret) return nil } - secretClone := secret.DeepCopy() - if err != nil { - return err - } + secretData := secret.Data data, err := c.getSecretFromKeyVault(akvs) if err != nil { @@ -88,10 +85,15 @@ func (c *Controller) deleteKubernetesSecretValues(akvs *akv.AzureKeyVaultSecret) } for key := range data { - delete(secretClone.Data, key) + delete(secretData, key) + } + + newSecret, err := updateExistingSecretValues(akvs, secretData, secret) + if err != nil { + return err } - secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(secretClone) + secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(newSecret) if err != nil { return err } @@ -249,6 +251,29 @@ func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byt }, nil } +// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets +// the appropriate OwnerReferences on the resource so handleObject can discover +// the AzureKeyVaultSecret resource that 'owns' it. +func updateExistingSecretValues(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) { + secretName := determineSecretName(akvs) + secretType := determineSecretType(akvs) + + secretClone := existingSecret.DeepCopy() + ownerRefs := secretClone.GetOwnerReferences() + + return &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Namespace: akvs.Namespace, + Labels: akvs.Labels, + Annotations: akvs.Annotations, + OwnerReferences: ownerRefs, + }, + Type: secretType, + Data: values, + }, nil +} + func isOwnedBy(obj metav1.Object, owner metav1.Object) bool { // APIVersion: gvk.GroupVersion().String(), // Kind: gvk.Kind, From 6b8a6b082a91449e49e08930a792a11784ae896e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 17:54:44 +0200 Subject: [PATCH 222/251] docs: add missing docs for output transformers --- .../reference/azure-key-vault-secret.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/source/content/reference/azure-key-vault-secret.md b/docs/source/content/reference/azure-key-vault-secret.md index 8cb29013..3e5d34b6 100644 --- a/docs/source/content/reference/azure-key-vault-secret.md +++ b/docs/source/content/reference/azure-key-vault-secret.md @@ -20,6 +20,10 @@ spec: version: contentType: output: # ignored by env injector, required by controller to output kubernetes secret + transform: # optional transformers executed in listed order + - trim # optional - trims empty space + - base64encode # optional - encode to base64 + - base64decode # optional - decode from base64 secret: name: type: @@ -90,3 +94,28 @@ This must be a properly formatted **Private** SSH Key stored in a Secret object. ## Chain Order When exporting a PFX certificate from Key Vault the server certificate sometimes end up at the end of the chain instead of the beginning. If this is used together with, for example, ingress-nginx the certificate won't be loaded and it will revert back to default. By setting `chainOrder` to `ensureserverfirst` the server certificate will be moved first in the chain. + +## Output Transformation + +Three common transformers exists - trim, base64encode and base64decode. Below is an example where a secret extracted from Azure Key Vault, which is base64 encoded, gets decoded by the transformer before added to a Kubernetes Secret. + +``` +apiVersion: spv.no/v1 +kind: AzureKeyVaultSecret +metadata: + name: base64decoded-binary-file + namespace: my-kw +spec: + vault: + name: my-kv + object: + name: my-kv-secret + type: secret + output: + transform: + - base64decode + - trim + secret: + name: not-base64encoded-anymore + dataKey: myKey +``` \ No newline at end of file From d3a72510f2d65d81d589eed6cf2406118ca3c5e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 19:08:46 +0200 Subject: [PATCH 223/251] push bogus cname to have akv2k8s-website take over domain --- docs/CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CNAME b/docs/CNAME index 4b4bd309..541db851 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -akv2k8s.io \ No newline at end of file +old.akv2k8s.io \ No newline at end of file From 44f65f1461d33d492e48f00a4c1f8b37e727610c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 22:54:54 +0200 Subject: [PATCH 224/251] controller: rename func names to better description --- .../controller/configmap.go | 8 ++++---- .../controller/secret.go | 16 +++++----------- .../controller/secret_handler.go | 9 --------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index a9fd2e99..2872de4e 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -87,7 +87,7 @@ func (c *Controller) deleteKubernetesConfigMapValues(akvs *akv.AzureKeyVaultSecr delete(cmData, key) } - newCM, err := updateExistingConfigMapValues(akvs, cmData, cm) + newCM, err := createNewConfigMapFromExistingWithUpdatedValues(akvs, cmData, cm) if err != nil { return err } @@ -160,7 +160,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) { log.Infof("azurekeyvaultsecret %s/%s output.configmap values has changed and requires update to configmap %s", akvs.Namespace, akvs.Name, cmName) - updatedCM, err := updateExistingConfigMap(akvs, cmValues, cm) + updatedCM, err := createNewConfigMapFromExisting(akvs, cmValues, cm) if err != nil { return nil, err } @@ -214,7 +214,7 @@ func newOwnerRef(owner metav1.Object, gvk schema.GroupVersionKind) *metav1.Owner // updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. -func updateExistingConfigMap(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) { +func createNewConfigMapFromExisting(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) { cmName := determineConfigMapName(akvs) cmClone := existingCM.DeepCopy() ownerRefs := cmClone.GetOwnerReferences() @@ -244,7 +244,7 @@ func updateExistingConfigMap(akvs *akv.AzureKeyVaultSecret, values map[string]st // updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. -func updateExistingConfigMapValues(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) { +func createNewConfigMapFromExistingWithUpdatedValues(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) { cmName := determineConfigMapName(akvs) cmClone := existingCM.DeepCopy() ownerRefs := cmClone.GetOwnerReferences() diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 8a9cafd6..c957120a 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -88,7 +88,7 @@ func (c *Controller) deleteKubernetesSecretValues(akvs *akv.AzureKeyVaultSecret) delete(secretData, key) } - newSecret, err := updateExistingSecretValues(akvs, secretData, secret) + newSecret, err := createNewSecretFromExistingWithUpdatedValues(akvs, secretData, secret) if err != nil { return err } @@ -159,7 +159,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { log.Infof("azurekeyvaultsecret %s/%s values has changed and requires update to secret %s", akvs.Namespace, akvs.Name, secretName) - updatedSecret, err := updateExistingSecret(akvs, secretValues, secret) + updatedSecret, err := createNewSecretFromExisting(akvs, secretValues, secret) if err != nil { return nil, err } @@ -208,10 +208,10 @@ func createNewSecret(akvs *akv.AzureKeyVaultSecret, azureSecretValues map[string } } -// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets +// createNewSecretFromExisting creates a new Secret for a AzureKeyVaultSecret resource. It also sets // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. -func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) { +func createNewSecretFromExisting(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) { secretName := determineSecretName(akvs) secretType := determineSecretType(akvs) @@ -254,7 +254,7 @@ func updateExistingSecret(akvs *akv.AzureKeyVaultSecret, values map[string][]byt // updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets // the appropriate OwnerReferences on the resource so handleObject can discover // the AzureKeyVaultSecret resource that 'owns' it. -func updateExistingSecretValues(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) { +func createNewSecretFromExistingWithUpdatedValues(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) { secretName := determineSecretName(akvs) secretType := determineSecretType(akvs) @@ -275,12 +275,6 @@ func updateExistingSecretValues(akvs *akv.AzureKeyVaultSecret, values map[string } func isOwnedBy(obj metav1.Object, owner metav1.Object) bool { - // APIVersion: gvk.GroupVersion().String(), - // Kind: gvk.Kind, - // Name: owner.GetName(), - // UID: owner.GetUID(), - // BlockOwnerDeletion: &blockOwnerDeletion, - // Controller: &isController, ownerRefs := obj.GetOwnerReferences() for _, ref := range ownerRefs { diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 50d7909a..ded26113 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -69,15 +69,6 @@ func NewAzureSecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vau } } -// // NewAzureSecretHandler return a new AzureSecretHandler -// func NewAzureSecretConfigMapHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service, transformator transformers.Transformator) *azureSecretHandlerForKubernetesConfigMap { -// return &azureSecretHandlerForKubernetesConfigMap{ -// secretSpec: secretSpec, -// vaultService: vaultService, -// transformator: transformator, -// } -// } - // NewAzureCertificateHandler return a new AzureCertificateHandler func NewAzureCertificateHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *azureCertificateHandler { return &azureCertificateHandler{ From 5fc980053eede6f93e17242182e20c44dbd3298b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 22:55:41 +0200 Subject: [PATCH 225/251] docs: remove docs from this repo and moved to sparebankenvest/akv2k8s-website --- docs/.gitignore | 10 - docs/.nvmrc | 1 - docs/CNAME | 1 - docs/README.md | 15 - docs/gatsby-config.js | 121 - docs/package-lock.json | 26180 ---------------- docs/package.json | 26 - docs/shared/disclaimer.mdx | 5 - docs/source/components/docset-menu.js | 53 - docs/source/content/assets/akv2k8s_small.svg | 27 - docs/source/content/assets/auth-decision.svg | 1 - .../assets/controller_and_injector.png | Bin 41537 -> 0 bytes docs/source/content/faq.md | 51 - docs/source/content/how-it-works.mdx | 117 - docs/source/content/index.mdx | 97 - docs/source/content/installation/index.md | 14 - .../installation/installing-with-helm.md | 86 - .../installation/installing-without-helm.md | 28 - .../content/installation/requirements.md | 18 - docs/source/content/quick-start.mdx | 81 - .../reference/azure-key-vault-secret.md | 121 - docs/source/content/reference/index.md | 6 - .../source/content/security/authentication.md | 113 - docs/source/content/security/authorization.md | 40 - .../content/security/enable-env-injection.md | 15 - .../content/security/risk-assessments.md | 21 - .../content/troubleshooting/controller-log.md | 12 - .../troubleshooting/env-injector-log-level.md | 28 - .../content/troubleshooting/known-issues.md | 26 - .../content/troubleshooting/where-to-look.md | 0 .../tutorials/env-injection/1-secret.md | 102 - .../tutorials/env-injection/2-certificate.md | 108 - .../tutorials/env-injection/3-signing-key.md | 102 - .../env-injection/4-multi-value-secret.md | 6 - .../env-injection/5-pfx-certificate.md | 116 - docs/source/content/tutorials/index.md | 8 - .../source/content/tutorials/prerequisites.md | 81 - .../source/content/tutorials/sync/1-secret.md | 56 - .../content/tutorials/sync/2-certificate.md | 75 - .../content/tutorials/sync/3-signing-key.md | 55 - .../sync/4-multi-key-value-secret.md | 29 - .../content/tutorials/sync/5-shared-secret.md | 0 docs/source/content/why-akv2k8s.mdx | 33 - docs/src/akv2k8s_small.svg | 27 - docs/src/assets/akv2k8s.png | Bin 44512 -> 0 bytes docs/src/assets/social-bg.jpg | Bin 25537 -> 0 bytes docs/src/assets/social-bg.png | Bin 823782 -> 0 bytes .../components/logo.js | 37 - .../components/custom-seo.js | 22 - .../components/header-button.js | 3 - .../components/mobile-logo.js | 1 - docs/static/CNAME | 1 - docs/static/_redirects | 38 - 53 files changed, 28214 deletions(-) delete mode 100644 docs/.gitignore delete mode 100644 docs/.nvmrc delete mode 100644 docs/CNAME delete mode 100644 docs/README.md delete mode 100644 docs/gatsby-config.js delete mode 100644 docs/package-lock.json delete mode 100644 docs/package.json delete mode 100644 docs/shared/disclaimer.mdx delete mode 100644 docs/source/components/docset-menu.js delete mode 100644 docs/source/content/assets/akv2k8s_small.svg delete mode 100644 docs/source/content/assets/auth-decision.svg delete mode 100644 docs/source/content/assets/controller_and_injector.png delete mode 100644 docs/source/content/faq.md delete mode 100644 docs/source/content/how-it-works.mdx delete mode 100644 docs/source/content/index.mdx delete mode 100644 docs/source/content/installation/index.md delete mode 100644 docs/source/content/installation/installing-with-helm.md delete mode 100644 docs/source/content/installation/installing-without-helm.md delete mode 100644 docs/source/content/installation/requirements.md delete mode 100644 docs/source/content/quick-start.mdx delete mode 100644 docs/source/content/reference/azure-key-vault-secret.md delete mode 100644 docs/source/content/reference/index.md delete mode 100644 docs/source/content/security/authentication.md delete mode 100644 docs/source/content/security/authorization.md delete mode 100644 docs/source/content/security/enable-env-injection.md delete mode 100644 docs/source/content/security/risk-assessments.md delete mode 100644 docs/source/content/troubleshooting/controller-log.md delete mode 100644 docs/source/content/troubleshooting/env-injector-log-level.md delete mode 100644 docs/source/content/troubleshooting/known-issues.md delete mode 100644 docs/source/content/troubleshooting/where-to-look.md delete mode 100644 docs/source/content/tutorials/env-injection/1-secret.md delete mode 100644 docs/source/content/tutorials/env-injection/2-certificate.md delete mode 100644 docs/source/content/tutorials/env-injection/3-signing-key.md delete mode 100644 docs/source/content/tutorials/env-injection/4-multi-value-secret.md delete mode 100755 docs/source/content/tutorials/env-injection/5-pfx-certificate.md delete mode 100644 docs/source/content/tutorials/index.md delete mode 100644 docs/source/content/tutorials/prerequisites.md delete mode 100644 docs/source/content/tutorials/sync/1-secret.md delete mode 100644 docs/source/content/tutorials/sync/2-certificate.md delete mode 100644 docs/source/content/tutorials/sync/3-signing-key.md delete mode 100644 docs/source/content/tutorials/sync/4-multi-key-value-secret.md delete mode 100644 docs/source/content/tutorials/sync/5-shared-secret.md delete mode 100644 docs/source/content/why-akv2k8s.mdx delete mode 100644 docs/src/akv2k8s_small.svg delete mode 100644 docs/src/assets/akv2k8s.png delete mode 100644 docs/src/assets/social-bg.jpg delete mode 100644 docs/src/assets/social-bg.png delete mode 100644 docs/src/gatsby-theme-apollo-core/components/logo.js delete mode 100644 docs/src/gatsby-theme-apollo-docs/components/custom-seo.js delete mode 100644 docs/src/gatsby-theme-apollo-docs/components/header-button.js delete mode 100644 docs/src/gatsby-theme-apollo-docs/components/mobile-logo.js delete mode 100644 docs/static/CNAME delete mode 100644 docs/static/_redirects diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index de65ace5..00000000 --- a/docs/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.DS_Store -Thumbs.db -db.json -*.log -node_modules/ -public/* -.deploy*/ -docs.json -_multiconfig.yml -.cache \ No newline at end of file diff --git a/docs/.nvmrc b/docs/.nvmrc deleted file mode 100644 index ed5ddf35..00000000 --- a/docs/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -10.19.0 \ No newline at end of file diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 541db851..00000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -old.akv2k8s.io \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 2197d127..00000000 --- a/docs/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Documentation - -This is the documentation **source** for this repository. - -The **deployed** version of the documentation for this repository is available at: - -* https://akv2k8s.io - -## Running locally - -From the root of this repository: - -* `make docs-install-dev` -* `make docs-run-dev` -* Open a browser to the link provided in the console. diff --git a/docs/gatsby-config.js b/docs/gatsby-config.js deleted file mode 100644 index b08efea6..00000000 --- a/docs/gatsby-config.js +++ /dev/null @@ -1,121 +0,0 @@ -const themeOptions = require('gatsby-theme-apollo-docs/theme-options'); - -module.exports = { - pathPrefix: '/', - plugins: [ - { - resolve: 'gatsby-plugin-gtag', - options: { - // your google analytics tracking id - trackingId: 'UA-136446489-2', - // Puts tracking script in the head instead of the body - head: true, - // enable ip anonymization - anonymize: false, - }, - }, - // { - // resolve: `gatsby-source-git`, - // options: { - // name: `default`, - // remote: `https://github.com/SparebankenVest/public-helm-charts.git`, - // patterns: [ - // 'stable/azure-key-vault-controller/README.md', - // 'stable/azure-key-vault-env-injector/README.md', - // ] - // } - // }, - // { - // resolve: "gatsby-source-graphql", - // options: { - // // Arbitrary name for the remote schema Query type - // typeName: "GitHub", - // // Field under which the remote schema will be accessible. You'll use this in your Gatsby query - // fieldName: "github", - // // Url to query from - // url: "https://api.github.com/graphql", - // headers: { - // // Learn about environment variables: https://gatsby.dev/env-vars - // Authorization: `Bearer ${process.env.GITHUB_TOKEN}`, - // }, - // }, - // }, - { - resolve: 'gatsby-theme-apollo-docs', - options: { - ...themeOptions, - root: __dirname, - baseUrl: 'https://akv2k8s.io', - baseDir: 'docs', - logoLink: 'https://akv2k8s.io/', - contentDir: 'source/content', - siteName: '', - pageTitle: 'akv2k8s docs', - subtitle: '', - description: 'How to get Azure Key Vault objects into Kubernetes', - githubRepo: 'sparebankenvest/azure-key-vault-to-kubernetes', - segmentApiKey: null, - algoliaApiKey: '3222f31991b019f454d81f025f0f26d3', - algoliaIndexName: 'azure-key-vault-to-kubernetes', - spectrumPath: '', - spectrumHandle: '', - twitterHandle: '', - defaultVersion: '1.1', - versions: { - '1.0': 'doc-version-1.0.2', - }, - sidebarCategories: { - null: ['index', 'why-akv2k8s', 'quick-start', 'how-it-works', 'faq'], - 'Installation': [ - 'installation/index', - 'installation/requirements', - 'installation/installing-with-helm', - 'installation/installing-without-helm', - ], - Tutorials: [ - 'tutorials/index', - 'tutorials/prerequisites', - 'tutorials/sync/1-secret', - 'tutorials/sync/2-certificate', - 'tutorials/sync/3-signing-key', - 'tutorials/sync/4-multi-key-value-secret', - 'tutorials/env-injection/1-secret', - 'tutorials/env-injection/2-certificate', - 'tutorials/env-injection/3-signing-key', - 'tutorials/env-injection/5-pfx-certificate', - ], - Security: [ - 'security/introduction', - 'security/authentication', - 'security/authorization', - 'security/enable-env-injection', - ], - Troubleshooting: [ - 'troubleshooting/controller-log', - 'troubleshooting/env-injector-log-level', - 'troubleshooting/known-issues', - ], - Reference: [ - 'reference/index', - 'reference/azure-key-vault-secret', - ], - }, - navConfig: {}, - // navConfig: { - // 'Controller Basics': { - // url: 'https://www.apollographql.com/docs', - // description: 'Learn how the Controller syncs Azure Key Vault objects to Kubernetes as native Secrets.', - // }, - // 'Injector Basics': { - // url: 'https://www.apollographql.com/docs/apollo-server', - // description: 'Learn how the Injector injects Azure Key Vault objects as environment variabled directly into your application' - // }, - // 'When to use which': { - // url: 'https://www.apollographql.com/docs/apollo-server', - // description: 'Learn when to use the Controller and when to use the Injector' - // }, - // }, - }, - }, - ], -}; diff --git a/docs/package-lock.json b/docs/package-lock.json deleted file mode 100644 index 16b00ecf..00000000 --- a/docs/package-lock.json +++ /dev/null @@ -1,26180 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@algolia/cache-browser-local-storage": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.4.0.tgz", - "integrity": "sha512-2AiKgN7DpFypkRCRkpqH7waXXyFdcnsPWzmN8sLHrB/FfXqgmsQb3pGft+9YHZIDQ0vAnfgMxSGgMhMGW+0Qnw==", - "requires": { - "@algolia/cache-common": "4.4.0" - } - }, - "@algolia/cache-common": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.4.0.tgz", - "integrity": "sha512-PrIgoMnXaDWUfwOekahro543pgcJfgRu/nd/ZQS5ffem3+Ow725eZY6HDpPaQ1k3cvLii9JH6V2sNJConjqUKA==" - }, - "@algolia/cache-in-memory": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.4.0.tgz", - "integrity": "sha512-9+XlUB0baDU/Dp9URRHPp6Q37YmTO0QmgPWt9+n+wqZrRL0jR3Jezr4jCT7RemqGMxBiR+YpnqaUv0orpb0ptw==", - "requires": { - "@algolia/cache-common": "4.4.0" - } - }, - "@algolia/client-account": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.4.0.tgz", - "integrity": "sha512-Kynu3cMEs0clTLf674rtrCF+FWR/JwlQxKlIWsPzvLBRmNXdvYej9YBcNaOr4OTQFCCZn9JVE8ib91Z7J4IL1Q==", - "requires": { - "@algolia/client-common": "4.4.0", - "@algolia/client-search": "4.4.0", - "@algolia/transporter": "4.4.0" - } - }, - "@algolia/client-analytics": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.4.0.tgz", - "integrity": "sha512-GQyjQimKAc9sZbafxln9Wk7j4pEYiORv28MZkZ+0Bjt7WNXIeO7OgOOECVpQHm9buyV6hCKpNtJcbb5/syRzdQ==", - "requires": { - "@algolia/client-common": "4.4.0", - "@algolia/client-search": "4.4.0", - "@algolia/requester-common": "4.4.0", - "@algolia/transporter": "4.4.0" - } - }, - "@algolia/client-common": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.4.0.tgz", - "integrity": "sha512-a3yr6UhzjWPHDG/8iGp9UvrDOm1aeHVWJIf0Nj/cIvqX5tNCEIo4IMe59ovApkDgLOIpt/cLsyhn9/FiPXRhJA==", - "requires": { - "@algolia/requester-common": "4.4.0", - "@algolia/transporter": "4.4.0" - } - }, - "@algolia/client-recommendation": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.4.0.tgz", - "integrity": "sha512-sBszbQH46rko6w2fdEG77ma8+fAg0SDkLZGxWhv4trgcnYGUBFl2dcpEPt/6koto9b4XYlf+eh+qi6iGvYqRPg==", - "requires": { - "@algolia/client-common": "4.4.0", - "@algolia/requester-common": "4.4.0", - "@algolia/transporter": "4.4.0" - } - }, - "@algolia/client-search": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.4.0.tgz", - "integrity": "sha512-jqWcxCUyPPHnHreoMb2PnN9iHTP+V/nL62R84XuTRDE3VgTnhm4ZnqyuRdzZQqaz+gNy5znav64TmQ9FN9WW5g==", - "requires": { - "@algolia/client-common": "4.4.0", - "@algolia/requester-common": "4.4.0", - "@algolia/transporter": "4.4.0" - } - }, - "@algolia/logger-common": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.4.0.tgz", - "integrity": "sha512-2vjmSENLaKNuF+ytRDysfWxxgFG95WXCHwHbueThdPMCK3hskkwqJ0Y/pugKfzl+54mZxegb4BYfgcCeuaHVUw==" - }, - "@algolia/logger-console": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.4.0.tgz", - "integrity": "sha512-st/GUWyKvr6YM72OOfF+RmpdVGda3BPXbQ+chpntUq1WyVkyZXGjSmH1IcBVlua27GzxabwOUYON39cF3x10/g==", - "requires": { - "@algolia/logger-common": "4.4.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.4.0.tgz", - "integrity": "sha512-V3a4hXlNch355GnWaT1f5QfXhROpsjT6sd0Znq29gAhwLqfBExhLW6Khdkv5pENC0Qy7ClVhdXFrBL9QCQer1g==", - "requires": { - "@algolia/requester-common": "4.4.0" - } - }, - "@algolia/requester-common": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.4.0.tgz", - "integrity": "sha512-jPinHlFJEFokxQ5b3JWyjQKKn+FMy0hH99PApzOgQAYOSiFRXiPEZp6LeIexDeLLu7Y3eRt/3nHvjPKa6PmRRw==" - }, - "@algolia/requester-node-http": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.4.0.tgz", - "integrity": "sha512-b7HC9C/GHxiV4+0GpCRTtjscvwarPr3dGm4CAhb6AkNjgjRcFUNr1NfsF75w3WVmzmt79/7QZihddztDdVMGjw==", - "requires": { - "@algolia/requester-common": "4.4.0" - } - }, - "@algolia/transporter": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.4.0.tgz", - "integrity": "sha512-Xxzq91DEEeKIzT3DU46n4LEyTGAKZNtSHc2H9wvIY5MYwhZwEribmXXZ6k8W1FvBvzggv3juu0SP+xwGoR7F0w==", - "requires": { - "@algolia/cache-common": "4.4.0", - "@algolia/logger-common": "4.4.0", - "@algolia/requester-common": "4.4.0" - } - }, - "@apollo/client": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.2.0.tgz", - "integrity": "sha512-6ISMYW9QpEykJAkN6ZZteTkXXwtYSPGbh+4iBZ478p/Eox1JOMGYlqosGgMGv2oduug9SnsR65y0iCAxKOFGiQ==", - "requires": { - "@graphql-typed-document-node/core": "^3.0.0", - "@types/zen-observable": "^0.8.0", - "@wry/context": "^0.5.2", - "@wry/equality": "^0.2.0", - "fast-json-stable-stringify": "^2.0.0", - "graphql-tag": "^2.11.0", - "hoist-non-react-statics": "^3.3.2", - "optimism": "^0.12.1", - "prop-types": "^15.7.2", - "symbol-observable": "^2.0.0", - "terser": "^5.2.0", - "ts-invariant": "^0.4.4", - "tslib": "^1.10.0", - "zen-observable": "^0.8.14" - }, - "dependencies": { - "@wry/equality": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.2.0.tgz", - "integrity": "sha512-Y4d+WH6hs+KZJUC8YKLYGarjGekBrhslDbf/R20oV+AakHPINSitHfDRQz3EGcEWc1luXYNUvMhawWtZVWNGvQ==", - "requires": { - "tslib": "^1.9.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "symbol-observable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.1.tgz", - "integrity": "sha512-QrfHrrEUMadQCgMijc3YpfA4ncwgqGv58Xgvdu3JZVQB7iY7cAkiqobZEZbaA863jof8AdpR01CPnZ5UWeqZBQ==" - }, - "terser": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.2.tgz", - "integrity": "sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - } - } - }, - "@apollo/space-kit": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@apollo/space-kit/-/space-kit-5.6.0.tgz", - "integrity": "sha512-8/dVkTFVdHz9c1iBhhPtF6OAzoc314+j7QgQLCUHX5/RrwPnIUFyZizJpjUD3m+q4TSnvSuAXiidnwOAW1o5ug==", - "requires": { - "@emotion/cache": "^10.0.15", - "@emotion/core": "^10.0.15", - "@tippyjs/react": "^4.0.0", - "@types/classnames": "^2.2.9", - "@types/tinycolor2": "^1.4.2", - "classnames": "^2.2.6", - "tinycolor2": "^1.4.1", - "tslib": "^1.10.0" - } - }, - "@ardatan/aggregate-error": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.1.tgz", - "integrity": "sha512-UQ9BequOTIavs0pTHLMwQwKQF8tTV1oezY/H2O9chA+JNPFZSua55xpU5dPSjAU9/jLJ1VwU+HJuTVN8u7S6Fg==" - }, - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "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.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", - "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-react-jsx-experimental": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", - "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/types": "^7.10.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", - "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@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==", - "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@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==", - "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==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@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==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", - "requires": { - "@babel/types": "^7.11.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@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==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", - "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "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==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", - "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@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==", - "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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@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==", - "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==", - "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==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", - "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@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==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", - "requires": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" - }, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "requires": { - "jsesc": "~0.5.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - } - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz", - "integrity": "sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", - "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", - "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", - "requires": { - "@babel/helper-builder-react-jsx": "^7.10.4", - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", - "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", - "requires": { - "@babel/helper-builder-react-jsx-experimental": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - } - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", - "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", - "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-jsx": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", - "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz", - "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", - "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "requires": { - "jsesc": "~0.5.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - } - } - }, - "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", - "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", - "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "requires": { - "jsesc": "~0.5.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", - "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.10.4", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/plugin-transform-react-jsx-development": "^7.10.4", - "@babel/plugin-transform-react-jsx-self": "^7.10.4", - "@babel/plugin-transform-react-jsx-source": "^7.10.4", - "@babel/plugin-transform-react-pure-annotations": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/preset-typescript": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz", - "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/runtime-corejs3": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz", - "integrity": "sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==", - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "@babel/standalone": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.6.tgz", - "integrity": "sha512-Ye1pj3fN76OWlJyi+Ocy1kTr1BNs5vFWHsq2oKPp3lB4Q0r2WrHi+n/Y2w3sZK+1QSKAkDXTp12tCuBprBHZ1w==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "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==", - "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" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@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==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@braintree/sanitize-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", - "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==" - }, - "@emotion/babel-plugin-jsx-pragmatic": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-0.1.5.tgz", - "integrity": "sha512-y+3AJ0SItMDaAgGPVkQBC/S/BaqaPACkQ6MyCI2CUlrjTxKttTVfD3TMtcs7vLEcLxqzZ1xiG0vzwCXjhopawQ==", - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@emotion/babel-preset-css-prop": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/babel-preset-css-prop/-/babel-preset-css-prop-10.0.27.tgz", - "integrity": "sha512-rducrjTpLGDholp0l2l4pXqpzAqYYGMg/x4IteO0db2smf6zegn6RRZdDnbaoMSs63tfPWgo2WukT1/F1gX/AA==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.3.0", - "@babel/runtime": "^7.5.5", - "@emotion/babel-plugin-jsx-pragmatic": "^0.1.5", - "babel-plugin-emotion": "^10.0.27" - } - }, - "@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "requires": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "@emotion/core": { - "version": "10.0.28", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz", - "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==", - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - } - }, - "@emotion/css": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", - "requires": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" - } - }, - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "requires": { - "@emotion/memoize": "0.7.4" - } - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", - "requires": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - } - }, - "@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" - }, - "@emotion/styled": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz", - "integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==", - "requires": { - "@emotion/styled-base": "^10.0.27", - "babel-plugin-emotion": "^10.0.27" - } - }, - "@emotion/styled-base": { - "version": "10.0.31", - "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz", - "integrity": "sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==", - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/is-prop-valid": "0.8.8", - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3" - } - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, - "@graphql-tools/delegate": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.2.2.tgz", - "integrity": "sha512-8VycfZYQ+m4HgajewQT6v6BzAEFxc6mh6rO+uqewnvh143nvv3ud4nXEAfOddUm0PrE6iD3Ng2BZtPSWF5mt+w==", - "requires": { - "@ardatan/aggregate-error": "0.0.6", - "@graphql-tools/schema": "6.2.2", - "@graphql-tools/utils": "6.2.2", - "dataloader": "2.0.0", - "is-promise": "4.0.0", - "tslib": "~2.0.1" - }, - "dependencies": { - "@ardatan/aggregate-error": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", - "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", - "requires": { - "tslib": "~2.0.1" - } - }, - "@graphql-tools/schema": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.2.tgz", - "integrity": "sha512-KITlyr//1oKyxIOlGvNZDl4c6bLj2Gc+3eJXyUKWfSmgsmAZPudpQNa/8VbiVujpm7UaX0cyM3FdeCaxWFeBgg==", - "requires": { - "@graphql-tools/utils": "6.2.2", - "tslib": "~2.0.1" - } - }, - "@graphql-tools/utils": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.2.tgz", - "integrity": "sha512-a0SSYF76dnKHs8te4Igfnrrq1VOO4sFG8yx3ehO7464eGUfUUYo2QmNRjhxny2HRMvqzX40xuQikyg6LBXDNLQ==", - "requires": { - "@ardatan/aggregate-error": "0.0.6", - "camel-case": "4.1.1", - "tslib": "~2.0.1" - } - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "dataloader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", - "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@graphql-tools/links": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.2.2.tgz", - "integrity": "sha512-x1B75Flc10PSmF1hzar1kty9q9wfWjlwlPXYC5AYGmRIVfzbZui3SEZcEPP8cviedBCI84l9O+dX5S4dE2Oz6Q==", - "requires": { - "@graphql-tools/utils": "6.2.2", - "apollo-link": "1.2.14", - "apollo-upload-client": "14.1.1", - "cross-fetch": "3.0.5", - "form-data": "3.0.0", - "is-promise": "4.0.0", - "tslib": "~2.0.1" - }, - "dependencies": { - "@ardatan/aggregate-error": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", - "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", - "requires": { - "tslib": "~2.0.1" - } - }, - "@graphql-tools/utils": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.2.tgz", - "integrity": "sha512-a0SSYF76dnKHs8te4Igfnrrq1VOO4sFG8yx3ehO7464eGUfUUYo2QmNRjhxny2HRMvqzX40xuQikyg6LBXDNLQ==", - "requires": { - "@ardatan/aggregate-error": "0.0.6", - "camel-case": "4.1.1", - "tslib": "~2.0.1" - } - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "cross-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.5.tgz", - "integrity": "sha512-FFLcLtraisj5eteosnX1gf01qYDCOc4fDy0+euOt8Kn9YBY2NtXL/pCoYPavw24NIQkQqm5ZOLsGD5Zzj0gyew==", - "requires": { - "node-fetch": "2.6.0" - } - }, - "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" - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@graphql-tools/schema": { - "version": "6.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.0.18.tgz", - "integrity": "sha512-xrScjRX9pTSVxqiSkx7Hn/9rzxLweysINa5Pkirdkv5lJY4e0Db53osur0nG/+SJyUmIN70tUtuhEZq4Ezr/PA==", - "requires": { - "@graphql-tools/utils": "6.0.18", - "tslib": "~2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@graphql-tools/utils": { - "version": "6.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.0.18.tgz", - "integrity": "sha512-8ntYuXJucBtjViOYljeKBzScfpVTnv7BfqIPU/WJ65h6nXD+qf8fMUR1C4MpCUeFvSjMiDSB5Z4enJmau/9D3A==", - "requires": { - "@ardatan/aggregate-error": "0.0.1", - "camel-case": "4.1.1" - }, - "dependencies": { - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "requires": { - "tslib": "^1.10.0" - } - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - } - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - } - } - } - }, - "@graphql-tools/wrap": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.2.2.tgz", - "integrity": "sha512-FjCE+NvMwcCiAlt9EAw9uDi2zblE4Z5CEkY+z4NRO1AmCB5THoWJKG+csPh8tGuU80mAJI51Wy9FQGyUo/EU0g==", - "requires": { - "@graphql-tools/delegate": "6.2.2", - "@graphql-tools/schema": "6.2.2", - "@graphql-tools/utils": "6.2.2", - "is-promise": "4.0.0", - "tslib": "~2.0.1" - }, - "dependencies": { - "@ardatan/aggregate-error": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", - "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", - "requires": { - "tslib": "~2.0.1" - } - }, - "@graphql-tools/schema": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.2.tgz", - "integrity": "sha512-KITlyr//1oKyxIOlGvNZDl4c6bLj2Gc+3eJXyUKWfSmgsmAZPudpQNa/8VbiVujpm7UaX0cyM3FdeCaxWFeBgg==", - "requires": { - "@graphql-tools/utils": "6.2.2", - "tslib": "~2.0.1" - } - }, - "@graphql-tools/utils": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.2.tgz", - "integrity": "sha512-a0SSYF76dnKHs8te4Igfnrrq1VOO4sFG8yx3ehO7464eGUfUUYo2QmNRjhxny2HRMvqzX40xuQikyg6LBXDNLQ==", - "requires": { - "@ardatan/aggregate-error": "0.0.6", - "camel-case": "4.1.1", - "tslib": "~2.0.1" - } - }, - "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", - "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", - "requires": { - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", - "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", - "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@graphql-typed-document-node/core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", - "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==" - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "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==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "requires": { - "debug": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" - }, - "@mapbox/hast-util-table-cell-style": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz", - "integrity": "sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA==", - "requires": { - "unist-util-visit": "^1.3.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "@mdx-js/mdx": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.16.tgz", - "integrity": "sha512-jnYyJ0aCafCIehn3GjYcibIapaLBgs3YkoenNQBPcPFyyuUty7B3B07OE+pMllhJ6YkWeP/R5Ax19x0nqTzgJw==", - "requires": { - "@babel/core": "7.10.5", - "@babel/plugin-syntax-jsx": "7.10.4", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.16", - "babel-plugin-apply-mdx-type-prop": "1.6.16", - "babel-plugin-extract-import-names": "1.6.16", - "camelcase-css": "2.0.1", - "detab": "2.0.3", - "hast-util-raw": "6.0.0", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "9.1.0", - "remark-footnotes": "1.0.0", - "remark-mdx": "1.6.16", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.1.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "unified": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.1.0.tgz", - "integrity": "sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - } - } - }, - "@mdx-js/react": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.8.tgz", - "integrity": "sha512-L3rehITVxqDHOPJFGBSHKt3Mv/p3MENYlGIwLNYU89/iVqTLMD/vz8hL9RQtKqRoMbKuWpzzLlKIObqJzthNYg==" - }, - "@mdx-js/runtime": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/runtime/-/runtime-2.0.0-next.7.tgz", - "integrity": "sha512-+Nnjjs1LsdxkkdLODnFE0gz0B69uYJ+eUxScUBDoOY61jnm1NTvq/Axu3/Ax4YMtNwVCQMqBXXeOgLBDku1ISg==", - "requires": { - "@mdx-js/mdx": "^2.0.0-next.7", - "@mdx-js/react": "^2.0.0-next.7", - "buble-jsx-only": "^0.19.8" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@mdx-js/mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", - "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", - "requires": { - "@babel/core": "7.10.5", - "@babel/plugin-syntax-jsx": "7.10.4", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "^2.0.0-next.7", - "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", - "babel-plugin-extract-export-names": "^2.0.0-next.7", - "babel-plugin-extract-import-names": "^2.0.0-next.7", - "camelcase-css": "2.0.1", - "detab": "2.0.3", - "hast-to-hyperscript": "9.0.0", - "hast-util-raw": "6.0.0", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "9.1.0", - "remark-footnotes": "1.0.0", - "remark-mdx": "^2.0.0-next.7", - "remark-mdxjs": "^2.0.0-next.7", - "remark-parse": "8.0.2", - "remark-squeeze-paragraphs": "4.0.0", - "unified": "9.0.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - } - }, - "@mdx-js/react": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", - "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" - }, - "@mdx-js/util": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", - "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", - "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "^2.0.0-next.7" - } - }, - "babel-plugin-extract-import-names": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", - "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "requires": { - "repeat-string": "^1.0.0" - } - }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "remark-mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", - "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", - "requires": { - "parse-entities": "^2.0.0", - "remark-stringify": "^8.1.0", - "stringify-entities": "^3.0.1", - "strip-indent": "^3.0.0", - "unist-util-stringify-position": "^2.0.3" - } - }, - "remark-parse": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", - "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "stringify-entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", - "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.2", - "is-hexadecimal": "^1.0.0" - } - }, - "unified": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", - "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - } - } - }, - "@mdx-js/util": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.16.tgz", - "integrity": "sha512-SFtLGIGZummuyMDPRL5KdmpgI8U19Ble28UjEWihPjGxF1Lgj8aDjLWY8KiaUy9eqb9CKiVCqEIrK9jbnANfkw==" - }, - "@mikaelkristiansson/domready": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mikaelkristiansson/domready/-/domready-1.0.10.tgz", - "integrity": "sha512-6cDuZeKSCSJ1KvfEQ25Y8OXUjqDJZ+HgUs6dhASWbAX8fxVraTfPsSeRe2bN+4QJDsgUaXaMWBYfRomCr04GGg==" - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@pieh/friendly-errors-webpack-plugin": { - "version": "1.7.0-chalk-2", - "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz", - "integrity": "sha512-65+vYGuDkHBCWWjqzzR/Ck318+d6yTI00EqII9qe3aPD1J3Olhvw0X38uM5moQb1PK/ksDXwSoPGt/5QhCiotw==", - "requires": { - "chalk": "^2.4.2", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0", - "strip-ansi": "^3" - } - }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.3.3.tgz", - "integrity": "sha512-uc6FmPEegAZawSHjUMFQwU7EjaDn7zy1iD/KD/wBROL9F4378OES8MKMYHoRAKT61Fk7LxVKZSDR5VespMQiqw==", - "requires": { - "ansi-html": "^0.0.7", - "error-stack-parser": "^2.0.6", - "html-entities": "^1.2.1", - "lodash.debounce": "^4.0.8", - "native-url": "^0.2.6", - "schema-utils": "^2.6.5" - } - }, - "@popperjs/core": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", - "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==" - }, - "@reach/alert": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/alert/-/alert-0.10.3.tgz", - "integrity": "sha512-Nu0XRKsHdM4gblgIgfTyJSl2KV1vrRTVVCVpol/f/ZVckTXAM/qN0C+JCCZSMfdjtt3u29CX6pRNkVu3PLfYsQ==", - "requires": { - "@reach/utils": "^0.10.3", - "@reach/visually-hidden": "^0.10.2", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/auto-id": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/auto-id/-/auto-id-0.10.5.tgz", - "integrity": "sha512-we4/bwjFxJ3F+2eaddQ1HltbKvJ7AB8clkN719El7Zugpn/vOjfPMOVUiBqTmPGLUvkYrq4tpuFwLvk2HyOVHg==", - "requires": { - "@reach/utils": "0.10.5", - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@reach/combobox": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/combobox/-/combobox-0.10.3.tgz", - "integrity": "sha512-Z9Xl+j4Tm9JNC6ouHhzL0lv2Y+Of5/tD7CnpxaVudeIeXQKjeg5YSUCnIBU/OTUtRsIllkgACk70SGHqvntQAw==", - "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/descendants": "^0.10.3", - "@reach/popover": "^0.10.3", - "@reach/portal": "^0.10.3", - "@reach/utils": "^0.10.3", - "highlight-words-core": "1.2.2", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/descendants": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/descendants/-/descendants-0.10.5.tgz", - "integrity": "sha512-8HhN4DwS/HsPQ+Ym/Ft/XJ1spXBYdE8hqpnbYR9UcU7Nx3oDbTIdhjA6JXXt23t5avYIx2jRa8YHCtVKSHuiwA==", - "requires": { - "@reach/utils": "0.10.5", - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@reach/dialog": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/dialog/-/dialog-0.10.3.tgz", - "integrity": "sha512-RMpUHNjRQhkjGzKt9/oLmDhwUBikW3JbEzgzZngq5MGY5kWRPwYInLDkEA8We4E43AbBsl5J/PRzQha9V+EEXw==", - "requires": { - "@reach/portal": "^0.10.3", - "@reach/utils": "^0.10.3", - "prop-types": "^15.7.2", - "react-focus-lock": "^2.3.1", - "react-remove-scroll": "^2.3.0", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/menu-button": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/menu-button/-/menu-button-0.10.3.tgz", - "integrity": "sha512-50C5nl7JJG9YcKqngmwTLVft+ZF2MMieto1GSCC7qEU8ykUNz0p69Ipup+Eqjk7KRHpSIYPlYIfAOS75dDuiZQ==", - "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/descendants": "^0.10.3", - "@reach/popover": "^0.10.3", - "@reach/utils": "^0.10.3", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/observe-rect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", - "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" - }, - "@reach/popover": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/popover/-/popover-0.10.3.tgz", - "integrity": "sha512-41iNfdjd9/5HtYuhezTc9z9WGkloYFVB8wBmPX3QOTuBP4qYd0La5sXClrfyiVqPn/uj1gGzehrZKuh8oSkorw==", - "requires": { - "@reach/portal": "^0.10.3", - "@reach/rect": "^0.10.3", - "@reach/utils": "^0.10.3", - "tabbable": "^4.0.0", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/portal": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/portal/-/portal-0.10.5.tgz", - "integrity": "sha512-K5K8gW99yqDPDCWQjEfSNZAbGOQWSx5AN2lpuR1gDVoz4xyWpTJ0k0LbetYJTDVvLP/InEcR7AU42JaDYDCXQw==", - "requires": { - "@reach/utils": "0.10.5", - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@reach/rect": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/rect/-/rect-0.10.5.tgz", - "integrity": "sha512-JBKs2HniYecq5zLO6UFReX28SUBPM3n0aizdNgHuvwZmDcTfNV4jsuJYQLqJ+FbCQsrSHkBxKZqWpfGXY9bUEg==", - "requires": { - "@reach/observe-rect": "1.2.0", - "@reach/utils": "0.10.5", - "prop-types": "^15.7.2", - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@reach/router": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.4.tgz", - "integrity": "sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==", - "requires": { - "create-react-context": "0.3.0", - "invariant": "^2.2.3", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4" - } - }, - "@reach/tabs": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/tabs/-/tabs-0.10.3.tgz", - "integrity": "sha512-yKHyb4NRah9+V8kjkgzIXnj+FPG9aNfHX9uBs32A4MAG4RQLsZr9jBVSoWV1jxMUcYDe4CLtQj8qVphaW/GB2A==", - "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/descendants": "^0.10.3", - "@reach/utils": "^0.10.3", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/tooltip": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@reach/tooltip/-/tooltip-0.10.3.tgz", - "integrity": "sha512-tbj569uSJ+O86fAvR62lK8Tb00aTQxah6dFKgf06lskCGUoYzeFxkZTds9b+TRjzz9G1v68McQHwuAZUH0XrGA==", - "requires": { - "@reach/auto-id": "^0.10.3", - "@reach/portal": "^0.10.3", - "@reach/rect": "^0.10.3", - "@reach/utils": "^0.10.3", - "@reach/visually-hidden": "^0.10.2", - "prop-types": "^15.7.2", - "tslib": "^1.11.2" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - } - } - }, - "@reach/utils": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@reach/utils/-/utils-0.10.5.tgz", - "integrity": "sha512-5E/xxQnUbmpI/LrufBAOXjunl96DnqX6B4zC2MO2KH/dRzLug5gM5VuOwV26egsp0jvsSPxojwciOhS43px3qw==", - "requires": { - "@types/warning": "^3.0.0", - "tslib": "^2.0.0", - "warning": "^4.0.3" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@reach/visually-hidden": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.10.4.tgz", - "integrity": "sha512-GnuPuTRCf+Ih47BoKvGyB+jP8EVWLb04GfbGa5neOrjdp90qrb4zr7pMSL4ZvTsrxt9MRooJA2BhSxs5DbyqCQ==", - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - } - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@sindresorhus/slugify": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-0.9.1.tgz", - "integrity": "sha512-b6heYM9dzZD13t2GOiEQTDE0qX+I1GyOotMwKh9VQqzuNiVdPVT8dM43fe9HNb/3ul+Qwd5oKSEDrDIfhq3bnQ==", - "requires": { - "escape-string-regexp": "^1.0.5", - "lodash.deburr": "^4.1.0" - } - }, - "@sindresorhus/transliterate": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.1.tgz", - "integrity": "sha512-QSdIQ5keUFAZ3KLbfbsntW39ox0Ym8183RqTwBq/ZEFoN3NQAtGV+qWaNdzKpIDHgj9J2CQ2iNDRVU11Zyr7MQ==", - "requires": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } - } - }, - "@styled-system/css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", - "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==" - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", - "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" - }, - "@svgr/babel-preset": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", - "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", - "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", - "requires": { - "@svgr/plugin-jsx": "^4.3.3", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "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=" - } - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", - "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", - "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", - "requires": { - "@babel/core": "^7.4.5", - "@svgr/babel-preset": "^4.3.3", - "@svgr/hast-util-to-babel-ast": "^4.3.2", - "svg-parser": "^2.0.0" - } - }, - "@svgr/plugin-svgo": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", - "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", - "requires": { - "cosmiconfig": "^5.2.1", - "merge-deep": "^3.0.2", - "svgo": "^1.2.2" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "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=" - } - } - }, - "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", - "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@tippyjs/react": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.1.0.tgz", - "integrity": "sha512-g6Dpm46edr9T9z+BYxd/eJZa6QMFc4T4z5xrztxVlkti7AhNYf7OaE6b3Nh+boUZZ9wn8xkNq9VrQM5K4huwnQ==", - "requires": { - "tippy.js": "^6.2.0" - } - }, - "@turist/fetch": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@turist/fetch/-/fetch-7.1.7.tgz", - "integrity": "sha512-XP20kvfyMNlWdPVQXyuzA40LoCHbbJptikt7W+TlZ5sS+NNjk70xjXCtHBLEudp7li3JldXEFSIUzpW1a0WEhA==", - "requires": { - "@types/node-fetch": "2" - } - }, - "@turist/time": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@turist/time/-/time-0.0.1.tgz", - "integrity": "sha512-M2BiThcbxMxSKX8W4z5u9jKZn6datnM3+FpEU+eYw0//l31E2xhqi7vTAuJ/Sf0P3yhp66SDJgPu3bRRpvrdQQ==" - }, - "@types/classnames": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", - "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" - }, - "@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/common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-htRqZr5qn8EzMelhX/Xmx142z218lLyGaeZ3YR8jlze4TATRU9huKKvuBmAJEW4LCC4pnY1N6JAm6p85fMHjhg==" - }, - "@types/configstore": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", - "integrity": "sha1-zR6FU2M60xhcPy8jns/10mQ+krY=" - }, - "@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" - }, - "@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==" - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, - "@types/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==" - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz", - "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==", - "requires": { - "@types/unist": "*" - } - }, - "@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" - }, - "@types/http-proxy": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", - "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "@types/lodash": { - "version": "4.14.160", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.160.tgz", - "integrity": "sha512-aP03BShJoO+WVndoVj/WNcB/YBPt+CIU1mvaao2GRAHy2yg4pT/XS4XnVHEQBjPJGycWf/9seKEO9vopTJGkvA==" - }, - "@types/lodash.sample": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@types/lodash.sample/-/lodash.sample-4.2.6.tgz", - "integrity": "sha512-hxBvsUjPcW1O8mC9TiBE4m8TwvLuUU+zW8J6GI1M6WmPg8J87mXGt7zavpJ/9Znb+0rVsSB3VNAjCFaJ9YUJKg==", - "requires": { - "@types/lodash": "*" - } - }, - "@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", - "requires": { - "@types/unist": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" - }, - "@types/node-fetch": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", - "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", - "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/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" - }, - "@types/reach__router": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.5.tgz", - "integrity": "sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ==", - "requires": { - "@types/history": "*", - "@types/react": "*" - } - }, - "@types/react": { - "version": "16.9.49", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", - "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" - } - } - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/rimraf": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz", - "integrity": "sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==", - "requires": { - "@types/glob": "*", - "@types/node": "*" - } - }, - "@types/tinycolor2": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", - "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==" - }, - "@types/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0=" - }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" - } - }, - "@types/vfile-message": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", - "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", - "requires": { - "vfile-message": "*" - } - }, - "@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@types/yoga-layout": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", - "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" - }, - "@types/zen-observable": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.1.tgz", - "integrity": "sha512-wmk0xQI6Yy7Fs/il4EpOcflG4uonUpYGqvZARESLc2oy4u69fkatFLbJOeW4Q6awO15P4rduAe6xkwHevpXcUQ==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", - "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - } - } - }, - "@urql/core": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-1.12.3.tgz", - "integrity": "sha512-e4IXXQ4nes3KyusgYV925DuzfDAfo4ex7Ls3tZfOExkxEcXh0i0XnizXp0rvZmWRch69YCkc+Lh1Gy2aY49HTQ==", - "requires": { - "wonka": "^4.0.14" - } - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@wry/context": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.5.2.tgz", - "integrity": "sha512-B/JLuRZ/vbEKHRUiGj6xiMojST1kHhu4WcreLfNN7q9DqQFrb97cWgf/kiYsPSUCAMVN0HzfFc8XjJdzgZzfjw==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@wry/equality": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", - "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@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==" - }, - "abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "requires": { - "xtend": "~3.0.0" - }, - "dependencies": { - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "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==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "algoliasearch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.4.0.tgz", - "integrity": "sha512-Ag3wxe/nSodNl/1KbHibtkh7TNLptKE300/wnGVtszRjXivaWD6333nUpCumrYObHym/fHMHyLcmQYezXbAIWQ==", - "requires": { - "@algolia/cache-browser-local-storage": "4.4.0", - "@algolia/cache-common": "4.4.0", - "@algolia/cache-in-memory": "4.4.0", - "@algolia/client-account": "4.4.0", - "@algolia/client-analytics": "4.4.0", - "@algolia/client-common": "4.4.0", - "@algolia/client-recommendation": "4.4.0", - "@algolia/client-search": "4.4.0", - "@algolia/logger-common": "4.4.0", - "@algolia/logger-console": "4.4.0", - "@algolia/requester-browser-xhr": "4.4.0", - "@algolia/requester-common": "4.4.0", - "@algolia/requester-node-http": "4.4.0", - "@algolia/transporter": "4.4.0" - } - }, - "algoliasearch-helper": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.2.2.tgz", - "integrity": "sha512-/3XvE33R+gQKaiPdy3nmHYqhF8hqIu8xnlOicVxb1fD6uMFmxW8rGLzzrRfsPfxgAfm+c1NslLb3TzQVIB8aVA==", - "requires": { - "events": "^1.1.1" - }, - "dependencies": { - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - } - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "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=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "apollo-link": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", - "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", - "requires": { - "apollo-utilities": "^1.3.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3", - "zen-observable-ts": "^0.8.21" - } - }, - "apollo-link-http": { - "version": "1.5.17", - "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz", - "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==", - "requires": { - "apollo-link": "^1.2.14", - "apollo-link-http-common": "^0.2.16", - "tslib": "^1.9.3" - } - }, - "apollo-link-http-common": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz", - "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==", - "requires": { - "apollo-link": "^1.2.14", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3" - } - }, - "apollo-upload-client": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-14.1.1.tgz", - "integrity": "sha512-6H6AW5habDHH/9XCJ8l2qlkaohwIcO+Lt/8P2908/yx0TC0oaiDNVu+0v2YE/5gA6NP0RvztUodzJUZJz27C0g==", - "requires": { - "@apollo/client": "^3.0.2", - "@babel/runtime": "^7.10.5", - "extract-files": "^9.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "apollo-utilities": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", - "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", - "requires": { - "@wry/equality": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" - } - }, - "application-config-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", - "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "arch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", - "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "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==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, - "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=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "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==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } - }, - "array-iterate": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz", - "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA==" - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, - "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==" - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "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==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, - "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==", - "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==", - "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==", - "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=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "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=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "async-cache": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", - "integrity": "sha1-SppaidBl7F2OUlS9nulrp2xTK1o=", - "requires": { - "lru-cache": "^4.0.0" - } - }, - "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==" - }, - "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==" - }, - "async-retry-ng": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-retry-ng/-/async-retry-ng-2.0.1.tgz", - "integrity": "sha512-iitlc2murdQ3/A5Re3CcplQBEf7vOmFrFQ6RFn3+/+zZUyIHYkZnnEziMSa6YIb2Bs2EJEPZWReTxjHqvQbDbw==" - }, - "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==" - }, - "auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==" - }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001131", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz", - "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==" - }, - "postcss": { - "version": "7.0.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.33.tgz", - "integrity": "sha512-L3CKJMGkaTmz+/1AvXyOKpD7wPoUV0rBa2AdUXrsPBp8KLl5X99rY6gr4wQyMaeTo4wV+JdY7RaxlA5JsLaeig==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "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=" - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" - }, - "axe-core": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", - "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==" - }, - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "requires": { - "follow-redirects": "1.5.10" - } - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "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==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "babel-plugin-add-module-exports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.3.3.tgz", - "integrity": "sha512-hC37mm7aAdEb1n8SgggG8a1QuhZapsY/XLCi4ETSH6AVjXBCWEa50CXlOsAMPPWLnSx5Ns6mzz39uvuseh0Xjg==", - "requires": { - "chokidar": "^2.0.4" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "optional": 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" - } - } - } - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.16.tgz", - "integrity": "sha512-hjUd24Yhnr5NKtHpC2mcRBGjC6RUKGzSzjN9g5SdjT4WpL/JDlpmjyBf7vWsJJSXFvMIbzRyxF4lT9ukwOnj/w==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.16" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-emotion": { - "version": "10.0.33", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", - "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } - }, - "babel-plugin-extract-export-names": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-export-names/-/babel-plugin-extract-export-names-2.0.0-next.7.tgz", - "integrity": "sha512-CTsKh5l99oBd5jemej5BHdzxwaXDYNi3zryGEHaCcO6h3H6OAx7sQyHV76yO7eWHXFBc+t30YSuubpwJQwLHhg==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-extract-import-names": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.16.tgz", - "integrity": "sha512-Da6Ra0sbA/1Iavli8LdMbTjyrsOPaxMm4lrKl8VJN4sJI5F64qy2EpLj3+5INLvNPfW4ddwpStbfP3Rf3jIgcw==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "babel-plugin-preval": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz", - "integrity": "sha512-s8hmTlRSmzcL7cHSIi0s6WxmpOAxfIlWqSVQwBIt7V5bNBaac+8JMZ6kJXLOazMJ8gCIcb5AJgQUgPHvbSYUzw==", - "requires": { - "babel-plugin-macros": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "babel-plugin-remove-export-keywords": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-export-keywords/-/babel-plugin-remove-export-keywords-1.6.16.tgz", - "integrity": "sha512-JrB9ZASlMAfkRF+5NdgoQxgenhJxzXFEO1vrqsSDJdzLrC38L2wrvXF9mm1YLbrehkZxcrNz9UYDyARP4jaY9g==" - }, - "babel-plugin-remove-graphql-queries": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.19.tgz", - "integrity": "sha512-s8Ar5NtJD5JXsRntMFKBMjIauWaGCOTTyZO4XdaktRA7JW1gzzN0p1uyiW9QaNenVbzV+RR4ceObCwlfH8e/xA==" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "babel-preset-gatsby": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.5.10.tgz", - "integrity": "sha512-vusxdVDj3kF4lNjF5Fkm/S800WOaMLZYnRiLEEHK5c+9kqXX4wKoqE629i7TGgx9j9u/4ZwmuLJ4cXa0iqDnQQ==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.11.5", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/preset-env": "^7.11.5", - "@babel/preset-react": "^7.10.4", - "@babel/runtime": "^7.11.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "gatsby-core-utils": "^1.3.20", - "gatsby-legacy-polyfills": "^0.0.4" - }, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", - "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.5", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "gatsby-core-utils": { - "version": "1.3.20", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.20.tgz", - "integrity": "sha512-tTry2Iz7QKfMEkYiqXOEbMhR96hpttkKeUCQAj7syC9tQwFGd1nkGlpbD4n8lBa22cXKLlL9J2edhDo1xwnfGQ==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "gatsby-legacy-polyfills": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-0.0.4.tgz", - "integrity": "sha512-BDlY9jkhEhqpQN5yvfnJYt8wTRzBOEtIQZnWHzuE7b6tYHsngxbfIMLN3UBOs9t5ZUqcPKc1C0J0NKG6NhC4Qw==", - "requires": { - "core-js-compat": "^3.6.5" - }, - "dependencies": { - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - } - }, - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "requires": { - "jsesc": "~0.5.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - } - } - }, - "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=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "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==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.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=", - "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==", - "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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "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==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, - "better-opn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-1.0.0.tgz", - "integrity": "sha512-q3eO2se4sFbTERB1dFBDdjTiIIpRohMErpwBX21lhPvmgmQNNrcQj0zbWRhMREDesJvyod9kxBS3kOtdAvkB/A==", - "requires": { - "open": "^6.4.0" - } - }, - "better-queue": { - "version": "3.8.10", - "resolved": "https://registry.npmjs.org/better-queue/-/better-queue-3.8.10.tgz", - "integrity": "sha512-e3gwNZgDCnNWl0An0Tz6sUjKDV9m6aB+K9Xg//vYeo8+KiH8pWhLFxkawcXhm6FpM//GfD9IQv/kmvWCAVVpKA==", - "requires": { - "better-queue-memory": "^1.0.1", - "node-eta": "^0.9.0", - "uuid": "^3.0.0" - } - }, - "better-queue-memory": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/better-queue-memory/-/better-queue-memory-1.0.4.tgz", - "integrity": "sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "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==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "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" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "bowser": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", - "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "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==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "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==", - "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=", - "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=" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.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==", - "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==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", - "requires": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.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=", - "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=", - "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==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", - "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001112", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz", - "integrity": "sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==" - }, - "electron-to-chromium": { - "version": "1.3.526", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.526.tgz", - "integrity": "sha512-HiroW5ZbGwgT8kCnoEO8qnGjoTPzJxduvV/Vv/wH63eo2N6Zj3xT5fmmaSPAPUM05iN9/5fIEkIg3owTtV6QZg==" - }, - "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" - } - } - }, - "buble-jsx-only": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/buble-jsx-only/-/buble-jsx-only-0.19.8.tgz", - "integrity": "sha512-7AW19pf7PrKFnGTEDzs6u9+JZqQwM1VnLS19OlqYDhXomtFFknnoQJAPHeg84RMFWAvOhYrG7harizJNwUKJsA==", - "requires": { - "acorn": "^6.1.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-jsx": "^5.0.1", - "chalk": "^2.4.2", - "magic-string": "^0.25.3", - "minimist": "^1.2.0", - "regexpu-core": "^4.5.4" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - } - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-es6": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", - "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "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==" - }, - "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==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" - }, - "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=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "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" - }, - "dependencies": { - "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==", - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cache-manager": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", - "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", - "requires": { - "async": "1.5.2", - "lodash.clonedeep": "4.5.0", - "lru-cache": "4.0.0" - } - }, - "cache-manager-fs-hash": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/cache-manager-fs-hash/-/cache-manager-fs-hash-0.0.9.tgz", - "integrity": "sha512-G0RUUSMZADiMx/0tHjPa+uzJyjtVB/Xt9yuFm6g/rBpm0p/IMr4atUWX2G2f1yGCPmDnyUcFz4RlSpgNRgvldg==", - "requires": { - "lockfile": "^1.0.4" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "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=" - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "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==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001025", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz", - "integrity": "sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ==" - }, - "case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "ccount": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", - "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "change-case": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", - "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", - "requires": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "change-emitter": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", - "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "dependencies": { - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } - } - }, - "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "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==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.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==", - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "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==", - "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==" - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", - "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==" - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "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==" - }, - "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==" - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, - "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", - "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "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" - } - } - } - }, - "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" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=" - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "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==", - "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=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "optional": 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" - } - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "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==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "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==" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "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==", - "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==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concurrently": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz", - "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", - "requires": { - "chalk": "^2.4.2", - "date-fns": "^2.0.1", - "lodash": "^4.17.15", - "read-pkg": "^4.0.1", - "rxjs": "^6.5.2", - "spawn-command": "^0.0.2-1", - "supports-color": "^6.1.0", - "tree-kill": "^1.2.2", - "yargs": "^13.3.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==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "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==" - }, - "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==" - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", - "requires": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "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==" - }, - "contentful-management": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/contentful-management/-/contentful-management-5.28.0.tgz", - "integrity": "sha512-o+qihN3zrD6+/BT/e8n26jl/zQvmV6+9S6NY5QDmzM+IaiSeCk6yvPMq74s+IZT9mOS54igl6qFTbeIpdJ9FDA==", - "requires": { - "axios": "^0.19.0", - "contentful-sdk-core": "^6.4.0", - "lodash": "^4.17.11", - "type-fest": "0.15.1" - }, - "dependencies": { - "type-fest": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.15.1.tgz", - "integrity": "sha512-n+UXrN8i5ioo7kqT/nF8xsEzLaqFra7k32SEsSPwvXVGyAcRgV/FUQN/sgfptJTR1oRmmq7z4IXMFSM7im7C9A==" - } - } - }, - "contentful-sdk-core": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-6.4.5.tgz", - "integrity": "sha512-rygNuiwbG6UKrJg6EDlaKewayTeLWrjA2wJwVmq7rV/DYo0cic6t28y0EMhRQ4pgJDV5HyUQFoFeBm2lwLfG2Q==", - "requires": { - "lodash": "^4.17.10", - "qs": "^6.5.2" - } - }, - "convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==" - }, - "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==", - "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==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", - "requires": { - "toggle-selection": "^1.0.6" - } - }, - "copyfiles": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.3.0.tgz", - "integrity": "sha512-73v7KFuDFJ/ofkQjZBMjMBFWGgkS76DzXvBMUh7djsMOE5EELWtAO/hRB6Wr5Vj5Zg+YozvoHemv0vnXpqxmOQ==", - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "yargs": "^15.3.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" - }, - "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==", - "requires": { - "browserslist": "^4.8.3", - "semver": "7.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", - "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" - } - }, - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" - }, - "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=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "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==", - "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==", - "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" - } - }, - "create-react-context": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", - "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", - "requires": { - "gud": "^1.0.0", - "warning": "^4.0.3" - } - }, - "cross-fetch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz", - "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=", - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "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==", - "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" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "css-b64-images": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz", - "integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=" - }, - "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=" - }, - "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==", - "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": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "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==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "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==" - }, - "css-selector-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", - "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "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==", - "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==" - } - } - }, - "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==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "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=" - } - } - }, - "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==", - "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=" - }, - "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=" - }, - "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==", - "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==" - }, - "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", - "requires": { - "css-tree": "1.0.0-alpha.37" - } - }, - "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "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=" - }, - "d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "requires": { - "d3-array": "^1.1.1" - } - }, - "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "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-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "requires": { - "d3-dsv": "1" - } - }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "requires": { - "d3-array": "1" - } - }, - "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-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "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-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "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.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "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==" - }, - "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "requires": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", - "requires": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" - }, - "date-fns": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.15.0.tgz", - "integrity": "sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ==" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "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=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "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==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "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=" - }, - "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==", - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "dependencies": { - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "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" - } - } - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", - "requires": { - "abstract-leveldown": "~0.12.1" - } - }, - "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==", - "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==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "optional": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "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=" - }, - "detab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz", - "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==", - "requires": { - "repeat-string": "^1.5.4" - } - }, - "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" - }, - "detect-newline": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-1.0.3.tgz", - "integrity": "sha1-6XsQA4d9cMCa8a81v63/Fo3kkg0=", - "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0" - } - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" - }, - "detect-node-es": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.0.0.tgz", - "integrity": "sha512-S4AHriUkTX9FoFvL4G8hXDcx6t3gp2HpfCza3Q0v6S78gul2hKWifLQbeW+ZF89+hSm2ZIc/uF3J97ZgytgTRg==" - }, - "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "detect-port-alt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", - "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "devcert": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.1.3.tgz", - "integrity": "sha512-7/nIzKdQ8y2K0imjIP7dyg2GJ2h38Ps6VOMXWZHIarNDV3p6mTXyEugKFnkmsZ2DD58JEG34ILyVb3qdOMmP9w==", - "requires": { - "@types/configstore": "^2.1.1", - "@types/debug": "^0.0.30", - "@types/get-port": "^3.2.0", - "@types/glob": "^5.0.34", - "@types/lodash": "^4.14.92", - "@types/mkdirp": "^0.5.2", - "@types/node": "^8.5.7", - "@types/rimraf": "^2.0.2", - "@types/tmp": "^0.0.33", - "application-config-path": "^0.1.0", - "command-exists": "^1.2.4", - "debug": "^3.1.0", - "eol": "^0.9.1", - "get-port": "^3.2.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "password-prompt": "^1.0.4", - "rimraf": "^2.6.2", - "sudo-prompt": "^8.2.0", - "tmp": "^0.0.33", - "tslib": "^1.10.0" - }, - "dependencies": { - "@types/glob": { - "version": "5.0.36", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.36.tgz", - "integrity": "sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg==", - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/node": { - "version": "8.10.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.64.tgz", - "integrity": "sha512-/EwBIb+imu8Qi/A3NF9sJ9iuKo7yV+pryqjmeRqaU0C4wBAOhas5mdvoYeJ5PCKrh6thRSJHdoasFqh3BQGILA==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "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==", - "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=", - "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==", - "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==", - "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==", - "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==" - } - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "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==" - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", - "requires": { - "no-case": "^2.2.0" - } - }, - "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==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "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=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.345", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz", - "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==" - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "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==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", - "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "0.3.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "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==", - "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==" - }, - "entity-decode": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/entity-decode/-/entity-decode-2.0.2.tgz", - "integrity": "sha512-5CCY/3ci4MC1m2jlumNjWd7VBFt4VfFnmSqSNmVcXq4gxM3Vmarxtt+SvmBnzwLS669MWdVuXboNVj1qN2esVg==", - "requires": { - "he": "^1.1.1" - } - }, - "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==" - }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "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==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", - "requires": { - "stackframe": "^1.1.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==", - "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==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=" - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.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==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "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==" - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" - } - } - }, - "eslint-config-react-app": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz", - "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==", - "requires": { - "confusing-browser-globals": "^1.0.9" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "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==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-loader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", - "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "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==", - "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=", - "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=", - "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=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "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=", - "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=" - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", - "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", - "requires": { - "lodash": "^4.17.15" - } - }, - "eslint-plugin-graphql": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.1.1.tgz", - "integrity": "sha512-VNu2AipS8P1BAnE/tcJ2EmBWjFlCnG+1jKdUlFNDQjocWZlFiPpMu9xYNXePoEXK+q+jG51M/6PdhOjEgJZEaQ==", - "requires": { - "graphql-config": "^2.0.1", - "lodash": "^4.11.1" - } - }, - "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "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=" - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", - "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", - "requires": { - "@babel/runtime": "^7.10.2", - "aria-query": "^4.2.2", - "array-includes": "^3.1.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^3.5.4", - "axobject-query": "^2.1.2", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "language-tags": "^1.0.5" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "emoji-regex": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", - "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==" - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "eslint-plugin-react": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz", - "integrity": "sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==", - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flatmap": "^1.2.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "object.entries": "^1.1.2", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.17.0", - "string.prototype.matchall": "^4.0.2" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-react-hooks": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" - }, - "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==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.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==" - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eval": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.4.tgz", - "integrity": "sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw==", - "requires": { - "require-like": ">= 0.1.1" - } - }, - "event-source-polyfill": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.18.tgz", - "integrity": "sha512-4ooLMUkUYFNXjYl96twwoMkXrhwmue5aI5ayU4ORswP2b8F6bYGNsdkYqutWV77DKJLI+ZRRLvZZTSuZcUCVTA==" - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "requires": { - "original": ">=0.0.5" - } - }, - "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==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.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==", - "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=", - "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=", - "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=" - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "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==", - "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": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "express-graphql": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.9.0.tgz", - "integrity": "sha512-wccd9Lb6oeJ8yHpUs/8LcnGjFUUQYmOG9A5BNLybRdCzGw0PeUrtBxsIR8bfiur6uSW4OvPkVDoYH06z6/N9+w==", - "requires": { - "accepts": "^1.3.7", - "content-type": "^1.0.4", - "http-errors": "^1.7.3", - "raw-body": "^2.4.1" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.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=", - "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=", - "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==", - "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==", - "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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extract-files": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", - "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==" - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "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==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastest-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz", - "integrity": "sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "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=" - } - } - }, - "fd": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/fd/-/fd-0.0.3.tgz", - "integrity": "sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==" - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "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==", - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "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==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.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==", - "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==" - }, - "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==", - "requires": { - "find-up": "^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==" - } - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "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==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=" - }, - "focus-lock": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.7.0.tgz", - "integrity": "sha512-LI7v2mH02R55SekHYdv9pRHR9RajVNyIJ2N5IEkWbg7FT5ZmJ9Hw4mWxHeEUcd+dJo0QmzztHvDvWcc7prVFsw==" - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "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==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formik": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.1.5.tgz", - "integrity": "sha512-bWpo3PiqVDYslvrRjTq0Isrm0mFXHiO33D8MS6t6dWcqSFGeYF52nlpCM2xwOJ6tRVRznDkL+zz/iHPL4LDuvQ==", - "requires": { - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.14", - "lodash-es": "^4.17.14", - "react-fast-compare": "^2.0.1", - "scheduler": "^0.18.0", - "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" - } - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "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=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=" - }, - "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==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.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=", - "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=" - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "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=" - }, - "fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", - "requires": { - "readable-stream": "~1.0.26-4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "gatsby": { - "version": "2.24.51", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.24.51.tgz", - "integrity": "sha512-z7Fkvg+sk9uSETmhsyml6eITWdvXCC8Q4JmLgBzDlKweZPTudwScO2HRUdXxQIANcdIu7u6NU3In52a3P3ZwLA==", - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/core": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/runtime": "^7.10.3", - "@babel/traverse": "^7.10.3", - "@babel/types": "^7.10.3", - "@hapi/joi": "^15.1.1", - "@mikaelkristiansson/domready": "^1.0.10", - "@pieh/friendly-errors-webpack-plugin": "1.7.0-chalk-2", - "@pmmmwh/react-refresh-webpack-plugin": "^0.3.3", - "@reach/router": "^1.3.4", - "@types/http-proxy": "^1.17.4", - "@typescript-eslint/eslint-plugin": "^2.24.0", - "@typescript-eslint/parser": "^2.24.0", - "address": "1.1.2", - "autoprefixer": "^9.8.4", - "axios": "^0.19.2", - "babel-core": "7.0.0-bridge.0", - "babel-eslint": "^10.1.0", - "babel-loader": "^8.1.0", - "babel-plugin-add-module-exports": "^0.3.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "babel-plugin-remove-graphql-queries": "^2.9.17", - "babel-preset-gatsby": "^0.5.7", - "better-opn": "1.0.0", - "better-queue": "^3.8.10", - "bluebird": "^3.7.2", - "browserslist": "^4.12.2", - "cache-manager": "^2.11.1", - "cache-manager-fs-hash": "^0.0.9", - "chalk": "^2.4.2", - "chokidar": "3.4.0", - "common-tags": "^1.8.0", - "compression": "^1.7.4", - "convert-hrtime": "^3.0.0", - "copyfiles": "^2.3.0", - "core-js": "^3.6.5", - "cors": "^2.8.5", - "css-loader": "^1.0.1", - "date-fns": "^2.14.0", - "debug": "^3.2.6", - "del": "^5.1.0", - "detect-port": "^1.3.0", - "devcert": "^1.1.3", - "dotenv": "^8.2.0", - "eslint": "^6.8.0", - "eslint-config-react-app": "^5.2.1", - "eslint-loader": "^2.2.1", - "eslint-plugin-flowtype": "^3.13.0", - "eslint-plugin-graphql": "^3.1.1", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.2", - "eslint-plugin-react-hooks": "^1.7.0", - "event-source-polyfill": "^1.0.15", - "express": "^4.17.1", - "express-graphql": "^0.9.0", - "fast-levenshtein": "^2.0.6", - "file-loader": "^1.1.11", - "find-cache-dir": "^3.3.1", - "fs-exists-cached": "1.0.0", - "fs-extra": "^8.1.0", - "gatsby-cli": "^2.12.89", - "gatsby-core-utils": "^1.3.17", - "gatsby-graphiql-explorer": "^0.4.12", - "gatsby-legacy-polyfills": "^0.0.3", - "gatsby-link": "^2.4.13", - "gatsby-plugin-page-creator": "^2.3.24", - "gatsby-plugin-typescript": "^2.4.18", - "gatsby-react-router-scroll": "^3.0.12", - "gatsby-telemetry": "^1.3.29", - "glob": "^7.1.6", - "got": "8.3.2", - "graphql": "^14.6.0", - "graphql-compose": "^6.3.8", - "graphql-playground-middleware-express": "^1.7.18", - "hasha": "^5.2.0", - "http-proxy": "^1.18.1", - "invariant": "^2.2.4", - "is-relative": "^1.0.0", - "is-relative-url": "^3.0.0", - "is-wsl": "^2.2.0", - "jest-worker": "^24.9.0", - "json-loader": "^0.5.7", - "json-stringify-safe": "^5.0.1", - "latest-version": "5.1.0", - "lodash": "^4.17.15", - "md5-file": "^3.2.3", - "meant": "^1.0.1", - "micromatch": "^3.1.10", - "mime": "^2.4.6", - "mini-css-extract-plugin": "^0.8.2", - "mitt": "^1.2.0", - "mkdirp": "^0.5.1", - "moment": "^2.27.0", - "name-all-modules-plugin": "^1.0.1", - "normalize-path": "^3.0.0", - "null-loader": "^3.0.0", - "opentracing": "^0.14.4", - "optimize-css-assets-webpack-plugin": "^5.0.3", - "p-defer": "^3.0.0", - "parseurl": "^1.3.3", - "physical-cpu-count": "^2.0.0", - "pnp-webpack-plugin": "^1.6.4", - "postcss-flexbugs-fixes": "^4.2.1", - "postcss-loader": "^3.0.0", - "prompts": "^2.3.2", - "prop-types": "^15.7.2", - "query-string": "^6.13.1", - "raw-loader": "^0.5.1", - "react-dev-utils": "^4.2.3", - "react-error-overlay": "^3.0.0", - "react-hot-loader": "^4.12.21", - "react-refresh": "^0.7.0", - "redux": "^4.0.5", - "redux-thunk": "^2.3.0", - "semver": "^7.3.2", - "shallow-compare": "^1.2.2", - "signal-exit": "^3.0.3", - "slugify": "^1.4.4", - "socket.io": "^2.3.0", - "socket.io-client": "2.3.0", - "st": "^2.0.0", - "stack-trace": "^0.0.10", - "string-similarity": "^1.2.2", - "style-loader": "^0.23.1", - "terser-webpack-plugin": "^1.4.4", - "tmp": "^0.2.1", - "true-case-path": "^2.2.1", - "type-of": "^2.0.1", - "url-loader": "^1.1.2", - "util.promisify": "^1.0.1", - "uuid": "^3.4.0", - "v8-compile-cache": "^1.1.2", - "webpack": "~4.43.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-dev-server": "^3.11.0", - "webpack-hot-middleware": "^2.25.0", - "webpack-merge": "^4.2.2", - "webpack-stats-plugin": "^0.3.1", - "webpack-virtual-modules": "^0.2.2", - "xstate": "^4.11.0", - "yaml-loader": "^0.6.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/standalone": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.11.6.tgz", - "integrity": "sha512-Ye1pj3fN76OWlJyi+Ocy1kTr1BNs5vFWHsq2oKPp3lB4Q0r2WrHi+n/Y2w3sZK+1QSKAkDXTp12tCuBprBHZ1w==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@mdx-js/mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.7.tgz", - "integrity": "sha512-GcdHQ+YTlIaNpsMPlw32kEp+GCrb+2GLeDDf2AFtJiRoTelgCinjYp1twxY42WF6A4K80ZYgpr0/A6PDQbKNyw==", - "requires": { - "@babel/core": "7.10.5", - "@babel/plugin-syntax-jsx": "7.10.4", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "^2.0.0-next.7", - "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.7", - "babel-plugin-extract-export-names": "^2.0.0-next.7", - "babel-plugin-extract-import-names": "^2.0.0-next.7", - "camelcase-css": "2.0.1", - "detab": "2.0.3", - "hast-to-hyperscript": "9.0.0", - "hast-util-raw": "6.0.0", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "9.1.0", - "remark-footnotes": "1.0.0", - "remark-mdx": "^2.0.0-next.7", - "remark-mdxjs": "^2.0.0-next.7", - "remark-parse": "8.0.2", - "remark-squeeze-paragraphs": "4.0.0", - "unified": "9.0.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "remark-parse": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", - "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "unified": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", - "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - } - } - }, - "@mdx-js/react": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.7.tgz", - "integrity": "sha512-VugV3o0zOD6pABtQEDDWNxiU8f+tS4KMiOgnwNiyxxOEwEZgBnXfMhZYDtHfrnhHxS59ValJ5zITnbdBwPbJkA==" - }, - "@mdx-js/util": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", - "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" - }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.7.tgz", - "integrity": "sha512-JhT3sMNjNRzrMxpgkVUN5s3UvDpDCcUTsqsgZvIC2OXtQqNR8ZJxMHckbAJRWmz0YqyuVbFgLUQKpDGHAAB6GA==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "^2.0.0-next.7" - } - }, - "babel-plugin-extract-import-names": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.7.tgz", - "integrity": "sha512-WSYLKKC9a3nLbfnrrbXoEeC8LS3jCn1wBWOcc4Tlwl7n97EBuvCEEMQCHnV7rEDQFl9impbAKr9kLH0QEa8IXg==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "cross-fetch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", - "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", - "requires": { - "node-fetch": "2.6.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "flatted": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.0.5.tgz", - "integrity": "sha512-bDEpEsHk2pHn4R+slxblk0N0gK5lQsK2aRwW6LJyIpX3o9qhoVkufDjDvU3fpSJbR7UgOl+icRoR9agYyjzMTw==" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "gatsby-cli": { - "version": "2.12.99", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.99.tgz", - "integrity": "sha512-LHPX8bRHye69LPS9OiLw9in2ypyEnsxcU2p1MiBEs542D7bGmNXvJW61vN1kcXB9t5kFs3Ka2LDJjSn+5LbhfQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@hapi/joi": "^15.1.1", - "@types/common-tags": "^1.8.0", - "better-opn": "^1.0.0", - "chalk": "^2.4.2", - "clipboardy": "^2.3.0", - "common-tags": "^1.8.0", - "configstore": "^5.0.1", - "convert-hrtime": "^3.0.0", - "envinfo": "^7.5.1", - "execa": "^3.4.0", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.20", - "gatsby-recipes": "^0.2.27", - "gatsby-telemetry": "^1.3.35", - "hosted-git-info": "^3.0.4", - "ink": "^2.7.1", - "ink-spinner": "^3.1.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.20", - "meant": "^1.0.1", - "node-fetch": "^2.6.0", - "opentracing": "^0.14.4", - "pretty-error": "^2.1.1", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "react": "^16.8.0", - "redux": "^4.0.5", - "resolve-cwd": "^3.0.0", - "semver": "^7.3.2", - "signal-exit": "^3.0.3", - "source-map": "0.7.3", - "stack-trace": "^0.0.10", - "strip-ansi": "^5.2.0", - "update-notifier": "^4.1.0", - "uuid": "3.4.0", - "yargs": "^15.3.1", - "yurnalist": "^1.1.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "gatsby-core-utils": { - "version": "1.3.20", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.20.tgz", - "integrity": "sha512-tTry2Iz7QKfMEkYiqXOEbMhR96hpttkKeUCQAj7syC9tQwFGd1nkGlpbD4n8lBa22cXKLlL9J2edhDo1xwnfGQ==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "gatsby-recipes": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.27.tgz", - "integrity": "sha512-UaLmM4/+yyzQ/LSBu5kp8SrGe5ebOoiG/GU4z7UmKyL/rFaMdHPbWgc779b/LvJZX0159WxTHugeyQqT6JIjlg==", - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.11.6", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/standalone": "^7.11.6", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.5", - "@emotion/core": "^10.0.14", - "@emotion/styled": "^10.0.14", - "@graphql-tools/schema": "^6.0.14", - "@graphql-tools/utils": "^6.0.14", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "^15.1.1", - "@mdx-js/mdx": "^2.0.0-next.4", - "@mdx-js/react": "^2.0.0-next.4", - "@mdx-js/runtime": "^2.0.0-next.4", - "acorn": "^7.2.0", - "acorn-jsx": "^5.2.0", - "ansi-html": "^0.0.7", - "babel-plugin-remove-export-keywords": "^1.6.5", - "better-queue": "^3.8.10", - "chokidar": "^3.4.2", - "concurrently": "^5.0.0", - "contentful-management": "^5.26.3", - "cors": "^2.8.5", - "cross-fetch": "^3.0.6", - "debug": "^4.1.1", - "detect-port": "^1.3.0", - "dotenv": "^8.2.0", - "execa": "^4.0.2", - "express": "^4.17.1", - "express-graphql": "^0.9.0", - "flatted": "^3.0.0", - "formik": "^2.0.8", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.20", - "gatsby-interface": "^0.0.166", - "gatsby-telemetry": "^1.3.35", - "glob": "^7.1.6", - "graphql": "^14.6.0", - "graphql-compose": "^6.3.8", - "graphql-subscriptions": "^1.1.0", - "graphql-type-json": "^0.3.2", - "hicat": "^0.7.0", - "html-tag-names": "^1.1.5", - "ink-box": "^1.0.0", - "is-binary-path": "^2.1.0", - "is-url": "^1.2.4", - "jest-diff": "^25.5.0", - "lock": "^1.0.0", - "lodash": "^4.17.20", - "mitt": "^1.2.0", - "mkdirp": "^0.5.1", - "node-fetch": "^2.5.0", - "normalize.css": "^8.0.1", - "pkg-dir": "^4.2.0", - "prettier": "^2.0.5", - "prop-types": "^15.6.1", - "property-information": "5.5.0", - "react-circular-progressbar": "^2.0.0", - "react-icons": "^3.0.1", - "react-reconciler": "^0.25.1", - "remark-mdx": "^2.0.0-next.4", - "remark-mdxjs": "^2.0.0-next.4", - "remark-parse": "^6.0.3", - "remark-stringify": "^8.1.0", - "resolve-cwd": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "single-trailing-newline": "^1.0.0", - "strip-ansi": "^6.0.0", - "style-to-object": "^0.3.0", - "subscriptions-transport-ws": "^0.9.16", - "svg-tag-names": "^2.0.1", - "unified": "^8.4.2", - "unist-util-remove": "^2.0.0", - "unist-util-visit": "^2.0.2", - "urql": "^1.9.7", - "uuid": "3.4.0", - "ws": "^7.3.0", - "xstate": "^4.9.1", - "yoga-layout-prebuilt": "^1.9.6", - "yup": "^0.27.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "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" - } - } - } - }, - "gatsby-telemetry": { - "version": "1.3.35", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.35.tgz", - "integrity": "sha512-MFMQl5KCOO6Xzlp2JMO4bRbsh1rjQDsbkJRZgYZB9izmPSK8AgNrHCjruxZC448ndtUfIVwjHnV+/K18XuPCHw==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.11.2", - "@turist/fetch": "^7.1.7", - "@turist/time": "^0.0.1", - "async-retry-ng": "^2.0.1", - "boxen": "^4.2.0", - "configstore": "^5.0.1", - "envinfo": "^7.7.3", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.20", - "git-up": "^4.0.2", - "is-docker": "^2.1.1", - "lodash": "^4.17.20", - "node-fetch": "^2.6.0", - "uuid": "3.4.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - } - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "git-up": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", - "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "hosted-git-info": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", - "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "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" - } - }, - "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==", - "requires": { - "yallist": "^4.0.0" - } - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "requires": { - "repeat-string": "^1.0.0" - } - }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "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==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "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==", - "requires": { - "find-up": "^4.0.0" - } - }, - "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==" - }, - "property-information": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", - "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "remark-mdx": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.7.tgz", - "integrity": "sha512-JHYCfxJzvjTw8h5y10f+mCvbfIt5klAkWlULqPu1nM/r6ghF3tzJl0AFQFj5b/m/7U553+yYb/y4n0julMERYA==", - "requires": { - "parse-entities": "^2.0.0", - "remark-stringify": "^8.1.0", - "stringify-entities": "^3.0.1", - "strip-indent": "^3.0.0", - "unist-util-stringify-position": "^2.0.3" - } - }, - "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - } - } - }, - "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "stringify-entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", - "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.2", - "is-hexadecimal": "^1.0.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "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==" - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "gatsby-cli": { - "version": "2.12.107", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.12.107.tgz", - "integrity": "sha512-MEmqvYcz0TEVHVIZAjAClu9HY5SG0cRygizVRXrimQr7td7lg172zGIq3NJ6PgRbmQZIUF3MmQ8ublYqAjdg7g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@hapi/joi": "^15.1.1", - "@types/common-tags": "^1.8.0", - "better-opn": "^2.0.0", - "chalk": "^2.4.2", - "clipboardy": "^2.3.0", - "common-tags": "^1.8.0", - "configstore": "^5.0.1", - "convert-hrtime": "^3.0.0", - "envinfo": "^7.7.3", - "execa": "^3.4.0", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.23", - "gatsby-recipes": "^0.2.31", - "gatsby-telemetry": "^1.3.38", - "hosted-git-info": "^3.0.5", - "ink": "^2.7.1", - "ink-spinner": "^3.1.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.20", - "meant": "^1.0.2", - "node-fetch": "^2.6.1", - "opentracing": "^0.14.4", - "pretty-error": "^2.1.1", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "react": "^16.8.0", - "redux": "^4.0.5", - "resolve-cwd": "^3.0.0", - "semver": "^7.3.2", - "signal-exit": "^3.0.3", - "source-map": "0.7.3", - "stack-trace": "^0.0.10", - "strip-ansi": "^5.2.0", - "update-notifier": "^4.1.1", - "uuid": "3.4.0", - "yargs": "^15.4.1", - "yurnalist": "^1.1.2" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "better-opn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-2.0.0.tgz", - "integrity": "sha512-PPbGRgO/K0LowMHbH/JNvaV3qY3Vt+A2nH28fzJxy16h/DfR5OsVti6ldGl6S9SMsyUqT13sltikiAVtI6tKLA==", - "dev": true, - "requires": { - "open": "^7.0.3" - } - }, - "hosted-git-info": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.6.tgz", - "integrity": "sha512-VRvqVD5T6t9HdmNDWTwbi8H/EC722MemAhOSP5QvYAXpDAY0Nhu2I/i+bXsktu4sU5LVHSh/wmXtVU8bDtjedQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "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" - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "open": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", - "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "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" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "gatsby-core-utils": { - "version": "1.3.23", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.23.tgz", - "integrity": "sha512-H6n6dDeRZ22HAJaBUIt5YjB/BSaE8Jq+kayMUv/YzL1RL2yFZ5lqcLwIL1OE2vWk1mQjMUBZCRxLODU0q1i3bQ==", - "dev": true, - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "gatsby-design-tokens": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/gatsby-design-tokens/-/gatsby-design-tokens-2.0.10.tgz", - "integrity": "sha512-W+BNx3IJqN8VgI/dRwlzKNqBNWw5rlESq6Jd2JNyarsw9wjsN+P5/+zJvPzFG4ALs5H9agA/6iLBX7JOSqZsuA==", - "requires": { - "hex2rgba": "^0.0.1" - } - }, - "gatsby-graphiql-explorer": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.4.14.tgz", - "integrity": "sha512-B8ChC4THCF0Aa+0F1jErKzTlUAdMAUtoJ0Ayi3+zVzlTk3LsRO+/PWecHeZa/DnFzds3libYuqskclKnRyAZWg==", - "requires": { - "@babel/runtime": "^7.11.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-interface": { - "version": "0.0.166", - "resolved": "https://registry.npmjs.org/gatsby-interface/-/gatsby-interface-0.0.166.tgz", - "integrity": "sha512-PN0lTVOKu50zfY7kfjgHvT5jsYZIOdSxuWrV/WVxDXo4O3oifLiWUyfFy8zg9T8S1G+TwRyfzhWT9Pfj1CZ2Dg==", - "requires": { - "@mdx-js/react": "^1.5.2", - "@reach/alert": "0.10.3", - "@reach/combobox": "0.10.3", - "@reach/dialog": "0.10.3", - "@reach/menu-button": "0.10.3", - "@reach/popover": "0.10.3", - "@reach/tabs": "0.10.3", - "@reach/tooltip": "0.10.3", - "@types/lodash.sample": "^4.2.6", - "case": "^1.6.2", - "date-fns": "^2.8.1", - "gatsby-design-tokens": "^2.0.2", - "lodash.sample": "^4.2.1", - "theme-ui": "^0.2.49" - } - }, - "gatsby-legacy-polyfills": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/gatsby-legacy-polyfills/-/gatsby-legacy-polyfills-0.0.3.tgz", - "integrity": "sha512-W604RjkTMxFaCatE0Khk3qvLSMrioIt9bXLv7/TtNsMXLMWBBbcK5QYHnDbHB8LSdhI6LcvWDVYjviwIpcTxLA==", - "requires": { - "core-js-compat": "^3.6.5" - }, - "dependencies": { - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - } - }, - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "gatsby-link": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.4.14.tgz", - "integrity": "sha512-JLF7pb5E8flmsH2oQvGmGV1mMEuaQCzLFOXFj6FZOcG/JuOEXSb5N/Z/cp2MAlAVCyLLeYI7Ru/+o0TOpQMwkQ==", - "requires": { - "@babel/runtime": "^7.11.2", - "@types/reach__router": "^1.3.3", - "prop-types": "^15.7.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-page-utils": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.2.25.tgz", - "integrity": "sha512-0npo/wjYO94nqcjl0aMkL65LvJuVnaieJzlxpA6Fdj2s90RjKI0mCj/3VPvRBz3p0aDp5+gas4kUa5KE4B3b0Q==", - "requires": { - "@babel/runtime": "^7.11.2", - "bluebird": "^3.7.2", - "chokidar": "^3.4.2", - "fs-exists-cached": "^1.0.0", - "gatsby-core-utils": "^1.3.20", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "micromatch": "^3.1.10" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "gatsby-core-utils": { - "version": "1.3.20", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.20.tgz", - "integrity": "sha512-tTry2Iz7QKfMEkYiqXOEbMhR96hpttkKeUCQAj7syC9tQwFGd1nkGlpbD4n8lBa22cXKLlL9J2edhDo1xwnfGQ==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "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==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "gatsby-plugin-emotion": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/gatsby-plugin-emotion/-/gatsby-plugin-emotion-4.3.10.tgz", - "integrity": "sha512-OQrNgq3Te+bjra/sNo2PwOm24dPVr8MsjWf3X/3ciPf4bkf+Ey0jzJ36JnIIUIzZvpbyBHAr6eNzSOWnE2X2zA==", - "requires": { - "@babel/runtime": "^7.10.3", - "@emotion/babel-preset-css-prop": "^10.0.27" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-plugin-google-analytics": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/gatsby-plugin-google-analytics/-/gatsby-plugin-google-analytics-2.3.13.tgz", - "integrity": "sha512-K/6c9iByR8uDpFZuJrappjyMsVtWFwPyAkRlXFHhq2mmNtgZeRVKFf5XoGiOHCeMPEpBGE58LLana/F01LLteQ==", - "requires": { - "@babel/runtime": "^7.10.3", - "minimatch": "3.0.4" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-plugin-gtag": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/gatsby-plugin-gtag/-/gatsby-plugin-gtag-1.0.13.tgz", - "integrity": "sha512-Oul6O67klajrEjkkF1diD228SmyUWsAwTq/1tYq41vBwmyNiPk4dhk8K93rrNQ5d5zesSv+awBeGBa503tQqGw==" - }, - "gatsby-plugin-less": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/gatsby-plugin-less/-/gatsby-plugin-less-3.2.9.tgz", - "integrity": "sha512-JcUpHv53WdgSCKxaatqGTc/zRqJ6hc39W62ClLPLHLTtm7fa1x8RCrzuBu1kFLJl6uRkZfbAg4DSKuc50KMNNQ==", - "requires": { - "@babel/runtime": "^7.10.3", - "less-loader": "^5.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-plugin-mdx": { - "version": "1.2.37", - "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.2.37.tgz", - "integrity": "sha512-vQ/j6XiK8KMeva/dujQRjweSlOC1kSU5ggg8AV1rmFVgC/S2GEtTNpjTprzfQchNwmxrqhOWL2YaEScjNLPikA==", - "requires": { - "@babel/core": "^7.10.3", - "@babel/generator": "^7.10.3", - "@babel/helper-plugin-utils": "^7.10.3", - "@babel/plugin-proposal-object-rest-spread": "^7.10.3", - "@babel/preset-env": "^7.10.3", - "@babel/preset-react": "^7.10.1", - "@babel/types": "^7.10.3", - "camelcase-css": "^2.0.1", - "change-case": "^3.1.0", - "core-js": "^3.6.5", - "dataloader": "^1.4.0", - "debug": "^4.1.1", - "escape-string-regexp": "^1.0.5", - "eval": "^0.1.4", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.18", - "gray-matter": "^4.0.2", - "json5": "^2.1.3", - "loader-utils": "^1.4.0", - "lodash": "^4.17.15", - "mdast-util-to-string": "^1.1.0", - "mdast-util-toc": "^3.1.0", - "mime": "^2.4.6", - "p-queue": "^5.0.0", - "pretty-bytes": "^5.3.0", - "remark": "^10.0.1", - "remark-retext": "^3.1.3", - "retext-english": "^3.0.4", - "slugify": "^1.4.4", - "static-site-generator-webpack-plugin": "^3.4.2", - "style-to-object": "^0.3.0", - "underscore.string": "^3.3.5", - "unified": "^8.4.2", - "unist-util-map": "^1.0.5", - "unist-util-remove": "^1.0.3", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.5.tgz", - "integrity": "sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.6.1" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "gatsby-core-utils": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.18.tgz", - "integrity": "sha512-B7ixQb4H0e2yB0nNfM2zshOAUw3nW9MvcNsRskVFwIPJY+ngh8Srla4XWXVMJ60Fyt103+jPVZTxGq72/u5HuQ==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "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==", - "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==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-remove": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", - "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", - "requires": { - "unist-util-is": "^3.0.0" - } - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "gatsby-plugin-page-creator": { - "version": "2.3.28", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.28.tgz", - "integrity": "sha512-AS1e44tF6ahADXTVvgTRcSWAzowbO7aPxg6RbX5BuUBpAnbQgXVTISVztk5ZVPA6/tESbfrkeEEoMHHcZmbPmA==", - "requires": { - "@babel/traverse": "^7.11.5", - "@sindresorhus/slugify": "^1.1.0", - "chokidar": "^3.4.2", - "fs-exists-cached": "^1.0.0", - "gatsby-page-utils": "^0.2.25", - "globby": "^11.0.1", - "graphql": "^14.6.0", - "lodash": "^4.17.20" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@sindresorhus/slugify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.0.tgz", - "integrity": "sha512-ujZRbmmizX26yS/HnB3P9QNlNa4+UvHh+rIse3RbOXLp8yl6n1TxB4t7NHggtVgS8QmmOtzXo48kCxZGACpkPw==", - "requires": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "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==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "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==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "gatsby-plugin-printer": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz", - "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==", - "requires": { - "@sindresorhus/slugify": "^0.9.1", - "babel-plugin-preval": "^3.0.1", - "fs-extra": "^8.1.0", - "puppeteer": "^1.19.0", - "rollup": "1.23.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-commonjs": "^10.0.1", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0" - } - }, - "gatsby-plugin-react-helmet": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.3.10.tgz", - "integrity": "sha512-AcXYwmS3r298JWs6iQ3OLNxIe8L8i5a2iSdLr/SDMpHqumYm7q/vB9kCX0et5wM7DIuZ7aPXDrdi5yDCAvU5lg==", - "requires": { - "@babel/runtime": "^7.10.3" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-plugin-svgr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz", - "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg==" - }, - "gatsby-plugin-typescript": { - "version": "2.4.20", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.20.tgz", - "integrity": "sha512-GqjbK/tchTq4yT4yJWRCfbvBAaYn3fKd1w0z9YQywx26yELe8+aM1CrGSErnuTP4rQ7xmfbK+0ASh2PUb2cSwg==", - "requires": { - "@babel/core": "^7.11.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/preset-typescript": "^7.10.4", - "@babel/runtime": "^7.11.2", - "babel-plugin-remove-graphql-queries": "^2.9.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-react-router-scroll": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-3.0.13.tgz", - "integrity": "sha512-x/qLvDmvSvKiyoqiTuPWQChtHt8vzEGb4Y9mE1qFoDzX392/KEkh5p8jT7z0XZfo/yB4cQqlQOFKxIMTUOhZvg==", - "requires": { - "@babel/runtime": "^7.11.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } - } - }, - "gatsby-recipes": { - "version": "0.2.31", - "resolved": "https://registry.npmjs.org/gatsby-recipes/-/gatsby-recipes-0.2.31.tgz", - "integrity": "sha512-5sF1U+VbGpuHE4E+CdODraAZmzQS8DbHDWP/rpNYBzFalLdFs0HPngg8zb7TbzDY0p6b5umS32OF/2P9PAuVJg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.11.6", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-transform-react-jsx": "^7.10.4", - "@babel/standalone": "^7.11.6", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.5", - "@emotion/core": "^10.0.14", - "@emotion/styled": "^10.0.14", - "@graphql-tools/schema": "^6.0.14", - "@graphql-tools/utils": "^6.0.14", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "^15.1.1", - "@mdx-js/mdx": "^2.0.0-next.4", - "@mdx-js/react": "^2.0.0-next.4", - "@mdx-js/runtime": "^2.0.0-next.4", - "acorn": "^7.2.0", - "acorn-jsx": "^5.2.0", - "ansi-html": "^0.0.7", - "babel-plugin-remove-export-keywords": "^1.6.5", - "better-queue": "^3.8.10", - "chokidar": "^3.4.2", - "concurrently": "^5.0.0", - "contentful-management": "^5.26.3", - "cors": "^2.8.5", - "cross-fetch": "^3.0.6", - "debug": "^4.1.1", - "detect-port": "^1.3.0", - "dotenv": "^8.2.0", - "execa": "^4.0.2", - "express": "^4.17.1", - "express-graphql": "^0.9.0", - "flatted": "^3.0.0", - "formik": "^2.0.8", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.23", - "gatsby-interface": "^0.0.193", - "gatsby-telemetry": "^1.3.38", - "glob": "^7.1.6", - "graphql": "^14.6.0", - "graphql-compose": "^6.3.8", - "graphql-subscriptions": "^1.1.0", - "graphql-type-json": "^0.3.2", - "hicat": "^0.7.0", - "html-tag-names": "^1.1.5", - "ink-box": "^1.0.0", - "is-binary-path": "^2.1.0", - "is-url": "^1.2.4", - "jest-diff": "^25.5.0", - "lock": "^1.0.0", - "lodash": "^4.17.20", - "mitt": "^1.2.0", - "mkdirp": "^0.5.1", - "node-fetch": "^2.5.0", - "normalize.css": "^8.0.1", - "pkg-dir": "^4.2.0", - "prettier": "^2.0.5", - "prop-types": "^15.6.1", - "property-information": "5.5.0", - "react-circular-progressbar": "^2.0.0", - "react-icons": "^3.0.1", - "react-reconciler": "^0.25.1", - "remark-mdx": "^2.0.0-next.4", - "remark-mdxjs": "^2.0.0-next.4", - "remark-parse": "^6.0.3", - "remark-stringify": "^8.1.0", - "resolve-cwd": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "single-trailing-newline": "^1.0.0", - "strip-ansi": "^6.0.0", - "style-to-object": "^0.3.0", - "subscriptions-transport-ws": "^0.9.16", - "svg-tag-names": "^2.0.1", - "unified": "^8.4.2", - "unist-util-remove": "^2.0.0", - "unist-util-visit": "^2.0.2", - "urql": "^1.9.7", - "uuid": "3.4.0", - "ws": "^7.3.0", - "xstate": "^4.9.1", - "yoga-layout-prebuilt": "^1.9.6", - "yup": "^0.27.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@mdx-js/mdx": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.0.0-next.8.tgz", - "integrity": "sha512-OT3bkvsA+rmqv378+UWFgeQuchaafhVgOO46+hc5U7KrGK3iPI2yGTcFwD3/KzSu+JGPCEUBREE96ncpvYqKjA==", - "dev": true, - "requires": { - "@babel/core": "7.10.5", - "@babel/plugin-syntax-jsx": "7.10.4", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "^2.0.0-next.8", - "babel-plugin-apply-mdx-type-prop": "^2.0.0-next.8", - "babel-plugin-extract-export-names": "^2.0.0-next.8", - "babel-plugin-extract-import-names": "^2.0.0-next.8", - "camelcase-css": "2.0.1", - "detab": "2.0.3", - "hast-to-hyperscript": "9.0.0", - "hast-util-raw": "6.0.0", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "9.1.0", - "remark-footnotes": "1.0.0", - "remark-mdx": "^2.0.0-next.8", - "remark-mdxjs": "^2.0.0-next.8", - "remark-parse": "8.0.2", - "remark-squeeze-paragraphs": "4.0.0", - "unified": "9.0.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", - "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "remark-mdxjs": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/remark-mdxjs/-/remark-mdxjs-2.0.0-next.8.tgz", - "integrity": "sha512-Z/+0eWc7pBEABwg3a5ptL+vCTWHYMFnYzpLoJxTm2muBSk8XyB/CL+tEJ6SV3Q/fScHX2dtG4JRcGSpbZFLazQ==", - "dev": true, - "requires": { - "@babel/core": "7.10.5", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.10.4", - "@babel/plugin-syntax-jsx": "7.10.4", - "@mdx-js/util": "^2.0.0-next.8" - } - }, - "remark-parse": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.2.tgz", - "integrity": "sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "unified": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", - "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", - "dev": true, - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - } - } - }, - "@mdx-js/react": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.0.0-next.8.tgz", - "integrity": "sha512-I/ped8Wb1L4sUlumQmUlYQsH0tjd2Zj2eyCWbqgigpg+rtRlNFO9swkeyr0GY9hNZnwI8QOnJtNe+UdIZim8LQ==", - "dev": true - }, - "@mdx-js/util": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.8.tgz", - "integrity": "sha512-T0BcXmNzEunFkuxrO8BFw44htvTPuAoKbLvTG41otyZBDV1Rs+JMddcUuaP5vXpTWtgD3grhcrPEwyx88RUumQ==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "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==", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-2.0.0-next.8.tgz", - "integrity": "sha512-Mcr9VAMxfS3ltNm3SXnSgP+7uqxx2zYS4xya2t8KvnLGejzSNsODSgjpNHUyfLihoDnfYaeCH7VFewZRKaRT8g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "^2.0.0-next.8" - } - }, - "babel-plugin-extract-export-names": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-export-names/-/babel-plugin-extract-export-names-2.0.0-next.8.tgz", - "integrity": "sha512-W0DbJHAIlxSlb110h7uVq0aHmxPS985YSiEloTM7irvt8YkOFhxn4WkSAoOfTAJY/+xecRgwhMd8YTAZfoLq5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - } - }, - "babel-plugin-extract-import-names": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-2.0.0-next.8.tgz", - "integrity": "sha512-jdk6h7FaArjwMKqlF0hdozMwum5JDzLse99D5wWVbZWe0P7w/ghXDpE0VbooqJ/jyYwei5a6tHeTTU59Ds4WXg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "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" - } - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "cross-fetch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", - "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", - "dev": true, - "requires": { - "node-fetch": "2.6.1" - } - }, - "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" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "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" - } - }, - "flatted": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", - "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "gatsby-interface": { - "version": "0.0.193", - "resolved": "https://registry.npmjs.org/gatsby-interface/-/gatsby-interface-0.0.193.tgz", - "integrity": "sha512-4rSk8MLTtJXivKy2Znd6OgMBzEN7FRuhPd3/MZ99Te6ZG/3v0hHQ+GdtDu2fyMuaeznMSBDTfeipi7BO6mR9Eg==", - "dev": true, - "requires": { - "@mdx-js/react": "^1.5.2", - "@reach/alert": "0.10.3", - "@reach/combobox": "0.10.3", - "@reach/dialog": "0.10.3", - "@reach/menu-button": "0.10.3", - "@reach/popover": "0.10.3", - "@reach/tabs": "0.10.3", - "@reach/tooltip": "0.10.3", - "@types/lodash.sample": "^4.2.6", - "case": "^1.6.2", - "date-fns": "^2.8.1", - "gatsby-design-tokens": "^2.0.2", - "lodash.sample": "^4.2.1", - "theme-ui": "^0.2.49" - }, - "dependencies": { - "@mdx-js/react": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.18.tgz", - "integrity": "sha512-aFHsZVu7r9WamlP+WO/lyvHHZAubkQjkcRYlvS7fQElypfJvjKdHevjC3xiqlsQpasx/4KqRMoEIb++wNtd+6w==", - "dev": true - } - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-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-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "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.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "requires": { - "repeat-string": "^1.0.0" - } - }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "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" - } - }, - "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" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "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" - } - }, - "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", - "dev": true - }, - "property-information": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", - "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", - "dev": true, - "requires": { - "xtend": "^4.0.0" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "remark-mdx": { - "version": "2.0.0-next.8", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.0.0-next.8.tgz", - "integrity": "sha512-mjP0yo6BgjYrx5a+gKWYRFWbGnRiWi4Fdf17xGCr9VkSMnG4Dyo06spqbaLfHwl0KkQ/RQZlR2sn1mKnYduJdw==", - "dev": true, - "requires": { - "parse-entities": "^2.0.0", - "remark-stringify": "^8.1.0", - "stringify-entities": "^3.0.1", - "strip-indent": "^3.0.0", - "unist-util-stringify-position": "^2.0.3" - } - }, - "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "dev": true, - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", - "dev": true - }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "dev": true, - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "dev": true, - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "dev": true, - "requires": { - "unist-util-is": "^3.0.0" - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", - "dev": true - } - } - }, - "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "stringify-entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", - "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", - "dev": true, - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.2", - "is-hexadecimal": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "gatsby-remark-autolink-headers": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-2.3.11.tgz", - "integrity": "sha512-jYGgZ+NTbVxJmyS6z1oojWxOR12R7MGl4jM5aOXSmPuTSo8gbpm3aW7l5XMyud5fDDdP3xfbYuTX4RvBUWrx7g==", - "requires": { - "@babel/runtime": "^7.10.3", - "github-slugger": "^1.3.0", - "lodash": "^4.17.15", - "mdast-util-to-string": "^1.1.0", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "gatsby-remark-check-links": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-check-links/-/gatsby-remark-check-links-2.1.0.tgz", - "integrity": "sha512-TbhT8oVlAgJfxe0WUQWDOb0kLkMUYo1N4AfFstejClPWO4OjRlznt3IMW3weQkwuweiovF5cxVpQcFrkCGVFBw==", - "requires": { - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "gatsby-remark-code-titles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-code-titles/-/gatsby-remark-code-titles-1.1.0.tgz", - "integrity": "sha512-RuNqziXi99eBIj5NJP0TgdzAxzWFL+ArGRb3961Ff9Tto/nCvmyqR1qySaWKXtkOgeqoVUlqAFNUCyEAyNuc8w==", - "requires": { - "query-string": "~6.0.0", - "unist-util-visit": "~1.3.0" - }, - "dependencies": { - "query-string": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.0.0.tgz", - "integrity": "sha1-i485RHtz6CkNb141gXeSGOkXEUI=", - "requires": { - "decode-uri-component": "^0.2.0", - "strict-uri-encode": "^2.0.0" - } - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" - }, - "unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" - }, - "unist-util-visit": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.1.tgz", - "integrity": "sha512-0fdB9EQJU0tho5tK0VzOJzAQpPv2LyLZ030b10GxuzAWEfvd54mpY7BMjQ1L69k2YNvL+SvxRzH0yUIehOO8aA==", - "requires": { - "unist-util-is": "^2.1.1" - } - } - } - }, - "gatsby-remark-copy-linked-files": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-2.3.13.tgz", - "integrity": "sha512-Qra6CpN6CChCsR5Eq2+FWF/7VyGjA7ozi/2jCO42AGrkGHfttyP07EhDq7ebk3VCtWT0tR7Zxerdq4dCnmyfFg==", - "requires": { - "@babel/runtime": "^7.10.3", - "cheerio": "^1.0.0-rc.3", - "fs-extra": "^8.1.0", - "is-relative-url": "^3.0.0", - "lodash": "^4.17.15", - "path-is-inside": "^1.0.2", - "probe-image-size": "^5.0.0", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "requires": { - "@types/node": "*" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "gatsby-remark-mermaid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gatsby-remark-mermaid/-/gatsby-remark-mermaid-1.2.0.tgz", - "integrity": "sha512-Er1Ck802dVP3/XYdRxZs3T6Kwi6fzwzDAKkxayzEhC+BrVWLmEKpANkEcdaKDhG3Cx54sWPrFpchitn/E0K5/Q==", - "requires": { - "mermaid": "^8.0.0", - "puppeteer": "^1.12.2", - "unist-util-visit": "^1.4.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "gatsby-remark-prismjs": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/gatsby-remark-prismjs/-/gatsby-remark-prismjs-3.5.11.tgz", - "integrity": "sha512-AMtHZb+i7GAlRM3UINAhx+SN1aVLsIUcbEbD8d3zdBxGQTeM1cJTIJz2UjUzdCqujW9tgewaw9mE+u4SFuQtKA==", - "requires": { - "@babel/runtime": "^7.10.3", - "parse-numeric-range": "^0.0.2", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "gatsby-remark-rewrite-relative-links": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-remark-rewrite-relative-links/-/gatsby-remark-rewrite-relative-links-1.0.8.tgz", - "integrity": "sha512-7jCyMM+AWdp8mFLUWuJ5RGPQIKFzpLqf253QR6Aq8xrhlV0Bcz2k1+03MxPnGP0R5XetIoRm2W864KrbIZdk9Q==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "gatsby-source-filesystem": { - "version": "2.3.27", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.3.27.tgz", - "integrity": "sha512-lNWRVDkaC2g6mSPTGuE9bsXawS0GkkwV/X8l8ZJnqbcMBl8p+h3zYoKXQ2u00pmQRqjwp4lvlaTarLRxD0tGDQ==", - "requires": { - "@babel/runtime": "^7.10.3", - "better-queue": "^3.8.10", - "bluebird": "^3.7.2", - "chokidar": "^3.4.2", - "file-type": "^12.4.2", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.18", - "got": "^9.6.0", - "md5-file": "^3.2.3", - "mime": "^2.4.6", - "pretty-bytes": "^5.3.0", - "progress": "^2.0.3", - "read-chunk": "^3.2.0", - "valid-url": "^1.0.9", - "xstate": "^4.11.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "gatsby-core-utils": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.18.tgz", - "integrity": "sha512-B7ixQb4H0e2yB0nNfM2zshOAUw3nW9MvcNsRskVFwIPJY+ngh8Srla4XWXVMJ60Fyt103+jPVZTxGq72/u5HuQ==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "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==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "gatsby-source-git": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gatsby-source-git/-/gatsby-source-git-1.1.0.tgz", - "integrity": "sha512-f5HllxwS+ivVn6SitSJPEQe8tf/apjwq5TOZRiEIRJtlrm9eSBqM2hO6ZIOK5na6UuvI+BH8xxbgj0qrwNTznA==", - "requires": { - "fast-glob": "^2.2.3", - "fs-extra": "^5.0.0", - "gatsby-source-filesystem": "^2.1.19", - "git-url-parse": "^11.1.1", - "rimraf": "^2.6.2", - "simple-git": "^1.105.0" - }, - "dependencies": { - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", - "requires": { - "debug": "^4.0.1" - } - } - } - }, - "gatsby-source-graphql": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.7.2.tgz", - "integrity": "sha512-PVSVMduO/QToW9v9lB+uEatrwnVN2eTwnQ9CxqJh9Wlupf26xJwHZR4IAktTXtKXen+pdJ5zkqyaEvY7O1HsIA==", - "requires": { - "@babel/runtime": "^7.10.3", - "@graphql-tools/links": "^6.0.9", - "@graphql-tools/utils": "^6.0.9", - "@graphql-tools/wrap": "^6.0.9", - "apollo-link": "1.2.14", - "apollo-link-http": "^1.5.17", - "dataloader": "^2.0.0", - "graphql": "^14.6.0", - "invariant": "^2.2.4", - "node-fetch": "^1.7.3", - "uuid": "^8.3.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "dataloader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", - "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" - }, - "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" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" - } - } - }, - "gatsby-telemetry": { - "version": "1.3.38", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.3.38.tgz", - "integrity": "sha512-8AoSNzVgrtPJ0Jgd+cPSuVGj2uBCXI2aJ2ANokOVjPbZO/Z+Z9hcOFdU+AkeBdZWCHaJaX0+qpE6KbgkwBoWPA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.11.2", - "@turist/fetch": "^7.1.7", - "@turist/time": "^0.0.1", - "async-retry-ng": "^2.0.1", - "boxen": "^4.2.0", - "configstore": "^5.0.1", - "envinfo": "^7.7.3", - "fs-extra": "^8.1.0", - "gatsby-core-utils": "^1.3.23", - "git-up": "^4.0.2", - "is-docker": "^2.1.1", - "lodash": "^4.17.20", - "node-fetch": "^2.6.1", - "uuid": "3.4.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "git-up": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", - "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true - } - } - }, - "gatsby-theme-apollo-core": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-core/-/gatsby-theme-apollo-core-3.0.18.tgz", - "integrity": "sha512-/Av0iOdqPe2zRuTooABB/j1LjnS7WtNddNaXHsWEVcg4a9U0+ZiLwmTfWnW29/1VFJjKtuBw7GvDuXqmyHQCtg==", - "requires": { - "@apollo/space-kit": "^5.6.0", - "@emotion/core": "^10.0.7", - "@emotion/styled": "^10.0.7", - "@svgr/webpack": "^4.2.0", - "gatsby-plugin-emotion": "^4.0.3", - "gatsby-plugin-less": "^3.0.1", - "gatsby-plugin-react-helmet": "^3.0.2", - "gatsby-plugin-svgr": "^2.0.1", - "less": "^3.10.1", - "lodash": "^4.17.14", - "polished": "^2.3.3", - "prop-types": "^15.6.2", - "react-helmet": "^5.2.0", - "react-use": "^9.11.0" - } - }, - "gatsby-theme-apollo-docs": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.3.7.tgz", - "integrity": "sha512-c1dhi4raNi9XS+5h42Q1kE3OUDjbWwCG2fsjsHHvawPYb6He2mfptB781NVYN3aRPY3aYgEwlKKI527qglRmJw==", - "requires": { - "@mdx-js/mdx": "^1.1.0", - "@mdx-js/react": "^1.0.27", - "gatsby-plugin-google-analytics": "^2.2.5", - "gatsby-plugin-mdx": "^1.0.23", - "gatsby-plugin-printer": "1.0.x", - "gatsby-remark-autolink-headers": "^2.3.11", - "gatsby-remark-check-links": "^2.1.0", - "gatsby-remark-code-titles": "^1.1.0", - "gatsby-remark-copy-linked-files": "^2.0.12", - "gatsby-remark-mermaid": "^1.2.0", - "gatsby-remark-prismjs": "^3.2.8", - "gatsby-remark-rewrite-relative-links": "^1.0.8", - "gatsby-source-filesystem": "^2.0.29", - "gatsby-source-git": "^1.0.1", - "gatsby-theme-apollo-core": "^3.0.18", - "gatsby-transformer-remark": "^2.6.30", - "js-yaml": "^3.13.1", - "prismjs": "^1.15.0", - "react-textfit": "^1.1.0", - "recompose": "^0.30.0", - "rehype-react": "^3.1.0", - "remark": "^10.0.1", - "remark-react": "^5.0.1", - "remark-typescript": "^0.3.0", - "simple-git": "^2.7.0", - "source-sans-pro": "^3.6.0", - "striptags": "^3.1.1" - } - }, - "gatsby-transformer-remark": { - "version": "2.8.32", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.8.32.tgz", - "integrity": "sha512-aWwSKeIG03l+DtIWulyB0TxuzN0+u1K2X2ispprTtrr/8BH1BBd6MnK5JjZfsOTnTMCKtUi2z11LrPk4TOkQGA==", - "requires": { - "@babel/runtime": "^7.10.3", - "bluebird": "^3.7.2", - "gatsby-core-utils": "^1.3.18", - "gray-matter": "^4.0.2", - "hast-util-raw": "^4.0.0", - "hast-util-to-html": "^4.0.1", - "lodash": "^4.17.15", - "mdast-util-to-hast": "^3.0.4", - "mdast-util-to-string": "^1.1.0", - "mdast-util-toc": "^5.0", - "remark": "^10.0.1", - "remark-parse": "^6.0.3", - "remark-retext": "^3.1.3", - "remark-stringify": "6.0.4", - "retext-english": "^3.0.4", - "sanitize-html": "^1.27.0", - "underscore.string": "^3.3.5", - "unified": "^6.2.0", - "unist-util-remove-position": "^1.1.4", - "unist-util-select": "^1.5.0", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "gatsby-core-utils": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.3.18.tgz", - "integrity": "sha512-B7ixQb4H0e2yB0nNfM2zshOAUw3nW9MvcNsRskVFwIPJY+ngh8Srla4XWXVMJ60Fyt103+jPVZTxGq72/u5HuQ==", - "requires": { - "ci-info": "2.0.0", - "configstore": "^5.0.1", - "fs-extra": "^8.1.0", - "node-object-hash": "^2.0.0", - "proper-lockfile": "^4.1.1", - "tmp": "^0.2.1", - "xdg-basedir": "^4.0.0" - } - }, - "hast-to-hyperscript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", - "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "property-information": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.2.1", - "unist-util-is": "^2.0.0", - "web-namespaces": "^1.1.2" - } - }, - "hast-util-from-parse5": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-4.0.2.tgz", - "integrity": "sha512-I6dtjsGtDqz4fmGSiFClFyiXdKhj5bPceS6intta7k/VDuiKz9P61C6hO6WMiNNmEm1b/EtBH8f+juvz4o0uwQ==", - "requires": { - "ccount": "^1.0.3", - "hastscript": "^4.0.0", - "property-information": "^4.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hast-util-raw": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-4.0.0.tgz", - "integrity": "sha512-5xYHyEJMCf8lX/NT4iA5z6N43yoFsrJqXJ5GWwAbLn815URbIz+UNNFEgid33F9paZuDlqVKvB+K3Aqu5+DdSw==", - "requires": { - "hast-util-from-parse5": "^4.0.2", - "hast-util-to-parse5": "^4.0.1", - "html-void-elements": "^1.0.1", - "parse5": "^5.0.0", - "unist-util-position": "^3.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.1", - "zwitch": "^1.0.0" - } - }, - "hast-util-to-parse5": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-4.0.1.tgz", - "integrity": "sha512-U/61W+fsNfBpCyJBB5Pt3l5ypIfgXqEyW9pyrtxF7XrqDJHzcFrYpnC94d0JDYjvobLpYCzcU9srhMRPEO1YXw==", - "requires": { - "hast-to-hyperscript": "^5.0.0", - "property-information": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.1", - "zwitch": "^1.0.0" - } - }, - "hastscript": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-4.1.0.tgz", - "integrity": "sha512-bOTn9hEfzewvHyXdbYGKqOr/LOz+2zYhKbC17U2YAjd16mnjqB1BQ0nooM/RdMy/htVyli0NAznXiBtwDi1cmQ==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.2.0", - "property-information": "^4.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "mdast-util-definitions": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", - "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", - "requires": { - "unist-util-visit": "^1.0.0" - } - }, - "mdast-util-to-hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-3.0.4.tgz", - "integrity": "sha512-/eIbly2YmyVgpJNo+bFLLMCI1XgolO/Ffowhf+pHDq3X4/V6FntC9sGQCDLM147eTS+uSXv5dRzJyFn+o0tazA==", - "requires": { - "collapse-white-space": "^1.0.0", - "detab": "^2.0.0", - "mdast-util-definitions": "^1.2.0", - "mdurl": "^1.0.1", - "trim": "0.0.1", - "trim-lines": "^1.0.0", - "unist-builder": "^1.0.1", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.0", - "xtend": "^4.0.1" - } - }, - "mdast-util-toc": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.0.3.tgz", - "integrity": "sha512-A3xzcgC1XFHK0+abFmbINOxjwo7Bi0Nsfp3yTgTy5JHo2q2V6YZ5BVJreDWoK3szcLlSMvHqe8WPbjY50wAkow==", - "requires": { - "@types/mdast": "^3.0.3", - "@types/unist": "^2.0.3", - "extend": "^3.0.2", - "github-slugger": "^1.2.1", - "mdast-util-to-string": "^1.0.5", - "unist-util-is": "^4.0.0", - "unist-util-visit": "^2.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", - "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - } - } - }, - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "property-information": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", - "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", - "requires": { - "xtend": "^4.0.1" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "style-to-object": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", - "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" - } - }, - "unist-builder": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz", - "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==", - "requires": { - "object-assign": "^4.1.0" - } - }, - "unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" - }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - } - } - }, - "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", - "requires": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - } - } - }, - "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==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-up": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", - "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.3.tgz", - "integrity": "sha512-GPsfwticcu52WQ+eHp0IYkAyaOASgYdtsQDIt4rUp6GbiNt1P9ddrh3O0kQB0eD4UJZszVqNT3+9Zwcg40fywA==", - "requires": { - "git-up": "^4.0.0" - } - }, - "github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", - "requires": { - "emoji-regex": ">=6.0.0 <=6.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" - } - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.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=", - "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=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", - "requires": { - "ini": "^1.3.5" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "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==" - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, - "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" - }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - } - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "requires": { - "lodash": "^4.17.15" - } - }, - "graphql": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", - "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", - "requires": { - "iterall": "^1.2.2" - } - }, - "graphql-compose": { - "version": "6.3.8", - "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-6.3.8.tgz", - "integrity": "sha512-o0/jzQEMIpSjryLKwmD1vGrCubiPxD0LxlGTgWDSu38TBepu2GhugC9gYgTEbtiCZAHPtvkZ90SzzABOWZyQLA==", - "requires": { - "graphql-type-json": "^0.2.4", - "object-path": "^0.11.4" - }, - "dependencies": { - "graphql-type-json": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.2.4.tgz", - "integrity": "sha512-/tq02ayMQjrG4oDFDRLLrPk0KvJXue0nVXoItBe7uAdbNXjQUu+HYCBdAmPLQoseVzUKKMzrhq2P/sfI76ON6w==" - } - } - }, - "graphql-config": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-2.2.2.tgz", - "integrity": "sha512-mtv1ejPyyR2mJUUZNhljggU+B/Xl8tJJWf+h145hB+1Y48acSghFalhNtXfPBcYl2tJzpb+lGxfj3O7OjaiMgw==", - "requires": { - "graphql-import": "^0.7.1", - "graphql-request": "^1.5.0", - "js-yaml": "^3.10.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.4" - } - }, - "graphql-import": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/graphql-import/-/graphql-import-0.7.1.tgz", - "integrity": "sha512-YpwpaPjRUVlw2SN3OPljpWbVRWAhMAyfSba5U47qGMOSsPLi2gYeJtngGpymjm9nk57RFWEpjqwh4+dpYuFAPw==", - "requires": { - "lodash": "^4.17.4", - "resolve-from": "^4.0.0" - } - }, - "graphql-playground-html": { - "version": "1.6.28", - "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.28.tgz", - "integrity": "sha512-22uwTEGjZg0h9rYcM7WspcMPVsixAE8m56tNzwjGr2Y3pNY7OctbsMkJ3EPtPcL6ZdUpzsa4rMgYR54BGmTrpQ==", - "requires": { - "xss": "^1.0.6" - } - }, - "graphql-playground-middleware-express": { - "version": "1.7.21", - "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.21.tgz", - "integrity": "sha512-CjPHDZqJ8ifS6v+JCyEZOEGrR8eKHWaUIUawggfUlW1xFFHCNcBhG4/S7EnSUspaUldSnL/cFcBp4yLhYkG53A==", - "requires": { - "graphql-playground-html": "^1.6.28" - } - }, - "graphql-request": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", - "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", - "requires": { - "cross-fetch": "2.2.2" - } - }, - "graphql-subscriptions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", - "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", - "requires": { - "iterall": "^1.2.1" - } - }, - "graphql-tag": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz", - "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==" - }, - "graphql-type-json": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", - "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==" - }, - "gray-matter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", - "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", - "requires": { - "js-yaml": "^3.11.0", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - } - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "requires": { - "duplexer": "^0.1.1" - } - }, - "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==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "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==", - "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=", - "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=" - } - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "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==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.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=", - "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=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", - "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - } - } - }, - "hast-to-hyperscript": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz", - "integrity": "sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg==", - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz", - "integrity": "sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q==", - "requires": { - "@types/parse5": "^5.0.0", - "ccount": "^1.0.0", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-is-element": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", - "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==" - }, - "hast-util-parse-selector": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz", - "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==" - }, - "hast-util-raw": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.0.tgz", - "integrity": "sha512-IQo6tv3bMMKxk53DljswliucCJOQxaZFCuKEJ7X80249dmJ1nA9LtOnnylsLlqTG98NjQ+iGcoLAYo9q5FRhRg==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-sanitize": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.3.1.tgz", - "integrity": "sha512-AIeKHuHx0Wk45nSkGVa2/ujQYTksnDl8gmmKo/mwQi7ag7IBZ8cM3nJ2G86SajbjGP/HRpud6kMkPtcM2i0Tlw==", - "requires": { - "xtend": "^4.0.1" - } - }, - "hast-util-to-html": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-4.0.1.tgz", - "integrity": "sha512-2emzwyf0xEsc4TBIPmDJmBttIw8R4SXAJiJZoiRR/s47ODYWgOqNoDbf2SJAbMbfNdFWMiCSOrI3OVnX6Qq2Mg==", - "requires": { - "ccount": "^1.0.0", - "comma-separated-tokens": "^1.0.1", - "hast-util-is-element": "^1.0.0", - "hast-util-whitespace": "^1.0.0", - "html-void-elements": "^1.0.0", - "property-information": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "stringify-entities": "^1.0.1", - "unist-util-is": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "property-information": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", - "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", - "requires": { - "xtend": "^4.0.1" - } - }, - "unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" - } - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hast-util-whitespace": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz", - "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==" - }, - "hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "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==" - }, - "hex2rgba": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/hex2rgba/-/hex2rgba-0.0.1.tgz", - "integrity": "sha1-hwG6HG7ALCBFBBWEB8HEtHqTNu0=" - }, - "hicat": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/hicat/-/hicat-0.7.0.tgz", - "integrity": "sha1-pwTLP1fkn719OMLt16ujj/CzUmM=", - "requires": { - "highlight.js": "^8.1.0", - "minimist": "^0.2.0" - }, - "dependencies": { - "minimist": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz", - "integrity": "sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==" - } - } - }, - "highlight-words-core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.2.tgz", - "integrity": "sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg==" - }, - "highlight.js": { - "version": "8.9.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-8.9.1.tgz", - "integrity": "sha1-uKnFSTISqTkvAiK2SclhFJfr+4g=" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "^2.0.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=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" - }, - "html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", - "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" - } - }, - "html-tag-names": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/html-tag-names/-/html-tag-names-1.1.5.tgz", - "integrity": "sha512-aI5tKwNTBzOZApHIynaAwecLBv8TlZTEy/P4Sj2SzzAhBrGuI8yGZ0UIXVPQzOHGS+to2mjb04iy6VWt/8+d8A==" - }, - "html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.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==" - }, - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-parser-js": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", - "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" - }, - "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==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - } - } - }, - "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==", - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "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=" - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, - "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-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "idb-wrapper": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==" - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "optional": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-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==", - "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=", - "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=" - } - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "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==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "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==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "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==" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "ink": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/ink/-/ink-2.7.1.tgz", - "integrity": "sha512-s7lJuQDJEdjqtaIWhp3KYHl6WV3J04U9zoQ6wVc+Xoa06XM27SXUY57qC5DO46xkF0CfgXMKkKNcgvSu/SAEpA==", - "requires": { - "ansi-escapes": "^4.2.1", - "arrify": "^2.0.1", - "auto-bind": "^4.0.0", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "is-ci": "^2.0.0", - "lodash.throttle": "^4.1.1", - "log-update": "^3.0.0", - "prop-types": "^15.6.2", - "react-reconciler": "^0.24.0", - "scheduler": "^0.18.0", - "signal-exit": "^3.0.2", - "slice-ansi": "^3.0.0", - "string-length": "^3.1.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0", - "yoga-layout-prebuilt": "^1.9.3" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "react-reconciler": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.24.0.tgz", - "integrity": "sha512-gAGnwWkf+NOTig9oOowqid9O0HjTDC+XVGBCAmJYYJ2A2cN/O4gDdIuuUQjv8A4v6GDwVfJkagpBBLW5OW9HSw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.18.0" - } - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "ink-box": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ink-box/-/ink-box-1.0.0.tgz", - "integrity": "sha512-wD2ldWX9lcE/6+flKbAJ0TZF7gKbTH8CRdhEor6DD8d+V0hPITrrGeST2reDBpCia8wiqHrdxrqTyafwtmVanA==", - "requires": { - "boxen": "^3.0.0", - "prop-types": "^15.7.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "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==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "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=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } - } - }, - "ink-spinner": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-3.1.0.tgz", - "integrity": "sha512-sPqmE4qeJ43vJFk9DGLd0wIqhMBAr3129ZqHPt7b847fVl+YTZ3g96khI82Db+FYE7v/Fc5B3lp4ZNtJfqpRUg==", - "requires": { - "cli-spinners": "^1.0.0", - "prop-types": "^15.5.10" - } - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "inline-style-prefixer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz", - "integrity": "sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==", - "requires": { - "bowser": "^1.7.3", - "css-in-js-utils": "^2.0.0" - } - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "instantsearch.css": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/instantsearch.css/-/instantsearch.css-7.4.4.tgz", - "integrity": "sha512-JmqgJD3HUxH5N2Cw5Utzz1G+W1Dsg1Fuf6UNfln7ptnRT3TguPRKBAIKuxnaGmdNdjAAsuWoohvgtgo66+MaoQ==" - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "internal-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", - "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", - "requires": { - "es-abstract": "^1.17.0-next.1", - "has": "^1.0.3", - "side-channel": "^1.0.2" - } - }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "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==" - }, - "is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=" - }, - "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==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.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==" - }, - "is-builtin-module": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.0.0.tgz", - "integrity": "sha512-/93sDihsAD652hrMEbJGbMAVBf1qc96kyThHQ0CAOONHaE3aROLpTjDe4WQ5aoC5ITHFxEq1z8XqSU7km+8amw==", - "requires": { - "builtin-modules": "^3.0.0" - } - }, - "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==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "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=", - "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=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-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==" - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha1-MHqFWzzxqTi0TqcNLGEQYFNxTzQ=", - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", - "requires": { - "lower-case": "^1.1.0" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "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==" - }, - "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==", - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" - }, - "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=" - }, - "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==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-relative-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-3.0.0.tgz", - "integrity": "sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA==", - "requires": { - "is-absolute-url": "^3.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" - }, - "is-ssh": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", - "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", - "requires": { - "protocols": "^1.1.0" - } - }, - "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==" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "^1.1.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==", - "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=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", - "requires": { - "upper-case": "^1.1.0" - } - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" - }, - "is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha1-EQ+f90w39mPh7HkV60UfLbk6yd8=", - "requires": { - "is-invalid-path": "^0.1.0" - } - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "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==" - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbuffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "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=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "iterall": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" - }, - "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "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==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "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==", - "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=" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "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==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "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==" - }, - "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=" - }, - "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=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "khroma": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.1.0.tgz", - "integrity": "sha512-aTO+YX22tYOLEQJYFiatAj1lc5QZ+H5sHWFRBWNCiKwc5NWNUJZyeSeiHEPeURJ2a1GEVYcmyMUwGjjLe5ec5A==" - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "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==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "language-subtag-registry": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz", - "integrity": "sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg==" - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "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==", - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", - "requires": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "native-request": "^1.0.5", - "source-map": "~0.6.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - } - } - }, - "less-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", - "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^4.0.1" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - } - } - }, - "level-blobs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", - "requires": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "level-filesystem": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", - "requires": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - }, - "dependencies": { - "xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=" - } - } - }, - "level-fix-range": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=" - }, - "level-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", - "requires": { - "string-range": "~1.2" - } - }, - "level-js": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", - "requires": { - "abstract-leveldown": "~0.12.0", - "idb-wrapper": "^1.5.0", - "isbuffer": "~0.0.0", - "ltgt": "^2.1.2", - "typedarray-to-buffer": "~1.0.0", - "xtend": "~2.1.2" - }, - "dependencies": { - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "typedarray-to-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "level-peek": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", - "requires": { - "level-fix-range": "~1.0.2" - } - }, - "level-sublevel": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", - "requires": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - }, - "dependencies": { - "is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=" - }, - "level-fix-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", - "requires": { - "clone": "~0.1.9" - } - }, - "object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", - "requires": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" - } - }, - "xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", - "requires": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" - } - } - } - }, - "levelup": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", - "requires": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "^3.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "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=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "loader-fs-cache": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", - "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", - "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=", - "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=", - "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=", - "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=", - "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==" - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.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==", - "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==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lock": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lock/-/lock-1.1.0.tgz", - "integrity": "sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=" - }, - "lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "requires": { - "signal-exit": "^3.0.2" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.every": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", - "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc=" - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, - "lodash.maxby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", - "integrity": "sha1-CCJABo88eiJ6oAqDgOTzjPB4bj0=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "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==" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, - "lodash.sample": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.sample/-/lodash.sample-4.2.1.tgz", - "integrity": "sha1-XkKRsMdT+hq+sKq4+ynfG2bwf20=" - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "log-update": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz", - "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==", - "requires": { - "ansi-escapes": "^3.2.0", - "cli-cursor": "^2.1.0", - "wrap-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "loglevel": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", - "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" - }, - "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" - }, - "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": "2.2.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", - "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.2" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", - "requires": { - "lower-case": "^1.1.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", - "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" - }, - "md5-file": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", - "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", - "requires": { - "buffer-alloc": "^1.1.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==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { - "unist-util-remove": "^2.0.0" - } - }, - "mdast-util-compact": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", - "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", - "requires": { - "unist-util-visit": "^1.1.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "mdast-util-definitions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz", - "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-hast": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.0.tgz", - "integrity": "sha512-Akl2Vi9y9cSdr19/Dfu58PVwifPXuFt1IrHe7l+Crme1KvgUT+5z+cHLVcQVGCiNTZZcdqjnuv9vPkGsqWytWA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.3", - "collapse-white-space": "^1.0.0", - "detab": "^2.0.0", - "mdast-util-definitions": "^3.0.0", - "mdurl": "^1.0.0", - "trim-lines": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-nlcst": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz", - "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==", - "requires": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.5.2", - "unist-util-position": "^3.0.0", - "vfile-location": "^2.0.0" - }, - "dependencies": { - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - } - } - }, - "mdast-util-to-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==" - }, - "mdast-util-toc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-3.1.0.tgz", - "integrity": "sha512-Za0hqL1PqWrvxGtA/3NH9D5nhGAUS9grMM4obEAz5+zsk1RIw/vWUchkaoDLNdrwk05A0CSC5eEXng36/1qE5w==", - "requires": { - "github-slugger": "^1.2.1", - "mdast-util-to-string": "^1.0.5", - "unist-util-is": "^2.1.2", - "unist-util-visit": "^1.1.0" - }, - "dependencies": { - "unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - } - } - } - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "meant": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.2.tgz", - "integrity": "sha512-KN+1uowN/NK+sT/Lzx7WSGIj2u+3xe5n2LbwObfjOhPZiA+cCfCm6idVl0RkEfjThkw5XJ96CyRcanq6GmKtUg==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "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=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" - }, - "mermaid": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.7.0.tgz", - "integrity": "sha512-SkinxAY3sIdML+o5U4U7rQEIa628OEywEw+pfhc3wSVDFqLk2XNdX2j3YmkyCw3Kcbp9BXar533ei+/saYBs5g==", - "requires": { - "@braintree/sanitize-url": "^3.1.0", - "babel-eslint": "^10.1.0", - "d3": "^5.7.0", - "dagre": "^0.8.4", - "dagre-d3": "^0.6.4", - "entity-decode": "^2.0.2", - "graphlib": "^2.1.7", - "he": "^1.2.0", - "khroma": "^1.1.0", - "minify": "^4.1.1", - "moment-mini": "^2.22.1", - "stylis": "^3.5.2" - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.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==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" - }, - "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==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "mini-css-extract-plugin": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", - "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "minify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/minify/-/minify-4.1.3.tgz", - "integrity": "sha512-ykuscavxivSmVpcCzsXmsVTukWYLUUtPhHj0w2ILvHDGqC+hsuTCihBn9+PJBd58JNvWTNg9132J9nrrI2anzA==", - "requires": { - "clean-css": "^4.1.6", - "css-b64-images": "~0.2.5", - "debug": "^4.1.0", - "html-minifier": "^4.0.0", - "terser": "^4.0.0", - "try-catch": "^2.0.0", - "try-to-catch": "^1.0.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "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==" - }, - "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=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "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" - } - }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "moment": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz", - "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw==" - }, - "moment-mini": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", - "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "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=" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "name-all-modules-plugin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/name-all-modules-plugin/-/name-all-modules-plugin-1.0.1.tgz", - "integrity": "sha1-Cr+2rYNXGLn7Te8GdOBmV6lUN1w=" - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "optional": true - }, - "nano-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.0.tgz", - "integrity": "sha512-uM/9NGK9/E9/sTpbIZ/bQ9xOLOIHZwrrb/CRlbDHBU/GFS7Gshl24v/WJhwsVViWkpOXUmiZ66XO7fSB4Wd92Q==", - "requires": { - "css-tree": "^1.0.0-alpha.28", - "csstype": "^2.5.5", - "fastest-stable-stringify": "^1.0.1", - "inline-style-prefixer": "^4.0.0", - "rtl-css-js": "^1.9.0", - "sourcemap-codec": "^1.4.1", - "stacktrace-js": "^2.0.0", - "stylis": "3.5.0" - }, - "dependencies": { - "stylis": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz", - "integrity": "sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw==" - } - } - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "native-request": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", - "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", - "optional": true - }, - "native-url": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", - "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", - "requires": { - "querystring": "^0.2.0" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "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==" - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "nlcst-to-string": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz", - "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg==" - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "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==", - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-eta": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-eta/-/node-eta-0.9.0.tgz", - "integrity": "sha1-n7CwmbzSoCGUDmA8ZCVNwAPZp6g=" - }, - "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.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "^1.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": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "node-object-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-2.0.0.tgz", - "integrity": "sha512-VZR0zroAusy1ETZMZiGeLkdu50LGjG5U1KHZqTruqtTyQ2wfWhHG2Ow4nsUbfTFGlaREgNHcCWoM/OzEm6p+NQ==" - }, - "node-releases": { - "version": "1.1.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", - "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", - "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==" - } - } - }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "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==" - }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" - }, - "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=", - "requires": { - "path-key": "^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==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "null-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-3.0.0.tgz", - "integrity": "sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw==", - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "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=", - "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=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" - }, - "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==" - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.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==", - "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.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "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==", - "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=", - "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==", - "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==" - }, - "octal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "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==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - } - } - }, - "opentracing": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.4.tgz", - "integrity": "sha512-nNnZDkUNExBwEpb7LZaeMeQgvrlO8l4bgY/LvGNZCR0xG/dGWqHqjKrAmR5GUoYo0FIz38kxasvA1aevxWs2CA==" - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - } - } - }, - "optimism": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.12.1.tgz", - "integrity": "sha512-t8I7HM1dw0SECitBYAqFOVHoBAHEQBTeKjIL9y9ImHzAVkdyPK4ifTgM4VJRDtTUY4r/u5Eqxs4XcGPHaoPkeQ==", - "requires": { - "@wry/context": "^0.5.2" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", - "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==", - "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==", - "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=" - }, - "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=" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.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==", - "requires": { - "p-limit": "^2.0.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==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-queue": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-5.0.0.tgz", - "integrity": "sha512-6QfeouDf236N+MAxHch0CVIy8o/KBnmhttKjxZoOkUlzqU+u9rZgEyXH3OdckhTgawbqf5rpzmyR+07+Lv0+zg==", - "requires": { - "eventemitter3": "^3.1.0" - } - }, - "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==", - "requires": { - "retry": "^0.12.0" - } - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.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=", - "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==", - "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==", - "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-english": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/parse-english/-/parse-english-4.1.3.tgz", - "integrity": "sha512-IQl1v/ik9gw437T8083coohMihae0rozpc7JYC/9h6hi9xKBSxFwh5HWRpzVC2ZhEs2nUlze2aAktpNBJXdJKA==", - "requires": { - "nlcst-to-string": "^2.0.0", - "parse-latin": "^4.0.0", - "unist-util-modify-children": "^1.0.0", - "unist-util-visit-children": "^1.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "parse-latin": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.2.1.tgz", - "integrity": "sha512-7T9g6mIsFFpLlo0Zzb2jLWdCt+H9Qtf/hRmMYFi/Mq6Ovi+YKo+AyDFX3OhFfu0vXX5Nid9FKJGKSSzNcTkWiA==", - "requires": { - "nlcst-to-string": "^2.0.0", - "unist-util-modify-children": "^1.0.0", - "unist-util-visit-children": "^1.0.0" - } - }, - "parse-numeric-range": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", - "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=" - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "parse-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", - "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse-srcset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", - "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=" - }, - "parse-url": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", - "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", - "requires": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "requires": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - } - }, - "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==" - }, - "path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", - "requires": { - "no-case": "^2.2.0" - } - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "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=" - }, - "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=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "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=" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "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" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "physical-cpu-count": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", - "integrity": "sha1-GN4vl+S/epVRrXURlCtUlverpmA=" - }, - "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "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==", - "requires": { - "find-up": "^3.0.0" - } - }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "requires": { - "ts-pnp": "^1.1.6" - } - }, - "polished": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/polished/-/polished-2.3.3.tgz", - "integrity": "sha512-59V4fDbdxtH4I1m9TWxFsoGJbC8nnOpUYo5uFmvMfKp9Qh+6suo4VMUle1TGIIUZIGxfkW+Rs485zPk0wcwR2Q==", - "requires": { - "@babel/runtime": "^7.2.0" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - } - } - }, - "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=" - }, - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "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==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==", - "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==", - "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==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-flexbugs-fixes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", - "requires": { - "postcss": "^7.0.26" - } - }, - "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==", - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "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=" - } - } - }, - "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==", - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.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==", - "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==" - } - } - }, - "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==", - "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==", - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "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==", - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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=" - }, - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==" - } - } - }, - "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==", - "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==", - "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==" - } - } - }, - "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==", - "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==", - "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==" - } - } - }, - "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==", - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" - }, - "pretty-bytes": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", - "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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" - } - }, - "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==" - } - } - }, - "prismjs": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", - "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", - "requires": { - "clipboard": "^2.0.0" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "probe-image-size": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-5.0.0.tgz", - "integrity": "sha512-V6uBYw5eBc5UVIE7MUZD6Nxg0RYuGDWLDenEn0B1WC6PcTvn1xdQ6HLDDuznefsiExC6rNrCz7mFRBo0f3Xekg==", - "requires": { - "deepmerge": "^4.0.0", - "inherits": "^2.0.3", - "next-tick": "^1.0.0", - "request": "^2.83.0", - "stream-parser": "~0.3.1" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-es6": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", - "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=" - }, - "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==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "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=" - }, - "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" - } - }, - "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" - } - }, - "proper-lockfile": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.1.tgz", - "integrity": "sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg==", - "requires": { - "graceful-fs": "^4.1.11", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "property-expr": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", - "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==" - }, - "property-information": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.4.0.tgz", - "integrity": "sha512-nmMWAm/3vKFGmmOWOcdLjgq/Hlxa+hsuR/px1Lp/UGEyc5A22A6l78Shc2C0E71sPmAqglni+HrS7L7VJ7AUCA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "protocols": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", - "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==" - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "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==" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "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==", - "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==", - "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==", - "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==" - }, - "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", - "requires": { - "escape-goat": "^2.0.0" - } - }, - "puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "requires": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "query-string": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.2.tgz", - "integrity": "sha512-BMmDaUiLDFU1hlM38jTFcRt7HYiGP/zt1sRzrIWm5zpeEuO1rkbPS0ELI3uehoLuuhHDCS8u8lhFN3fEN4JzPQ==", - "requires": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "dependencies": { - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" - } - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "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==" - }, - "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==", - "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==" - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, - "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-circular-progressbar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/react-circular-progressbar/-/react-circular-progressbar-2.0.3.tgz", - "integrity": "sha512-YKN+xAShXA3gYihevbQZbavfiJxo83Dt1cUxqg/cltj4VVsRQpDr7Fg1mvjDG3x1KHGtd9NmYKvJ2mMrPwbKyw==" - }, - "react-clientside-effect": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz", - "integrity": "sha512-nRmoyxeok5PBO6ytPvSjKp9xwXg9xagoTK1mMjwnQxqM9Hd7MNPl+LS1bOSOe+CV2+4fnEquc7H/S8QD3q697A==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, - "react-dev-utils": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-4.2.3.tgz", - "integrity": "sha512-uvmkwl5uMexCmC0GUv1XGQP0YjfYePJufGg4YYiukhqk2vN1tQxwWJIBERqhOmSi80cppZg8mZnPP/kOMf1sUQ==", - "requires": { - "address": "1.0.3", - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "cross-spawn": "5.1.0", - "detect-port-alt": "1.1.3", - "escape-string-regexp": "1.0.5", - "filesize": "3.5.11", - "global-modules": "1.0.0", - "gzip-size": "3.0.0", - "inquirer": "3.3.0", - "is-root": "1.0.0", - "opn": "5.1.0", - "react-error-overlay": "^3.0.0", - "recursive-readdir": "2.2.1", - "shell-quote": "1.6.1", - "sockjs-client": "1.1.4", - "strip-ansi": "3.0.1", - "text-table": "0.2.0" - }, - "dependencies": { - "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "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==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "dependencies": { - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "react-error-overlay": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-3.0.0.tgz", - "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw==" - }, - "react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" - }, - "react-focus-lock": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.4.1.tgz", - "integrity": "sha512-c5ZP56KSpj9EAxzScTqQO7bQQNPltf/W1ZEBDqNDOV1XOIwvAyHX0O7db9ekiAtxyKgnqZjQlLppVg94fUeL9w==", - "requires": { - "@babel/runtime": "^7.0.0", - "focus-lock": "^0.7.0", - "prop-types": "^15.6.2", - "react-clientside-effect": "^1.2.2", - "use-callback-ref": "^1.2.1", - "use-sidecar": "^1.0.1" - } - }, - "react-helmet": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.1.tgz", - "integrity": "sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA==", - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.5.4", - "react-fast-compare": "^2.0.2", - "react-side-effect": "^1.1.0" - } - }, - "react-hot-loader": { - "version": "4.12.21", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.21.tgz", - "integrity": "sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA==", - "requires": { - "fast-levenshtein": "^2.0.6", - "global": "^4.3.0", - "hoist-non-react-statics": "^3.3.0", - "loader-utils": "^1.1.0", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "react-icons": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.11.0.tgz", - "integrity": "sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q==", - "requires": { - "camelcase": "^5.0.0" - } - }, - "react-instantsearch-core": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.7.0.tgz", - "integrity": "sha512-wIvSIwkWfqPbaQZcbKsfBK3Gpm1e7ahSwU8Bmx1N5RfUqA/NghqS0Ppv3sz4vCXjoEAdPV06R+Fpn9lT+cE9/Q==", - "requires": { - "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.1.0", - "prop-types": "^15.5.10", - "react-fast-compare": "^3.0.0" - }, - "dependencies": { - "react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - } - } - }, - "react-instantsearch-dom": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.7.0.tgz", - "integrity": "sha512-J1C9xkHHLLa6rkKLKFDa7szA0TDo6yPFGmDzh2+JLaq4o694RIqivfUpROHus0Ki3BAQu9QmzLtodf6K1NOBWQ==", - "requires": { - "@babel/runtime": "^7.1.2", - "algoliasearch-helper": "^3.1.0", - "classnames": "^2.2.5", - "prop-types": "^15.5.10", - "react-instantsearch-core": "^6.7.0" - } - }, - "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==" - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-reconciler": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.25.1.tgz", - "integrity": "sha512-R5UwsIvRcSs3w8n9k3tBoTtUHdVhu9u84EG7E5M0Jk9F5i6DA1pQzPfUZd6opYWGy56MJOtV3VADzy6DRwYDjw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "dependencies": { - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - } - } - }, - "react-refresh": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.7.2.tgz", - "integrity": "sha512-u5l7fhAJXecWUJzVxzMRU2Zvw8m4QmDNHlTrT5uo3KBlYBhmChd7syAakBoay1yIiVhx/8Fi7a6v6kQZfsw81Q==" - }, - "react-remove-scroll": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.0.tgz", - "integrity": "sha512-BZIO3GaEs0Or1OhA5C//n1ibUP1HdjJmqUVUsOCMxwoIpaCocbB9TFKwHOkBa/nyYy3slirqXeiPYGwdSDiseA==", - "requires": { - "react-remove-scroll-bar": "^2.1.0", - "react-style-singleton": "^2.1.0", - "tslib": "^1.0.0", - "use-callback-ref": "^1.2.3", - "use-sidecar": "^1.0.1" - } - }, - "react-remove-scroll-bar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.1.0.tgz", - "integrity": "sha512-5X5Y5YIPjIPrAoMJxf6Pfa7RLNGCgwZ95TdnVPgPuMftRfO8DaC7F4KP1b5eiO8hHbe7u+wZNDbYN5WUTpv7+g==", - "requires": { - "react-style-singleton": "^2.1.0", - "tslib": "^1.0.0" - } - }, - "react-side-effect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.2.0.tgz", - "integrity": "sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w==", - "requires": { - "shallowequal": "^1.0.1" - } - }, - "react-style-singleton": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.0.tgz", - "integrity": "sha512-DH4ED+YABC1dhvSDYGGreAHmfuTXj6+ezT3CmHoqIEfxNgEYfIMoOtmbRp42JsUst3IPqBTDL+8r4TF7EWhIHw==", - "requires": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^1.0.0" - } - }, - "react-textfit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-textfit/-/react-textfit-1.1.0.tgz", - "integrity": "sha512-iznFbj7fCizuo3Xof9iv57I8GZFiYp8vUFj+4qihHJZpzNwxWad7JZu7ALTAnwaiq/H0p60g8G4ifeEJYmfJuw==", - "requires": { - "process": "^0.11.9", - "prop-types": "^15.5.10" - } - }, - "react-use": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/react-use/-/react-use-9.12.0.tgz", - "integrity": "sha512-aqY+w2nzwZnyJEizW4mhWMUUC0HtCLuxZIN7UW5oTTbNzlinOn3cgQCApGqjtjP7g9TXMroHU9WA0rYwShAVJA==", - "requires": { - "copy-to-clipboard": "^3.1.0", - "nano-css": "^5.1.0", - "react-fast-compare": "^2.0.4", - "react-wait": "^0.3.0", - "screenfull": "^4.1.0", - "throttle-debounce": "^2.0.1", - "ts-easing": "^0.2.0" - } - }, - "react-wait": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/react-wait/-/react-wait-0.3.0.tgz", - "integrity": "sha512-kB5x/kMKWcn0uVr9gBdNz21/oGbQwEQnF3P9p6E9yLfJ9DRcKS0fagbgYMFI0YFOoyKDj+2q6Rwax0kTYJF37g==" - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-chunk": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", - "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", - "requires": { - "pify": "^4.0.1", - "with-open-file": "^0.1.6" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "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=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "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=", - "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=", - "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=", - "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==", - "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=", - "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=" - } - } - }, - "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==", - "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==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "recompose": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", - "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", - "requires": { - "@babel/runtime": "^7.0.0", - "change-emitter": "^0.1.2", - "fbjs": "^0.8.1", - "hoist-non-react-statics": "^2.3.1", - "react-lifecycles-compat": "^3.0.2", - "symbol-observable": "^1.0.4" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - } - } - }, - "recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", - "requires": { - "minimatch": "3.0.3" - }, - "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "requires": { - "brace-expansion": "^1.0.0" - } - } - } - }, - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "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==", - "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==" - }, - "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", - "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "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==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" - }, - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", - "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" - } - }, - "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, - "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" - }, - "regjsparser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", - "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", - "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=" - } - } - }, - "rehype-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-3.1.0.tgz", - "integrity": "sha512-7SiLiqNudSGkvhrePkdKqdUvngZqzG+PJhdR5EeIFELz2j2ek4aO5DHbxUXYvaZfqUiBDO2Aeq1OROUmxmu+Vg==", - "requires": { - "@mapbox/hast-util-table-cell-style": "^0.1.3", - "has": "^1.0.1", - "hast-to-hyperscript": "^5.0.0" - }, - "dependencies": { - "hast-to-hyperscript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", - "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "property-information": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.2.1", - "unist-util-is": "^2.0.0", - "web-namespaces": "^1.1.2" - } - }, - "property-information": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", - "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", - "requires": { - "xtend": "^4.0.1" - } - }, - "style-to-object": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", - "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remark": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", - "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", - "requires": { - "remark-parse": "^6.0.0", - "remark-stringify": "^6.0.0", - "unified": "^7.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "remark-parse": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", - "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - } - }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - }, - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - } - } - }, - "remark-footnotes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-1.0.0.tgz", - "integrity": "sha512-X9Ncj4cj3/CIvLI2Z9IobHtVi8FVdUrdJkCNaL9kdX8ohfsi18DXHsCVd/A7ssARBdccdDb5ODnt62WuEWaM/g==" - }, - "remark-mdx": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.16.tgz", - "integrity": "sha512-xqZhBQ4TonFiSFpVt6SnTLRnxstu7M6pcaOibKZhqzk4zMRVacVenD7iECjfESK+72LkPm/NW+0r5ahJAg7zlQ==", - "requires": { - "@babel/core": "7.10.5", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.10.4", - "@babel/plugin-syntax-jsx": "7.10.4", - "@mdx-js/util": "1.6.16", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.1.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "unified": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.1.0.tgz", - "integrity": "sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "remark-mdxjs": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/remark-mdxjs/-/remark-mdxjs-2.0.0-next.7.tgz", - "integrity": "sha512-ixa9jEQ1mB65NYJaBq+Hv91DIqQ7B3wk+L9Agwa31NkIzvt6zcgx6TKwavr0zZG69I2n1gZzekhp51AeVCzU1Q==", - "requires": { - "@babel/core": "7.10.5", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.10.4", - "@babel/plugin-syntax-jsx": "7.10.4", - "@mdx-js/util": "^2.0.0-next.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@mdx-js/util": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-2.0.0-next.7.tgz", - "integrity": "sha512-gsid2rh63B7/U1gPLXz9N5bfWR+n5GYxAcVCJDf8H+XfCC7NHsEX9ZHL9IdmXndOPT4ZTSW6V/jD8VeQdvnzLQ==" - } - } - }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-react": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/remark-react/-/remark-react-5.0.1.tgz", - "integrity": "sha512-yHv5WIh47srKfdm794UMIHjNLr6EY2YCzsqvdJ/qvN1Tq1jgyg3q8Zo9pJc4L7BwZOMTia6O2JgrJeOsJfowzA==", - "requires": { - "@mapbox/hast-util-table-cell-style": "^0.1.3", - "hast-to-hyperscript": "^6.0.0", - "hast-util-sanitize": "^1.0.0", - "mdast-util-to-hast": "^4.0.0" - }, - "dependencies": { - "hast-to-hyperscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-6.0.0.tgz", - "integrity": "sha512-QnJbXddVGNJ5v3KegK1MY6luTkNDBcJnCQZcekt7AkES2z4tYy85pbFUXx7Mb0iXZBKfwoVdgfxU12GbmlwbbQ==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.2.1", - "unist-util-is": "^2.0.0", - "web-namespaces": "^1.1.2" - } - }, - "mdast-util-definitions": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", - "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", - "requires": { - "unist-util-visit": "^1.0.0" - } - }, - "mdast-util-to-hast": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-4.0.0.tgz", - "integrity": "sha512-yOTZSxR1aPvWRUxVeLaLZ1sCYrK87x2Wusp1bDM/Ao2jETBhYUKITI3nHvgy+HkZW54HuCAhHnS0mTcbECD5Ig==", - "requires": { - "collapse-white-space": "^1.0.0", - "detab": "^2.0.0", - "mdast-util-definitions": "^1.2.0", - "mdurl": "^1.0.1", - "trim": "0.0.1", - "trim-lines": "^1.0.0", - "unist-builder": "^1.0.1", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.0", - "xtend": "^4.0.1" - } - }, - "style-to-object": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", - "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "unist-builder": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz", - "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==", - "requires": { - "object-assign": "^4.1.0" - } - }, - "unist-util-is": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz", - "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - } - } - } - } - }, - "remark-retext": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz", - "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==", - "requires": { - "mdast-util-to-nlcst": "^3.2.0" - } - }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" - } - }, - "remark-stringify": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", - "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^1.1.0", - "mdast-util-compact": "^1.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^1.0.1", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - }, - "dependencies": { - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - } - } - }, - "remark-typescript": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/remark-typescript/-/remark-typescript-0.3.1.tgz", - "integrity": "sha512-UH3VrAD6HB3JBrPrdKDHmhSb2frDT0OfDTE4P8MI807KWNHkhuA+dKjld9+mYbq+PViy86nUZstpGkHWp5Y6gA==", - "requires": { - "@babel/core": "^7.5.5", - "@babel/preset-typescript": "^7.3.3", - "prettier": "^1.18.2", - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "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=" - }, - "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==", - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.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==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "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==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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==" - }, - "require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" - }, - "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==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^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==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "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==" - }, - "retext-english": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/retext-english/-/retext-english-3.0.4.tgz", - "integrity": "sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw==", - "requires": { - "parse-english": "^4.0.0", - "unherit": "^1.0.4" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "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==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.23.1.tgz", - "integrity": "sha512-95C1GZQpr/NIA0kMUQmSjuMDQ45oZfPgDBcN0yZwBG7Kee//m7H68vgIyg+SPuyrTZ5PrXfyLK80OzXeKG5dAA==", - "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - } - }, - "rollup-plugin-babel": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-node-builtins": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", - "integrity": "sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k=", - "requires": { - "browserify-fs": "^1.0.0", - "buffer-es6": "^4.9.2", - "crypto-browserify": "^3.11.0", - "process-es6": "^0.11.2" - } - }, - "rollup-plugin-node-globals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.4.0.tgz", - "integrity": "sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g==", - "requires": { - "acorn": "^5.7.3", - "buffer-es6": "^4.9.3", - "estree-walker": "^0.5.2", - "magic-string": "^0.22.5", - "process-es6": "^0.11.6", - "rollup-pluginutils": "^2.3.1" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - }, - "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==" - }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "requires": { - "vlq": "^0.2.2" - } - } - } - }, - "rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", - "requires": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-replace": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", - "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==", - "requires": { - "magic-string": "^0.25.2", - "rollup-pluginutils": "^2.6.0" - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "requires": { - "estree-walker": "^0.6.1" - } - }, - "rtl-css-js": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.14.0.tgz", - "integrity": "sha512-Dl5xDTeN3e7scU1cWX8c9b6/Nqz3u/HgR4gePc1kWXYiQWVQbKCEyK6+Hxve9LbcJ5EieHy1J9nJCN3grTtGwg==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "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=" - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "*" - } - }, - "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "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==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "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==" - }, - "sanitize-html": { - "version": "1.27.4", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.4.tgz", - "integrity": "sha512-VvY1hxVvMXzSos/LzqeBl9/KYu3mkEOtl5NMwz6jER318dSHDCig0AOjZOtnoCwAC3HMs9LhfWkPCmQGttb4ng==", - "requires": { - "htmlparser2": "^4.1.0", - "lodash": "^4.17.15", - "parse-srcset": "^1.0.2", - "postcss": "^7.0.27" - }, - "dependencies": { - "dom-serializer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz", - "integrity": "sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" - }, - "domhandler": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz", - "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==", - "requires": { - "domelementtype": "^2.0.1" - } - }, - "domutils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz", - "integrity": "sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0" - } - }, - "htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", - "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "entities": "^2.0.0" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "screenfull": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-4.2.1.tgz", - "integrity": "sha512-PLSp6f5XdhvjCCCO8OjavRfzkSGL3Qmdm7P82bxyU8HDDDBhDV3UckRaYcRa/NDNTYt8YBpzjoLWHUAejmOjLg==" - }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "optional": true - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "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==", - "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=" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "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==" - } - } - }, - "sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", - "requires": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.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==", - "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=", - "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=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - } - } - }, - "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==", - "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==", - "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=", - "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==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, - "shallow-compare": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz", - "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg==" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "side-channel": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", - "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", - "requires": { - "es-abstract": "^1.18.0-next.0", - "object-inspect": "^1.8.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" - } - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-git": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.20.1.tgz", - "integrity": "sha512-aa9s2ZLjXlHCVGbDXQLInMLvLkxKEclqMU9X5HMXi3tLWLxbWObz1UgtyZha6ocHarQtFp0OjQW9KHVR1g6wbA==", - "requires": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "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==" - } - } - }, - "single-trailing-newline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/single-trailing-newline/-/single-trailing-newline-1.0.0.tgz", - "integrity": "sha1-gfCtKtZFGBlFyAlSpcFBSZLulmQ=", - "requires": { - "detect-newline": "^1.0.3" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "slugify": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.5.tgz", - "integrity": "sha512-WpECLAgYaxHoEAJ8Q1Lo8HOs1ngn7LN7QjXgOLbmmfkcWvosyk4ZTXkTzKyhngK640USTZUlgoQJfED1kz5fnQ==" - }, - "snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", - "requires": { - "no-case": "^2.2.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "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==", - "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=", - "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=", - "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=" - } - } - }, - "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==", - "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=", - "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==", - "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==", - "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==", - "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==", - "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=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socket.io": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", - "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.4.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.3.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" - }, - "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - }, - "dependencies": { - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "requires": { - "websocket-extensions": ">=0.1.1" - } - } - } - }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", - "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "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==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "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==", - "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==", - "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==" - } - } - }, - "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=" - }, - "source-sans-pro": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/source-sans-pro/-/source-sans-pro-3.6.0.tgz", - "integrity": "sha512-C1RFUGu+YASuqpgDRInTM7Y6OwqeWNOuKn7v0P/4Kh66epTI4PYWwPWP5kdA4l/VqzBAWiqoz5dk0trof73R7w==" - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.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.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "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==", - "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.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" - }, - "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==", - "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=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "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==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "st": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/st/-/st-2.0.0.tgz", - "integrity": "sha512-drN+aGYnrZPNYIymmNwIY7LXYJ8MqsqXj4fMRue3FOgGMdGjSX10fhJ3qx0sVQPhcWxhEaN4U/eWM4O4dbYNAw==", - "requires": { - "async-cache": "^1.1.0", - "bl": "^4.0.0", - "fd": "~0.0.2", - "graceful-fs": "^4.2.3", - "mime": "^2.4.4", - "negotiator": "~0.6.2" - }, - "dependencies": { - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-generator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", - "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", - "requires": { - "stackframe": "^1.1.1" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "stackframe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.1.tgz", - "integrity": "sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ==" - }, - "stacktrace-gps": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz", - "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==", - "requires": { - "source-map": "0.5.6", - "stackframe": "^1.1.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - } - } - }, - "stacktrace-js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", - "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", - "requires": { - "error-stack-parser": "^2.0.6", - "stack-generator": "^2.0.5", - "stacktrace-gps": "^3.0.4" - } - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "static-site-generator-webpack-plugin": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-3.4.2.tgz", - "integrity": "sha512-39Kn+fZDVjolLYuX5y1rDvksJIW0QEUaEC/AVO/UewNXxGzoSQI1UYnRsL+ocAcN5Yti6d6rJgEL0qZ5tNXfdw==", - "requires": { - "bluebird": "^3.0.5", - "cheerio": "^0.22.0", - "eval": "^0.1.0", - "url": "^0.11.0", - "webpack-sources": "^0.2.0" - }, - "dependencies": { - "source-list-map": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", - "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=" - }, - "webpack-sources": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", - "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", - "requires": { - "source-list-map": "^1.1.1", - "source-map": "~0.5.3" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "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==", - "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==", - "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==", - "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-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", - "requires": { - "debug": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "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=" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "string-range": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=" - }, - "string-similarity": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz", - "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==", - "requires": { - "lodash.every": "^4.6.0", - "lodash.flattendeep": "^4.4.0", - "lodash.foreach": "^4.5.0", - "lodash.map": "^4.6.0", - "lodash.maxby": "^4.6.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.matchall": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", - "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "has-symbols": "^1.0.1", - "internal-slot": "^1.0.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "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==", - "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==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.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==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-hexadecimal": "^1.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=", - "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=" - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "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==" - }, - "striptags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", - "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=" - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "requires": { - "inline-style-parser": "0.1.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==", - "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==", - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" - }, - "subscriptions-transport-ws": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz", - "integrity": "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==", - "requires": { - "backo2": "^1.0.2", - "eventemitter3": "^3.1.0", - "iterall": "^1.2.1", - "symbol-observable": "^1.0.4", - "ws": "^5.2.0" - }, - "dependencies": { - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "sudo-prompt": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", - "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svg-tag-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/svg-tag-names/-/svg-tag-names-2.0.1.tgz", - "integrity": "sha512-BEZ508oR+X/b5sh7bT0RqDJ7GhTpezjj3P1D4kugrOaPs6HijviWksoQ63PS81vZn0QCjZmVKjHDBniTo+Domg==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "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==", - "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==" - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", - "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "synchronous-promise": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.13.tgz", - "integrity": "sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==" - }, - "tabbable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-4.0.0.tgz", - "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "theme-ui": { - "version": "0.2.52", - "resolved": "https://registry.npmjs.org/theme-ui/-/theme-ui-0.2.52.tgz", - "integrity": "sha512-JFujorP5aFxIm1UyVCtefN5baXjwh5TXHKFYNWgAP+3rqVvggIr46uSMrRNvDjyhFOQiMK8YI8ctPQrrhcETpw==", - "requires": { - "@emotion/is-prop-valid": "^0.8.1", - "@styled-system/css": "^5.0.16", - "deepmerge": "^4.0.0" - } - }, - "throttle-debounce": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", - "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==" - }, - "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==", - "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==" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "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==", - "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=" - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "optional": true - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" - }, - "tippy.js": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.2.6.tgz", - "integrity": "sha512-0tTL3WQNT0nWmpslhDryRahoBm6PT9fh1xXyDfOsvZpDzq52by2rF2nvsW0WX2j9nUZP/jSGDqfKJGjCtoGFKg==", - "requires": { - "@popperjs/core": "^2.4.4" - } - }, - "title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "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=" - }, - "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=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "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=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" - }, - "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==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-lines": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz", - "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==" - }, - "trim-trailing-lines": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", - "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" - }, - "try-catch": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/try-catch/-/try-catch-2.0.1.tgz", - "integrity": "sha512-LsOrmObN/2WdM+y2xG+t16vhYrQsnV8wftXIcIOWZhQcBJvKGYuamJGwnU98A7Jxs2oZNkJztXlphEOoA0DWqg==" - }, - "try-to-catch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/try-to-catch/-/try-to-catch-1.1.1.tgz", - "integrity": "sha512-ikUlS+/BcImLhNYyIgZcEmq4byc31QpC+46/6Jm5ECWkVFhf8SM2Fp/0pMVXPX6vk45SMCwrP4Taxucne8I0VA==" - }, - "ts-easing": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", - "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" - }, - "ts-invariant": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "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=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "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==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "type-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz", - "integrity": "sha1-5yoXQYllaOn2KDeNgW1pEvfyOXI=" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "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.10.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.3.tgz", - "integrity": "sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g==" - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - } - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "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==" - }, - "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==", - "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==" - }, - "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==" - }, - "unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - } - } - }, - "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==", - "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=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "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==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" - }, - "unist-util-generated": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.5.tgz", - "integrity": "sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw==" - }, - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" - }, - "unist-util-map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unist-util-map/-/unist-util-map-1.0.5.tgz", - "integrity": "sha512-dFil/AN6vqhnQWNCZk0GF/G3+Q5YwsB+PqjnzvpO2wzdRtUJ1E8PN+XRE/PRr/G3FzKjRTJU0haqE0Ekl+O3Ag==", - "requires": { - "object-assign": "^4.0.1" - } - }, - "unist-util-modify-children": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz", - "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==", - "requires": { - "array-iterate": "^1.0.0" - } - }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" - }, - "unist-util-remove": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.0.0.tgz", - "integrity": "sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g==", - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-1.5.0.tgz", - "integrity": "sha1-qTwr6MD2U4J4A7gTMa3sKqJM2TM=", - "requires": { - "css-selector-parser": "^1.1.0", - "debug": "^2.2.0", - "nth-check": "^1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz", - "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" - }, - "unist-util-visit-parents": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz", - "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - } - } - }, - "unist-util-visit-children": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz", - "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ==" - }, - "unist-util-visit-parents": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", - "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.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=", - "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=", - "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=" - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, - "update-notifier": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", - "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==", - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "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==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", - "requires": { - "upper-case": "^1.1.1" - } - }, - "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==", - "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=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "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=" - } - } - }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "urql": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/urql/-/urql-1.10.0.tgz", - "integrity": "sha512-Cxx1INTWNUMg9A2gyltqNqukOLFVtztkHxFGfv01OvsFAtR+wCmLyJqIzGUZRKVbKepTLocGbelS7QDxtjcqtg==", - "requires": { - "@urql/core": "^1.12.3", - "wonka": "^4.0.14" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "use-callback-ref": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.4.tgz", - "integrity": "sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ==" - }, - "use-sidecar": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.3.tgz", - "integrity": "sha512-ygJwGUBeQfWgDls7uTrlEDzJUUR67L8Rm14v/KfFtYCdHhtjHZx1Krb3DIQl3/Q5dJGfXLEQ02RY8BdNBv87SQ==", - "requires": { - "detect-node-es": "^1.0.0", - "tslib": "^1.9.3" - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "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=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", - "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==" - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vfile": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz", - "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - } - } - }, - "vfile-location": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.1.0.tgz", - "integrity": "sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==" - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" - }, - "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==" - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "optional": 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" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" - }, - "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", - "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.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.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.1", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - }, - "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==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.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==", - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "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==" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "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" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "requires": { - "original": "^1.0.0" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "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=" - } - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "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==", - "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==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", - "requires": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", - "querystring": "^0.2.0", - "strip-ansi": "^3.0.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==", - "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==", - "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==", - "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==" - } - } - }, - "webpack-stats-plugin": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-0.3.2.tgz", - "integrity": "sha512-kxEtPQ6lBBik2qtJlsZkiaDMI6rGXe9w1kLH9ZCdt0wgCGVnbwwPlP60cMqG6tILNFYqXDxNt4+c4OIIuE+Fnw==" - }, - "webpack-virtual-modules": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz", - "integrity": "sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==", - "requires": { - "debug": "^3.0.0" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "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==" - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.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=" - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "with-open-file": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", - "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", - "requires": { - "p-finally": "^1.0.0", - "p-try": "^2.1.0", - "pify": "^4.0.1" - } - }, - "wonka": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.14.tgz", - "integrity": "sha512-v9vmsTxpZjrA8CYfztbuoTQSHEsG3ZH+NCYfasHm0V3GqBupXrjuuz0RJyUaw2cRO7ouW2js0P6i853/qxlDcA==" - }, - "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==" - }, - "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==", - "requires": { - "errno": "~0.1.7" - } - }, - "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" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "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==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xss": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz", - "integrity": "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==", - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - } - }, - "xstate": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.11.0.tgz", - "integrity": "sha512-v+S3jF2YrM2tFOit8o7+4N3FuFd9IIGcIKHyfHeeNjMlmNmwuiv/IbY9uw7ECifx7H/A9aGLcxPSr0jdjTGDww==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "requires": { - "@babel/runtime": "^7.6.3" - } - }, - "yaml-loader": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.6.0.tgz", - "integrity": "sha512-1bNiLelumURyj+zvVHOv8Y3dpCri0F2S+DCcmps0pA1zWRLjS+FhZQg4o3aUUDYESh73+pKZNI18bj7stpReow==", - "requires": { - "loader-utils": "^1.4.0", - "yaml": "^1.8.3" - }, - "dependencies": { - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "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==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" - } - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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" - } - }, - "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==" - }, - "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==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "yoga-layout-prebuilt": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.9.6.tgz", - "integrity": "sha512-Wursw6uqLXLMjBAO4SEShuzj8+EJXhCF71/rJ7YndHTkRAYSU0GY3OghRqfAk9HPUAAFMuqp3U1Wl+01vmGRQQ==", - "requires": { - "@types/yoga-layout": "1.9.2" - } - }, - "yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.11", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.6", - "toposort": "^2.0.2" - } - }, - "yurnalist": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-1.1.2.tgz", - "integrity": "sha512-y7bsTXqL+YMJQ2De2CBtSftJNLQnB7gWIzzKm10GDyC8Fg4Dsmd2LG5YhT8pudvUiuotic80WVXt/g1femRVQg==", - "requires": { - "babel-runtime": "^6.26.0", - "chalk": "^2.4.2", - "cli-table3": "^0.5.1", - "debug": "^4.1.1", - "deep-equal": "^1.1.0", - "detect-indent": "^6.0.0", - "inquirer": "^7.0.0", - "invariant": "^2.2.0", - "is-builtin-module": "^3.0.0", - "is-ci": "^2.0.0", - "leven": "^3.1.0", - "loud-rejection": "^2.2.0", - "node-emoji": "^1.10.0", - "object-path": "^0.11.2", - "read": "^1.0.7", - "rimraf": "^3.0.0", - "semver": "^6.3.0", - "strip-ansi": "^5.2.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - } - } - }, - "zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "zen-observable-ts": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", - "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", - "requires": { - "tslib": "^1.9.3", - "zen-observable": "^0.8.0" - } - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" - } - } -} diff --git a/docs/package.json b/docs/package.json deleted file mode 100644 index c00bb030..00000000 --- a/docs/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "engines": { - "node": ">=10.13.0" - }, - "scripts": { - "prestart": "gatsby clean", - "start": "GATSBY_ALGOLIA_ENABLED=false gatsby develop", - "build": "gatsby build", - "serve": "gatsby serve" - }, - "dependencies": { - "gatsby": "2.24.51", - "algoliasearch": "^4.4.0", - "gatsby-plugin-gtag": "^1.0.13", - "gatsby-source-graphql": "^2.7.2", - "gatsby-theme-apollo-docs": "4.3.7", - "instantsearch.css": "^7.4.4", - "gatsby-source-git": "1.1.0", - "react": "16.13.1", - "react-dom": "16.13.1", - "react-instantsearch-dom": "^6.7.0" - }, - "devDependencies": { - "gatsby-cli": "^2.12.107" - } -} diff --git a/docs/shared/disclaimer.mdx b/docs/shared/disclaimer.mdx deleted file mode 100644 index 19bb556d..00000000 --- a/docs/shared/disclaimer.mdx +++ /dev/null @@ -1,5 +0,0 @@ -> **The code blocks below use TypeScript by default.** You can use the dropdown menu above a code block to switch to JavaScript. -> -> If you're using JavaScript, use `.js` and `.jsx` file extensions wherever `.ts` and `.tsx` are mentioned. -> -> To generate TypeScript types for your queries and mutations, open another terminal window and run `npm run codegen`. This will watch for changes to your code and generate the client-side typings. \ No newline at end of file diff --git a/docs/source/components/docset-menu.js b/docs/source/components/docset-menu.js deleted file mode 100644 index 62e94052..00000000 --- a/docs/source/components/docset-menu.js +++ /dev/null @@ -1,53 +0,0 @@ -import React, { useContext } from 'react'; -import styled from '@emotion/styled'; -import { - NavItemsContext, - NavItemTitle, - NavItemDescription -} from 'gatsby-theme-apollo-docs'; -import { colors } from 'gatsby-theme-apollo-core'; - -const Wrapper = styled.div({ - display: 'grid', - gridTemplateColumns: `repeat(auto-fill, minmax(270px, 1fr))`, - gridGap: 12, - paddingTop: 8 -}); - -const MenuItem = styled.div({ - display: 'flex' -}); - -const TextWrapper = styled.div({ - color: colors.text1 -}); - -const StyledLink = styled.a({ - color: 'inherit', - textDecoration: 'none', - ':hover': { - textDecoration: 'underline' - } -}); - -export default function DocsetMenu() { - const navItems = useContext(NavItemsContext); - return ( - - {navItems.filter((navItem) => { - return !(navItem.omitLandingPage); - }).map((navItem, index) => ( - - - - - {navItem.title} - - - {navItem.description} - - - ))} - - ); -} diff --git a/docs/source/content/assets/akv2k8s_small.svg b/docs/source/content/assets/akv2k8s_small.svg deleted file mode 100644 index 11c6976f..00000000 --- a/docs/source/content/assets/akv2k8s_small.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - diff --git a/docs/source/content/assets/auth-decision.svg b/docs/source/content/assets/auth-decision.svg deleted file mode 100644 index e979ddbd..00000000 --- a/docs/source/content/assets/auth-decision.svg +++ /dev/null @@ -1 +0,0 @@ -Using AzureAKSYesNoUse CustomCredentialsYesUse AKS identityto access AzureKey Vault?This is Default.No special configneededYesNoSingle Azure KeyVault perKubernetes ClusterNoAccess all AzureKey Vaults withthe same identity?NocustomAuth = truePass custom AKV credentialsto Env-InjectorcustomAuth = truePass custom AKV credentials toevery PODOption 1Option 2Yes \ No newline at end of file diff --git a/docs/source/content/assets/controller_and_injector.png b/docs/source/content/assets/controller_and_injector.png deleted file mode 100644 index f552998290456cb72b0fe119ea8a9aaa37c67dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41537 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 Secret resources reside in a namespace. Secrets can only be referenced by Pods in that same namespace. - -https://kubernetes.io/docs/concepts/configuration/secret/#restrictions - -## What are the different Azure Key Vault authentication options available? - -For the Controller: - -1. Using built-in AKS cluster credentials from azure cloud config (default) -2. Using custom credentials through environment variables -3. Using aad-pod-identity - -For the Env-Injector: - -Same 3 options as for the Controller, plus: - -1. Disable the env-injector auth service and use aad-pod-identity with your pod -2. Disable the env-injector auth service and pass credentials directly to your pod through environment variables diff --git a/docs/source/content/how-it-works.mdx b/docs/source/content/how-it-works.mdx deleted file mode 100644 index b4ad89d2..00000000 --- a/docs/source/content/how-it-works.mdx +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: "How it Works" -description: "Learn about the inner workings of akv2k8s." ---- - -import { - ExpansionPanel, - ExpansionPanelList, - ExpansionPanelListItem -} from 'gatsby-theme-apollo-docs'; - -Akv2k8s consist of three main components: - -* a Custom Resource Definition called `AzureKeyVaultSecret` -* Controller -* Env Injector - -## The AzureKeyVaultSecret CRD - -The `AzureKeyVaultSecret` Custom Resource Definition (CRD) contains metadata used by the Controller and Env Injector to access objects in Azure Key Vault. For each secret, certificate or key in AzureKeyVault that you want available in Kubernetes, you create a `AzureKeyVaultSecret` and provide: - -* The Kubernetes namespace where the Azure Key Vault secret should be available -* The name of the Azure Key Vault -* The name, type and version (optional) of the Azure Key Vault object -* Optionally a Kubernetes `Secret` name and data-key to sync to - -An example `AzureKeyVaultSecret` looks like this: - -```yaml -# secret-sync.yaml - -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: secret-sync - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-secret # name of the akv object - type: secret # akv object type - output: # optional - only used to sync to a kubernetes secret - secret: - name: my-secret-from-akv # kubernetes secret name - dataKey: secret-value # key to store object value in kubernetes secret -``` - -## The Controller - -The Controller is responsible for: - -* syncing Azure Key Vault objects into Kubernetes `Secret`'s, where the `AzureKeyVaultSecret` has `spec.output.secret` defined (like in the example above) -* periodically poll Azure Key Vault for changes and apply to the Kubernetes `Secret` - -> **Note-1: Pods in Kubernetes currently do not get notifications when Secret resources change, and Pods will have to be re-created or use something like the Wave controller (https://github.com/pusher/wave) to get the changes** - -## The Env Injector - -The Env Injector is a bit more complex than the Controller and consists of: - -* a Mutating Admission Webhook (see [Kubernetes docs](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook)) -* a Docker image (spvest/azure-keyvault-env) containing the `azure-keyvault-env` executable - -Below are the steps that gets executed for a Pod using env-injection. - - - - -### The Mutating Admission Webhook triggers - -The Env Injector webhook gets triggered just before every Pod gets created and inspects the Pod definition for environment variables containing `@azurekeyvault` (see example below). If it does not find any, the Pod starts as normal. If it does, it mutates (changes) the Pod with: - -* A init-container (image: spvest/azure-keyvault-env) with a in-memory volume at `/azure-keyvault/` -* Changes the executable for the Pod container (more on that later) - -Example where environment variable has value containing `@azurekeyvault`: - -```yaml -env: - - name: MY_AKV_SECRET - value: some-secret@azurekeyvault -``` - -As mentioned, the Pod container gets mutated to use a different executable. It does this by changing either the CMD or the ENTRYPOINT, depending on which was used by the original container, to use the `azure-keyvault-env` executable instead. The "old" command gets passed in as parameter to this new executable. - - - - -### The Pod starts the init-container - -When the Env Injector webhook is finished, Kubernetes will start the Pod with the mutated changes. This will trigger the following sequence: - -1. The init-container will start -2. The init-container copies the `azure-keyvault-env` executable into `/azure-keyvault/` - -The volume `/azure-keyvault/` in the Pod is shared between its containers (the init-container and the original container) and is how the init-container can "give" the original container its executable. - - - - -### The Pod starts the original container - -When the original container starts, it will execute the `azure-keyvault-env` command, which will: - -1. Get a OAuth token from the Env-Injector auth service for authenticating with Azure Key Vault (default - other options exists - see [Authentication](security/authentication) for details) -2. Connect to Azure Key Vault, using credentials from previous step -3. Download any Azure Key Vault objects, identified by the environment placeholders -4. Execute the original command and params, pass on the updated environment variables with real secret values - - - - -**✨The end result is secrets injected transparently in-memory during container startup. It will not reveal any of the actual secrets in the container spec, disk or logs. The only component containing the actual secrets is the application process.✨** - - - diff --git a/docs/source/content/index.mdx b/docs/source/content/index.mdx deleted file mode 100644 index ca317bc6..00000000 --- a/docs/source/content/index.mdx +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Overview -description: Explore Azure Key Vault to Kubernetes ---- - -import DocsetMenu from '../components/docset-menu'; -import { Button } from '@apollo/space-kit/Button'; -import { Link } from 'gatsby'; -import { colors } from 'gatsby-theme-apollo-core'; -import { - ExpansionPanel, - ExpansionPanelList, - ExpansionPanelListItem -} from 'gatsby-theme-apollo-docs'; - -Azure Key Vault to Kubernetes (akv2k8s) makes Azure Key Vault secrets, certificates and keys available in Kubernetes and/or your application - in a simple and secure way. - -## The Goals of the Azure Key Vault to Kubernetes project - -The Azure Key Vault to Kubernetes project was set out with these goals in mind: - - - - -Avoid a direct program dependency on Azure Key Vault for getting secrets, and adhere to the 12 Factor App principle for configuration (https://12factor.net/config) - - - - -Make it simple, secure and low risk to transfer Azure Key Vault secrets into Kubernetes as native Kubernetes secrets - - - - -Bypass using Kubernetes Secrets entirely and transparently inject Azure Key Vault secrets directly into container applications - - - - -All of these goals are met. - - - - ---- - -## Components - -Akv2k8s contains two main components: - -1. The **akv2k8s Controller** syncs Azure Key Vault objects to Kubernetes as native `Secret`'s -2. The **akv2k8s Injector** injects Azure Key Vault objects as environment variables directly into your application. - -The diagram below illustrate the two options: - -![Controller and Env-Injector](assets/controller_and_injector.png) - -For more information about the inner workings of Azure Key Vault for Kubernetes, see [How it Works](how-it-works). - -## Install both - -The recommendation is to install both the Controller and the Env Injector, enabling native Kubernetes secrets when needed and transparently injecting environment variables for all other cases. - -## When to use the Controller? - -Use the Controller if: - -* the native `Secret` support in Kubernetes is desired - e.g. you need to use a 3rd party Helm chart that expects a `Secret` -* the [risks documented with Secrets in Kubernetes](https://kubernetes.io/docs/concepts/configuration/secret/#risks) is acceptable -* there are no concerns about storing Azure Key Vault secrets as base64 encoded plain text values in Kubernetes `Secret` resources -* it is OK that anyone with read access to `Secret` resources in the Kubernetes cluster can read the content of the secrets - -## When to use the Env Injector? - -Use the Env Injector if: - -* the application running in the container support getting secrets as environment variables -* any of the [risks documented with Secrets in Kubernetes](https://kubernetes.io/docs/concepts/configuration/secret/#risks) is not acceptable -* there are concerns about storing and exposing base64 encoded Azure Key Vault secrets as Kubernetes `Secret` resources -* preventing Kubernetes users to gain access to Azure Key Vault secret content is important -* secret environment variable values should not be revealed to Kubernetes resources like Pod specs, stored on disks, visible in logs or exposed in any way other than in-memory for the application - -## Not convinced yet? - -Go check out [Why use akv2k8s?](how-it-works) to see if that changes your mind. - -## Want to get started? - -
- -
diff --git a/docs/source/content/installation/index.md b/docs/source/content/installation/index.md deleted file mode 100644 index 96691abf..00000000 --- a/docs/source/content/installation/index.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Overview" -description: "Different options for installing akv2k8s" ---- - -Make sure to check the [requirements](requirements) before installing. - -## Installation options - -It's recommended to use Helm charts for installation. - -[Installing with Helm charts](installing-with-helm) - -[Installing witouh Helm charts](installing-without-helm) diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md deleted file mode 100644 index 4004519a..00000000 --- a/docs/source/content/installation/installing-with-helm.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Installation with Helm" -description: "How to install Azure Key Vault to Kubernetes with Helm" ---- - -> Make sure to check the [requirements](requirements) before installing. - -## Installing the AzureKeyVaultSecret CRD - -Before installing the Chart, the Custom Resource Definition for AzureKeyVaultSecret must be installed by pointing to the correct version: - -``` -kubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/{{ version }}/crds/AzureKeyVaultSecret.yaml -``` - -For the latest version (`1.1.0`) run: - -``` -kubectl apply -f https://raw.githubusercontent.com/sparebankenvest/azure-key-vault-to-kubernetes/crd-1.1.0/crds/AzureKeyVaultSecret.yaml -``` - -## Create a dedicated namespace - -A dedicated namespace needs to be created for akv2k8s: - -```bash -kubectl create ns akv2k8s -``` - -## Installation - -### Installing with Helm on Azure AKS - -Add Helm repository: - -```bash -helm repo add spv-charts http://charts.spvapi.no -helm repo update -``` - -Install both Controller and Env-Injector: - -```bash -helm upgrade -i azure-key-vault-controller spv-charts/azure-key-vault-controller \ - --namespace akv2k8s - -helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ - --namespace akv2k8s -``` - -For more details about installation options, see the [Helm chart for akv2k8s](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s): - -### Installing with Helm outside Azure AKS - -When running inside Azure AKS, akv2k8s will use the AKS cluster credentials by default to authenticate with Azure Key Vault. Outside Azure AKS - credentials must be provided by setting `keyVault.customAuth=true` and provide credentials as documentend under [Authentication](../security/authentication) for more details. - -Create `akv2k8s` namespace: - -```bash -kubectl create ns akv2k8s -``` - -Add Helm repository: - -```bash -helm repo add spv-charts http://charts.spvapi.no -helm repo update -``` - -Install both Controller and Env-Injector: - -```bash -helm upgrade -i azure-key-vault-controller spv-charts/azure-key-vault-controller \ - --namespace akv2k8s \ - --set keyVault.customAuth.enabled=true \ - --set env.AZURE_TENANT_ID= \ - --set env.AZURE_CLIENT_ID= \ - --set env.AZURE_CLIENT_SECRET= - -helm upgrade -i azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \ - --namespace akv2k8s \ - --set keyVault.customAuth.enabled=true \ - --set env.AZURE_TENANT_ID= \ - --set env.AZURE_CLIENT_ID= \ - --set env.AZURE_CLIENT_SECRET= -``` diff --git a/docs/source/content/installation/installing-without-helm.md b/docs/source/content/installation/installing-without-helm.md deleted file mode 100644 index 836de776..00000000 --- a/docs/source/content/installation/installing-without-helm.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "Installation without Helm" -description: "How to setup Azure Key Vault to Kubernetes" ---- - -Make sure to check the [requirements](requirements) before installing. - -If Helm is not an option, use Helm on a local computer to generate the Kubernetes templates like below. - -## Using Helm 3 - -Download the Git repository: - -```bash -git clone git@github.com:SparebankenVest/public-helm-charts.git -``` - -Render chart templates locally: - -```bash -cd public-helm-charts -helm template azure-key-vault-controller ./stable/azure-key-vault-controller/ -helm template azure-key-vault-env-injector ./stable/azure-key-vault-env-injector/ -``` - -## Options and more - -For more details about installation options, see the [Helm chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s) \ No newline at end of file diff --git a/docs/source/content/installation/requirements.md b/docs/source/content/installation/requirements.md deleted file mode 100644 index eddc22e5..00000000 --- a/docs/source/content/installation/requirements.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Requirements" -description: "Requirements for installing akv2k8s" ---- - -* Kubernetes version >= 1.15.11 -* A dedicated kubernetes namespace (e.g. akv2k8s) -* Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook -* RBAC enabled -* Default [authentication](../security/authentication) requires Azure AKS - use [custom authentication](../security/authentication) if running outside Azure AKS. - -## Dedicated namespace for akv2k8s - -Akv2k8s should be installed in a dedicated Kubernetes namespace **NOT** label with `azure-key-vault-env-injection: enabled`. - -**If the namespace where the akv2k8s components is installed has the injector enabled (`azure-key-vault-env-injection: enabled`), the Env Injector will most likely not be able to start.** This is because the Env Injector mutating webhook will trigger for every pod about to start in namespaces where enabled, and in the home namepsace of the Env Injector, it will effectively point to itself, which does not exist yet. - -**The simple rule to avoid any issues related to this, is to just install akv2k8s components in its own dedicated namespace.** \ No newline at end of file diff --git a/docs/source/content/quick-start.mdx b/docs/source/content/quick-start.mdx deleted file mode 100644 index cdf4b846..00000000 --- a/docs/source/content/quick-start.mdx +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Quick Start -description: Quickly get started using Azure Key Vault to Kubernetes ---- - -import { - ExpansionPanel, - ExpansionPanelList, - ExpansionPanelListItem -} from 'gatsby-theme-apollo-docs'; - - - - -## Installation - -See [installation](installation). - - - - -## Ensure Kubernetes can access objects in Azure Key Vault - -By default akv2k8s use the AKS cluster credentials to authenticate with Azure Key Vault (if you run outside Azure, see using [custom credentials](security/authentication)). Run the following command to authorize akv2k8s to access `secret`-objects in Azure Key Vault. - -```bash -az keyvault set-policy \ - -n \ - --secret-permissions get \ - --spn \ - --subscription -``` - -For more details and options, check out [authentication](security/authentication) and [authorization](security/authorization). - - - - -## Sync Azure Key Vault object to Kubernetes `Secret` - -Create a `AzureKeyVaultSecret` resource in the namespace you want the Kubernetes `Secret` to be synced. In this example we are using the namespace `akv-test`. - -```yaml -# secret-sync.yaml - -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: secret-sync - namespace: akv-test -spec: - vault: - name: akv2k8s-test # 1. name of key vault - object: - name: my-secret # 2. name of the akv object - type: secret # 3. akv object type - output: - secret: - name: my-secret-from-akv # 4. kubernetes secret name - dataKey: secret-value # 5. key to store object value in kubernetes secret -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f secret-sync.yaml -azurekeyvaultsecret.spv.no/secret-sync created -``` - - - - -## Done - -Shortly you should have a Kubernetes `Secret` resource in the namespace `akv-test`, containing the value from Azure Key Vault! - -To see how to use the Env-Injector to bypass using Kubernetes Secrets entirely and other options, check out the [tutorials](tutorials). - - - - diff --git a/docs/source/content/reference/azure-key-vault-secret.md b/docs/source/content/reference/azure-key-vault-secret.md deleted file mode 100644 index 3e5d34b6..00000000 --- a/docs/source/content/reference/azure-key-vault-secret.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: "AzureKeyVaultSecret" -description: "Reference of AzureKeyVaultSecret custom resource definition" ---- - -The `AzureKeyVaultSecret` is defined using this schema: - -```yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: < name for azure key vault secret> - namespace: -spec: - vault: - name: - object: - name: - type: - version: - contentType: - output: # ignored by env injector, required by controller to output kubernetes secret - transform: # optional transformers executed in listed order - - trim # optional - trims empty space - - base64encode # optional - encode to base64 - - base64decode # optional - decode from base64 - secret: - name: - type: - dataKey: - chainOrder: -``` - -> **Note - the `output` is only used by the Controller to create the Azure Key Vault secret as a Kubernetes native Secret - it is ignored and not needed by the Env Injector.** - -## Kubernetes Secret Types - -The default secret type (`spec.output.secret.type`) is `opaque`. Below is a list of supported Kubernetes secret types and which keys each secret type stores. - -For a complete list, see [core/v1/types.go](https://github.com/kubernetes/api/blob/49be0e3344fe443eb3d23105225ed2f1ab1e6cab/core/v1/types.go#L4950) in the Kubernetes GitHub repository. - -| Secret type | Keys | -| -------------------------------- | ---- | -| `opaque` (default) | defined in `spec.output.secret.dataKey` | -| `kubernetes.io/tls` | `tls.key`, `tls.crt` | -| `kubernetes.io/dockerconfigjson` | `.dockerconfigjson` | -| `kubernetes.io/dockercfg` | `.dockercfg` | -| `kubernetes.io/basic-auth` | `username`, `password` | -| `kubernetes.io/ssh-auth` | `ssh-privatekey` | - - -With the exception of the `opaque` secret type, the Controller will make a best effort to export the Azure Key Vault object into the secret type defined. - -### `kubernetes.io/tls` - -By pointing to a **exportable** Certificate object in Azure Key Vault AND setting the Kubernetes output secret type to `kubernetes.io/tls`, the controller will automatically format the Kubernetes secret accordingly both for pem and pfx certificates. - -### `kubernetes.io/dockerconfigjson` - -Requires a well formatted docker config stored in a Secret object like this: - -```json -{ - "auths": { - "some.azurecr.io": { - "username": "someuser", - "password": "somepassword", - "email": "someuser@spv.no", - "auth": "c29tZXVzZXI6c29tZXBhc3N3b3JkCg==" - } - } -} -``` - -If the `"auth"` property is not included, the controller will generate it. - -### `kubernetes.io/basic-auth` - -The controller support two formats. Either `username:password` or pre-encoded with base64: `dXNlcm5hbWU6cGFzc3dvcmQ=` stored in a Secret object. - -### `kubernetes.io/ssh-auth` - -This must be a properly formatted **Private** SSH Key stored in a Secret object. - -## Vault Object Types - -| Object type | Description | -| ------------- | ----------- | -| `secret` | Azure Key Vault Secret - can contain any secret data | -| `certificate` | Azure Key Vault Certificate - A TLS certificate with just the public key or both public and private key if exportable | -| `key` | Azure Key Vault Key - A RSA or EC key used for signing | -| `multi-key-value-secret` | A special kind of Azure Key Vault Secret only understood by the Controller and the Env Injector. For cases where a secret contains `json` or `yaml` key/value items that will be directly exported as key/value items in the Kubernetes secret, or access with queries in the Evn Injector. When `multi-key-value-secret` type is used, the `contentType` property MUST also be set to either `application/x-json` or `application/x-yaml`. | - -## Chain Order - -When exporting a PFX certificate from Key Vault the server certificate sometimes end up at the end of the chain instead of the beginning. If this is used together with, for example, ingress-nginx the certificate won't be loaded and it will revert back to default. By setting `chainOrder` to `ensureserverfirst` the server certificate will be moved first in the chain. - -## Output Transformation - -Three common transformers exists - trim, base64encode and base64decode. Below is an example where a secret extracted from Azure Key Vault, which is base64 encoded, gets decoded by the transformer before added to a Kubernetes Secret. - -``` -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: base64decoded-binary-file - namespace: my-kw -spec: - vault: - name: my-kv - object: - name: my-kv-secret - type: secret - output: - transform: - - base64decode - - trim - secret: - name: not-base64encoded-anymore - dataKey: myKey -``` \ No newline at end of file diff --git a/docs/source/content/reference/index.md b/docs/source/content/reference/index.md deleted file mode 100644 index e4991fb4..00000000 --- a/docs/source/content/reference/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Reference" -description: "Reference of akv2k8s objects" ---- - -Find detailed reference for all akv2k8s objects, like the Kubernetes Custom Resource Definition (CRD) [`AzureKeyVaultSecret`](azure-key-vault-secret). diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md deleted file mode 100644 index da97d4fc..00000000 --- a/docs/source/content/security/authentication.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: "Authentication with Azure Key Vault" -description: "Learn about the different options for authenticating with Azure Key Vault." ---- - -By default both the Controller and the Env Injector will assume it is running on Azure (since Azure Key Vault is most commonly used in Azure) - and use the default AKS credentials for authentication (a Service Principal or Azure Managed Identities) - unless custom authentication is provided. - -The Controller and Env-Injector have to handle AKV authentication quite differently, as the Controller is centralized and the Env-Injector executes in context of Pods. - -For more details about AKV authentication, see: - * [AKV Authentication with the Controller](#akv-authentication-with-the-controller) for AKV Controller authentication options - * [AKV Authentication with the Env-Injector](#akv-authentication-with-the-env-injector) for AKV Env-Injector authentication options - -## Situations where Default Authentication does not Work - -Currently only one situations has been identified, where default authentication does not work inside Azure. - -**When a [Pod Security Policy](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) is configured in the cluster, preventing containers from reading from the host.** - -Two solutions exists: - 1. Change the Pod Security Policy to list `/etc/kubernetes/azure.json` under [AllowedHostPaths](https://kubernetes.io/docs/concepts/policy/pod-security-policy/#volumes-and-file-systems) - 2. Or use custom authentication (see below). - -## AKV Authentication with the Controller - -The Controller will need AKV credentials to get Secrets from AKV and store them as Kubernetes Secrets. **If the default option (AKS credentials) works for you, use that.** If not, use custom authentication by passing inn the value `keyVault.customAuth.enabled=true` to the Controller and pick one of the [Authentication options](#custom-akv-authentication-options) described below. - -Fore more details, see the [Controller Helm Chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller/README.md). - -## AKV Authentication with the Env-Injector - -The Env-Injector execute locally inside Pods and needs AKV credentials to download and inject secrets into container programs. You can either use default authentication (AKS credentials) or custom authentication. Use the following decision tree to find the best option: - -![Authentication decision tree](../assets/auth-decision.svg) - -> **For custom AKV authentication using Option 1 and akv2k8s versions `< 1.1.0`, set `customAuth.enabled=true` and `customAuth.autoInject.enabled=true` to have the Env-Injector auto-inject credentials as a Kubernetes Secret into Pods. Akv2k8s versions `> 1.1.0` handles this automatically through the auth-service introduced in version `1.1.0` without using Kubernetes Secret.** - -> **For multi-tenant environments (using namespaces as isolation), Option 2 is currently the only viable option.** - -Fore more details, see the [Env Injector Helm Chart](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector/README.md) and which custom AKV authentication options are available below. - -### Using aad-pod-identity and MSI (System Assigned Managed Identity or User Assigned Managed Identity) - -If `aad-pod-identity` is installed in a cluster with MSI and akv2k8s, akv2k8s will not work out of the box, as documented by `aad-pod-identity`: - ->The authorization request to fetch a Service Principal Token from an MSI endpoint is sent to Azure Instance Metadata Service (IMDS) endpoint (169.254.169.254), which is redirected to the NMI pod. - -This will prevent akv2k8s to do MSI authentication requests directly with the MSI endpoint, because requests gets delayed by 10-60 seconds: - ->Identity assignment on VM takes 10-20s and 40-60s in case of VMSS. - -Fortunately aad-pod-identity as the concept of application exceptions which will allow akv2k8s to handle MSI authentication requests directly: - -``` -apiVersion: "aadpodidentity.k8s.io/v1" -kind: AzurePodIdentityException -metadata: - name: akv2k8s-exception - namespace: akv2k8s # change if akv2k8s is installed in a different ns -spec: - podLabels: - foo: bar - app: custom -``` - -See https://github.com/Azure/aad-pod-identity/blob/master/docs/readmes/README.app-exception.md for more details. - -### Using custom authentication with AAD Pod Identity (aad-pod-identity) - -First decide on either option 1 or 2 from the [authentication decision tree](#akv-authentication-with-the-env-injector) above. - -#### Option 1 - pass aad-pod-identity to the env-injector - -When installing the env-injector using the official [`akv2k8s`](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s) Helm chart, set the following values: - -``` ---set env_injector.keyVault.customAuth.enabled=true ---set env_injector.webhook.podLabels.aadpodidbinding=[your aad identity] -``` - -...or using the deprecated [azure-key-vault-env-injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector) - -``` ---set keyVault.customAuth.enabled=true ---set webhook.podLabels.aadpodidbinding=[your aad identity] -``` - -#### Option 2 - pass aad-pod-identity to every application pod - -TBD - -## Custom AKV Authentication Options - -The following authentication options are available: - -| Authentication type | Environment variable | Description | -| ------------------- | ---------------------------- | ------------ | -| Managed identities for Azure resources (used to be MSI) | | No credentials are needed for managed identity authentication. The Kubernetes cluster must be running in Azure and the `aad-pod-identity` controller must be installed. A `AzureIdentity` and `AzureIdentityBinding` must be defined. See https://github.com/Azure/aad-pod-identity for details. | -| Client credentials | `AZURE_TENANT_ID` | The ID for the Active Directory tenant that the service principal belongs to. | -| | `AZURE_CLIENT_ID` | The name or ID of the service principal. | -| | `AZURE_CLIENT_SECRET` | The secret associated with the service principal. | -| Certificate | `AZURE_TENANT_ID` | The ID for the Active Directory tenant that the certificate is registered with. | -| | `AZURE_CLIENT_ID` | The application client ID associated with the certificate. | -| | `AZURE_CERTIFICATE_PATH` | The path to the client certificate file. | -| | `AZURE_CERTIFICATE_PASSWORD` | The password for the client certificate. | -| Username/Password | `AZURE_TENANT_ID` | The ID for the Active Directory tenant that the user belongs to. | -| | `AZURE_CLIENT_ID` | The application client ID. | -| | `AZURE_USERNAME` | The username to sign in with. -| | `AZURE_PASSWORD` | The password to sign in with. | - -**Note: These env variables are sensitive and should be stored in a Kubernetes `Secret` resource, then referenced by [Using Secrets as Environment Variables](https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables).** - -See official MS documentation for more details on how environment base authentication works for Azure: https://docs.microsoft.com/en-us/go/azure/azure-sdk-go-authorization#use-environment-based-authentication diff --git a/docs/source/content/security/authorization.md b/docs/source/content/security/authorization.md deleted file mode 100644 index be59c2e5..00000000 --- a/docs/source/content/security/authorization.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Authorization" -description: "Learn how to set the proper access rights in Azure Key Vault" ---- - -No matter which [authentication](authentication) option is used, the authenticated account will need `get` permissions to the different object types in Azure Key Vault. - -**Note: It's only possible to control access at the top level of Azure Key Vault, not per object/resource. The recommendation is therefore to have a dedicated Key Vault per cluster.** - -Access is controlled through Azure Key Vault policies and can be configured through Azure CLI like this: - -Azure Key Vault Secrets: - -```bash -az keyvault set-policy \ - -n \ - --secret-permissions get \ - --spn \ - --subscription -``` - -Azure Key Vault Certificates: - -```bash -az keyvault set-policy \ - -n \ - --certificate-permissions get \ - --spn \ - --subscription -``` - -Azure Key Vault Keys: - -```bash -az keyvault set-policy \ - -n \ - --key-permissions get \ - --spn \ - --subscription -``` diff --git a/docs/source/content/security/enable-env-injection.md b/docs/source/content/security/enable-env-injection.md deleted file mode 100644 index faf0f68e..00000000 --- a/docs/source/content/security/enable-env-injection.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Enable Environment Injecton" -description: "Learn how to enable environment injection per Kubernetes namespace" ---- - -The Env Injector is developed using a Mutating Admission Webhook that triggers just before every Pod gets created. To allow cluster administrators some control over which Pods this Webhook gets triggered for, it must be enabled per namespace using the `azure-key-vault-env-injection` label, like in the example below: - -```yaml -apiVersion: v1 -kind: Namespace -metadata: - name: akv-test - labels: - azure-key-vault-env-injection: enabled -``` \ No newline at end of file diff --git a/docs/source/content/security/risk-assessments.md b/docs/source/content/security/risk-assessments.md deleted file mode 100644 index 0f65cb36..00000000 --- a/docs/source/content/security/risk-assessments.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Risk Assessments" -description: "Learn about the risk assessments the akv2k8s project has done" ---- - -To help assess if the akv2k8s project is within the ... here is a list of some of the perticulars and the risk assessments we did around those topics. - -When developing the akv2k8s project there are many - -## How to handle credentials - -Credentials to Azure Key Vault is needed by both the controller that syncs AKV secrets into Kubernetes secrets, and the env-injector that inject AKV secrets into container applications. - - -### The Controller - -The controller is the easiest to evaluate, as it's not directly exposed together with the applications using them. It's a centrally installed component that can be secured using RBAC mechanisms in Kubernetes and prevent everyone except admins access to any secrets, in perticular the AKV credentials the controller needs. The risk of exposing credentials to uninvited guests is low, and no higher than any other components in Kubernetes handling sensitive data. In practice, the same security precautions must be taken as with Kubernetes Secrets in general. The Kubernetes project have documented this here: - -### The Env-Injector - -Compared to the Controller the injector is quite different, as it's directly exposed together with the Pod and Containers requesting secret injection. In practice this means the code that downloads the secrets for Azure Key Vault runs inside the application Container and are executed before the original executable of that container. After the container has started, a Kubernetes user with the right credentials are able to exec into the container. Several steps have been taken to avoid exposing sensitive data in this scenario and are explained below. Another scenario is data stored in Kubernetes Secrets diff --git a/docs/source/content/troubleshooting/controller-log.md b/docs/source/content/troubleshooting/controller-log.md deleted file mode 100644 index a56ebf0e..00000000 --- a/docs/source/content/troubleshooting/controller-log.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Get the akv2k8s Controller Log" -description: "How to access the Controller log and specify log level" ---- - -```bash -kubectl -n akv2k8s logs deployment/azure-key-vault-controller -``` - -To set log-level for Controller, pass inn environment variable `LOG_LEVEL` to the container or the `logLevel` parameter for the Helm Chart. - -The Controller uses Logrus for logging, supporting seven log levels: https://github.com/Sirupsen/logrus#level-logging - Trace, Debug, Info, Warning, Error, Fatal and Panic. Default log level is `Info`. \ No newline at end of file diff --git a/docs/source/content/troubleshooting/env-injector-log-level.md b/docs/source/content/troubleshooting/env-injector-log-level.md deleted file mode 100644 index 6c0e8806..00000000 --- a/docs/source/content/troubleshooting/env-injector-log-level.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "Set env-injector log-level" -description: "How to set the log-level for the env-injector" ---- - -The Env-Injector logs in three different places: - -* The Pod hosting the Webhook -* The init-container -* During startup of container where environment variables are injected - -## Access Webhook logs - -The Webhook logs information about every Pod that attempts to start in a namespace monitored by the Env-Injector. If something goes wrong during the mutation of a Pod, the log will contain information about what happened. If you want more detailed information, you can increase the log level. - -Log level is controlled through the environment variable `LOG_LEVEL` on the webhook container or through the `logLevel` parameter for the Env-Injector Helm Chart. - -## Access init-container logs - -The init-container will only execute shell commands for copying files into the in-memory volume at `/azure-keyvault/` - but if that would fail, the init-container will contain the shell output in its log. - -## Access logs in your own container - -During startup of a container where environment variables are injected, the `azure-keyvault-env` executable will output any errors that occured during injection and debug messages. To see any debug message, the log level must be set to `debug`. - -Debug level is controlled through the environment variable `ENV_INJECTOR_LOG_LEVEL` on your container. - -The env-injector uses Logrus for logging, supporting seven log levels: https://github.com/Sirupsen/logrus#level-logging - Trace, Debug, Info, Warning, Error, Fatal and Panic. Default log level is `Info`. \ No newline at end of file diff --git a/docs/source/content/troubleshooting/known-issues.md b/docs/source/content/troubleshooting/known-issues.md deleted file mode 100644 index 17c5147a..00000000 --- a/docs/source/content/troubleshooting/known-issues.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Known Issues" -description: "A list of known issues and available solutions or workarounds" ---- - -## Env Injector - x509: certificate signed by unknown authority - -**Issue:** Trying to inject secrets into a application running on a container without CA certificates will fail with an error like below: - -```bash -level=fatal msg="env-injector: failed to read secret 'test', error azure.BearerAuthorizer#WithAuthorization: Failed to refresh the Token for request to https://my-key-vault.vault.azure.net/secrets/test/?api-version=2016-10-01: StatusCode=0 -- Original Error: adal: Failed to execute the refresh request. Error = 'Post https://login.microsoftonline.com/xxx/oauth2/token?api-version=1.0: x509: certificate signed by unknown authority'" -``` - -Doing HTTPS calls without CA certificates will make it impossible for the client to validate if a TLS certificate is signed by a trusted CA. - -**Solution:** Make sure CA certificates are installed in the Docker image used by the container you are trying to inject env vars into (eg. `apt-get install -y ca-certificates`) - -## Env injector - failed calling webhook - -**Issue:** Trying to install the Env Injector in the same namespace as you intend to use it might fail with: - -```bash -Error creating: Internal error occurred: failed calling webhook "pods.azure-key-vault-env-injector.admission.spv.no": Post https://azure-key-vault-env-injector.some-namespace.svc:443/pods?timeout=30s: dial tcp 10.1.1.124:443: connect: connection refused -``` - -**Solution:** Make sure to install Env Injector into its own dedicated namespace, and NOT label namespace with `azure-key-vault-env-injection: enabled`. This label is ONLY intended for namespaces where Env Injector is going to inject secrets, not where Env Injector is installed. \ No newline at end of file diff --git a/docs/source/content/troubleshooting/where-to-look.md b/docs/source/content/troubleshooting/where-to-look.md deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/source/content/tutorials/env-injection/1-secret.md b/docs/source/content/tutorials/env-injection/1-secret.md deleted file mode 100644 index 00f35a57..00000000 --- a/docs/source/content/tutorials/env-injection/1-secret.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: "Inject Secret" -description: "Inject an Azure Key Vault secret directly into a container application" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -We start by creating a definition for the Azure Key Vault secret we want to inject: - -```yaml:title=akvs-secret-inject.yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: secret-inject - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-secret # name of the akv object - type: secret # akv object type -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f akvs-secret-inject.yaml -azurekeyvaultsecret.spv.no/secret-inject created -``` - -List AzureKeyVaultSecret's: - -```bash -$ kubectl -n akv-test get akvs -NAME VAULT VAULT OBJECT SECRET NAME SYNCHED -secret-inject akv2k8s-test my-secret -``` - -Then we deploy a Pod having a env-variable pointing to the secret above. - -```yaml:title=secret-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: akvs-secret-app - namespace: akv-test - labels: - app: akvs-secret-app -spec: - selector: - matchLabels: - app: akvs-secret-app - template: - metadata: - labels: - app: akvs-secret-app - spec: - containers: - - name: akv2k8s-env-test - image: spvest/akv2k8s-env-test:2.0.1 - args: ["TEST_SECRET"] - env: - - name: TEST_SECRET - value: "secret-inject@azurekeyvault" # ref to akvs -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f secret-deployment.yaml -deployment.apps/akvs-secret-app created -``` - -Things to note from the Deployment yaml above: - -```yaml{3,4,6,7} -containers: - - name: akv2k8s-env-test - image: spvest/akv2k8s-env-test:2.0.1 # 1. - args: ["TEST_SECRET"] # 2. - env: - - name: TEST_SECRET # 3. - value: "secret-inject@azurekeyvault" # 4. -``` - -1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image. -2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for -3. Name of the environment variable -4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `secret-inject` we created earlier. The env-injector will download this secret from Azure Key Vault and inject into the executable running in your Container. - -To see the log output from your Pod, execute the following command: - -``` -kubectl -n akv-test logs deployment/akvs-secret-app -``` - -### Cleanup - -```bash -kubectl delete -f akvs-secret-inject.yaml -kubectl delete -f secret-deployment.yaml -``` \ No newline at end of file diff --git a/docs/source/content/tutorials/env-injection/2-certificate.md b/docs/source/content/tutorials/env-injection/2-certificate.md deleted file mode 100644 index e0234fc6..00000000 --- a/docs/source/content/tutorials/env-injection/2-certificate.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: "Inject Certificate" -description: "Inject an Azure Key Vault certificate key pair directly into a container application" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -We start by creating a definition for the Azure Key Vault secret pointing to the certificate we want to sync: - -```yaml:title=akvs-certificate-inject.yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: certificate-inject - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-certificate # name of the akv object - type: certificate # akv object type -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f akvs-certificate-inject.yaml -azurekeyvaultsecret.spv.no/certificate-inject created -``` - -To list AzureKeyVaultSecret's and see sync status: - -```bash -$ kubectl -n akv-test get akvs -NAME VAULT VAULT OBJECT SECRET NAME SYNCHED -certificate-inject akv2k8s-test my-certificate -``` - -Then we deploy a Pod having a env-variable pointing to the secret above. - -```yaml:title=certificate-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: akvs-certificate-app - namespace: akv-test - labels: - app: akvs-certificate-app -spec: - selector: - matchLabels: - app: akvs-certificate-app - template: - metadata: - labels: - app: akvs-certificate-app - spec: - containers: - - name: akv2k8s-env-test - image: spvest/akv2k8s-env-test:2.0.1 - args: ["PUBLIC_KEY", "PRIVATE_KEY"] - env: - - name: PUBLIC_KEY - value: certificate-inject@azurekeyvault?tls.crt - - name: PRIVATE_KEY - value: certificate-inject@azurekeyvault?tls.key -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f certificate-deployment.yaml -deployment.apps/akvs-certificate-app created -``` - -Things to note from the Deployment yaml above: - -```yaml{3,4,6-9} -containers: -- name: akv2k8s-env-test - image: spvest/akv2k8s-env-test # 1. - args: ["PUBLIC_KEY", "PRIVATE_KEY"] # 2. - env: - - name: PUBLIC_KEY # 3. - value: certificate-inject@azurekeyvault?tls.crt # 4. - - name: PRIVATE_KEY # 5. - value: certificate-inject@azurekeyvault?tls.key # 6. -``` - -1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image. -2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for -3. Name of the environment variable containing the certificate public key -4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `certificate-inject` we created earlier. The env-injector will download this secret from Azure Key Vault and inject into the executable running in your Container. -5. Name of the environment variable containing the certificate private key -6. Same as 4. - only for the certificate private key - -To see the log output from your Pod, execute the following command: - -``` -kubectl -n akv-test logs deployment/akvs-certificate-app -``` - -### Cleanup - -```bash -kubectl delete -f akvs-secret-inject.yaml -kubectl delete -f secret-deployment.yaml -``` \ No newline at end of file diff --git a/docs/source/content/tutorials/env-injection/3-signing-key.md b/docs/source/content/tutorials/env-injection/3-signing-key.md deleted file mode 100644 index 17dc6c6f..00000000 --- a/docs/source/content/tutorials/env-injection/3-signing-key.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: "Inject Signing Key" -description: "Inject a signing key from Azure Key Vault as environment variable into an application" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -We start by creating a definition for the Azure Key Vault signing key we want to inject: - -```yaml:title=akvs-signing-key-inject.yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: signing-key-inject - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-key # name of the akv object - type: key # akv object type -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f akvs-signing-key-inject.yaml -azurekeyvaultsecret.spv.no/signing-key-inject created -``` - -List AzureKeyVaultSecret's: - -```bash -$ kubectl -n akv-test get akvs -NAME VAULT VAULT OBJECT SECRET NAME SYNCHED -signing-key-inject akv2k8s-test my-key -``` - -Then we deploy a Pod having a env-variable pointing to the secret above. - -```yaml:title=signing-key-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: akvs-signing-key-app - namespace: akv-test - labels: - app: akvs-signing-key-app -spec: - selector: - matchLabels: - app: akvs-signing-key-app - template: - metadata: - labels: - app: akvs-signing-key-app - spec: - containers: - - name: akv2k8s-env-test - image: spvest/akv2k8s-env-test:2.0.1 - args: ["TEST_SIGNING_KEY"] - env: - - name: TEST_SIGNING_KEY - value: "signing-key-inject@azurekeyvault" # ref to akvs -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f signing-key-deployment.yaml -deployment.apps/akvs-signing-key-app created -``` - -Things to note from the Deployment yaml above: - -```yaml{3,4,6,7} -containers: - - name: akv2k8s-env-test - image: spvest/akv2k8s-env-test:2.0.1 # 1. - args: ["TEST_SIGNING_KEY"] # 2. - env: - - name: TEST_SIGNING_KEY # 3. - value: "secret-inject@azurekeyvault" # 4. -``` - -1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image. -2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for -3. Name of the environment variable -4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `signing-key-inject` we created earlier. The env-injector will download this signing key from Azure Key Vault and inject into the executable running in your Container. - -To see the log output from your Pod, execute the following command: - -``` -kubectl -n akv-test logs deployment/akvs-signing-key-app -``` - -### Cleanup - -```bash -kubectl delete -f akvs-signing-key-inject.yaml -kubectl delete -f signing-key-deployment.yaml -``` \ No newline at end of file diff --git a/docs/source/content/tutorials/env-injection/4-multi-value-secret.md b/docs/source/content/tutorials/env-injection/4-multi-value-secret.md deleted file mode 100644 index d98733cf..00000000 --- a/docs/source/content/tutorials/env-injection/4-multi-value-secret.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Inject Multi Value Secret" -description: "Inject a multi-value secret from Azure Key Vault as environment variables into an application" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** diff --git a/docs/source/content/tutorials/env-injection/5-pfx-certificate.md b/docs/source/content/tutorials/env-injection/5-pfx-certificate.md deleted file mode 100755 index 4d91d785..00000000 --- a/docs/source/content/tutorials/env-injection/5-pfx-certificate.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: "Inject PFX Certificate" -description: "Inject a PFX certificate from Azure Key Vault as environment variables into an application" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -The certificate handling in certain programming languages like Microsoft .NET has a -preference for certificates in the binary PKCS12 format, commonly known as PFX. To extract the raw -PKCS12 certificate from Azure Key Vault, you need to **get the Secret object of the Certificate**! - -This tutorial is EXACTLY like the [Inject Certificate](2-certificate) tutorial, except the highlighted -last line below: - -```yaml{11}:title=akvs-certificate-inject.yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: certificate-inject - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-certificate # name of the akv object - type: secret # akv object type -``` - -By specifying `type: secret` instead of `certificate`, Azure Key Vault will respond with the PKCS12 certificate -that can be injected directly into your application. - -Apply to Kubernetes: - -```bash -$ kubectl apply -f akvs-certificate-inject.yaml -azurekeyvaultsecret.spv.no/certificate-inject created -``` - -To list AzureKeyVaultSecret's and see sync status: - -```bash -$ kubectl -n akv-test get akvs -NAME VAULT VAULT OBJECT SECRET NAME SYNCHED -certificate-inject akv2k8s-test my-certificate -``` - -Then we deploy a Pod having a env-variable pointing to the secret above. - -```yaml:title=certificate-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: akvs-certificate-app - namespace: akv-test - labels: - app: akvs-certificate-app -spec: - selector: - matchLabels: - app: akvs-certificate-app - template: - metadata: - labels: - app: akvs-certificate-app - spec: - containers: - - name: akv2k8s-env-test - image: spvest/akv2k8s-env-test:2.0.1 - args: ["PUBLIC_KEY", "PRIVATE_KEY"] - env: - - name: PUBLIC_KEY - value: certificate-inject@azurekeyvault?tls.crt - - name: PRIVATE_KEY - value: certificate-inject@azurekeyvault?tls.key -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f certificate-deployment.yaml -deployment.apps/akvs-certificate-app created -``` - -Things to note from the Deployment yaml above: - -```yaml{3,4,6-9} -containers: -- name: akv2k8s-env-test - image: spvest/akv2k8s-env-test # 1. - args: ["PUBLIC_KEY", "PRIVATE_KEY"] # 2. - env: - - name: PUBLIC_KEY # 3. - value: certificate-inject@azurekeyvault?tls.crt # 4. - - name: PRIVATE_KEY # 5. - value: certificate-inject@azurekeyvault?tls.key # 6. -``` - -1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image. -2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for -3. Name of the environment variable containing the certificate public key -4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `certificate-inject` we created earlier. The env-injector will download this secret from Azure Key Vault and inject into the executable running in your Container. -5. Name of the environment variable containing the certificate private key -6. Same as 4. - only for the certificate private key - -To see the log output from your Pod, execute the following command: - -``` -kubectl -n akv-test logs deployment/akvs-certificate-app -``` - -### Cleanup - -```bash -kubectl delete -f akvs-secret-inject.yaml -kubectl delete -f secret-deployment.yaml -``` \ No newline at end of file diff --git a/docs/source/content/tutorials/index.md b/docs/source/content/tutorials/index.md deleted file mode 100644 index aca4e5cf..00000000 --- a/docs/source/content/tutorials/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Tutorials" -description: "A quick introduction to the tutorials" ---- - -These tutorials are designed to walk you through step-by-step how to extract objects from Azure Key Vault - to sync into Kubernetes `Secret`'s or directly injecting into your application. - -Before getting started you need to make sure the tutorial [prerequisites](prerequisites) are in place, and you are good to go! diff --git a/docs/source/content/tutorials/prerequisites.md b/docs/source/content/tutorials/prerequisites.md deleted file mode 100644 index ea7a8bc2..00000000 --- a/docs/source/content/tutorials/prerequisites.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "Prerequisites" -description: "A quick overview of the prerequisites needed to complete the tutorials" ---- - -Below are a set of Azure Key Vault and Kubernetes resources that must be in place to walk through the tutorials. - -> Note: The resource names used below are optional (like AKV `akv2k8s-test`), but sticking with the suggested names will make it easier and more consistent as you walk through the tutorials - -## Azure Resources - -Azure Resource Group: - -```bash -az group create -l westeurope -n akv2k8s-test -``` - -Azure Key Vault: - -```bash -az keyvault create -n akv2k8s-test -g akv2k8s-test -``` - -### Add secret - required for secret-tutorials - -Add Secret to Azure Key Vault: - -```bash -az keyvault secret set --vault-name akv2k8s-test --name my-secret --value "My super secret" -``` - -Authorize Access to Secrets: - -```bash -az keyvault set-policy --n akv2k8s-test --spn --secret-permissions get -``` - -### Add certificate - required for certificate-tutorials - -```bash -az keyvault certificate create --vault-name akv2k8s-test --name my-certificate -p "$(az keyvault certificate get-default-policy -o json)" -``` - -Authorize Access to Certificates: - -```bash -az keyvault set-policy --n akv2k8s-test --spn --certificate-permissions get -``` - -### Add signing key - required for signing-key-tutorials - -```bash -az keyvault key create --vault-name akv2k8s-test --name my-key -``` - -Authorize Access to Keys: - -```bash -az keyvault set-policy --n akv2k8s-test --spn --key-permissions get -``` - -## Kubernetes Resources - -Create namespace: - -```yaml:title=namespace.yaml -apiVersion: v1 -kind: Namespace -metadata: - name: akv-test - labels: - azure-key-vault-env-injection: enabled -``` - -Apply configuration: - -```bash -kubectl apply -f namespace.yaml -``` - -### That's it! You should now be ready to do all or any of the tutorials of akv2k8s! diff --git a/docs/source/content/tutorials/sync/1-secret.md b/docs/source/content/tutorials/sync/1-secret.md deleted file mode 100644 index 2f259e2f..00000000 --- a/docs/source/content/tutorials/sync/1-secret.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Sync Secret" -description: "Sync a secret from Azure Key Vault into a Kubernetes Secret" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -We start by creating a definition for the Azure Key Vault secret -we want to sync: - -```yaml:title=akvs-secret-sync.yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: secret-sync - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-secret # name of the akv object - type: secret # akv object type - output: - secret: - name: my-secret-from-akv # kubernetes secret name - dataKey: secret-value # key to store object value in kubernetes secret -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f akvs-secret-sync.yaml -azurekeyvaultsecret.spv.no/secret-sync created -``` - -List AzureKeyVaultSecret's: - -```bash -$ kubectl -n akv-test get akvs -NAME VAULT VAULT OBJECT SECRET NAME SYNCHED -secret-sync akv2k8s-test my-secret my-secret-from-akv -``` - -Shortly a Kubernetes secret should exist: - -```bash -$ kubectl -n akv-test get secret -NAME TYPE DATA AGE -my-secret-from-akv Opaque 1 1m -``` - -### Cleanup - -```bash -kubectl delete -f akvs-secret-sync.yaml -``` \ No newline at end of file diff --git a/docs/source/content/tutorials/sync/2-certificate.md b/docs/source/content/tutorials/sync/2-certificate.md deleted file mode 100644 index 083af59a..00000000 --- a/docs/source/content/tutorials/sync/2-certificate.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Sync Certificate" -description: "Sync a certificate from Azure Key Vault into a Kubernetes Secret." ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -We start by creating a definition for the Azure Key Vault secret pointing to the certificate we want to sync: - -```yaml:title=akvs-certificate-sync.yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: certificate-sync - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-certificate - type: certificate - output: - secret: - name: my-certificate-from-akv # kubernetes secret name - type: kubernetes.io/tls # kubernetes secret type -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f certificate-sync.yaml -azurekeyvaultsecret.spv.no/certificate-sync created -``` - -To list AzureKeyVaultSecret's and see sync status: - -```bash -$ kubectl -n akv-test get akvs -NAME VAULT VAULT OBJECT SECRET NAME SYNCHED -certificate-sync akv2k8s-test my-certificate my-secret-from-akv -``` - -Shortly a Kubernetes secret of type `kubernetes.io/tls` should exist: - -```bash -$ kubectl -n akv-test get secret -NAME TYPE DATA AGE -my-certificate-from-akv kubernetes.io/tls 3 1m -``` - -Inspect the Kubernetes secret: - -```bash -kubectl -n akv-test get secret my-certificate-from-akv -o yaml -``` - -The created Kubernetes Secret should look something like this: - -```yaml -apiVersion: v1 -data: - tls.crt: ... - tls.key: ... -kind: Secret -metadata: - name: keyvault-certificate - namespace: default -type: kubernetes.io/tls -``` - -### Cleanup - -```bash -kubectl delete -f certificate-sync.yaml -``` \ No newline at end of file diff --git a/docs/source/content/tutorials/sync/3-signing-key.md b/docs/source/content/tutorials/sync/3-signing-key.md deleted file mode 100644 index 810d3491..00000000 --- a/docs/source/content/tutorials/sync/3-signing-key.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Sync Signing Key" -description: "Sync signing key from Azure Key Vault into a Kubernetes Secret" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -We start by creating a definition for the Azure Key Vault signing-key we want to sync: - -```yaml:title=akvs-signing-key-sync.yaml -apiVersion: spv.no/v1 -kind: AzureKeyVaultSecret -metadata: - name: signing-key-sync - namespace: akv-test -spec: - vault: - name: akv2k8s-test # name of key vault - object: - name: my-key # name of the akv object - type: key # akv object type - output: - secret: - name: my-signing-key-from-akv # kubernetes secret name - dataKey: signing-key # key to store object value in kubernetes secret -``` - -Apply to Kubernetes: - -```bash -$ kubectl apply -f akvs-signing-key-sync.yaml -azurekeyvaultsecret.spv.no/signing-key-sync created -``` - -List AzureKeyVaultSecret's: - -```bash -$ kubectl -n akv-test get akvs -NAME VAULT VAULT OBJECT SECRET NAME SYNCHED -signing-key-sync akv2k8s-test my-key my-signing-key-from-akv -``` - -Shortly a Kubernetes secret should exist: - -```bash -$ kubectl -n akv-test get secret -NAME TYPE DATA AGE -my-signing-key-from-akv Opaque 1 1m -``` - -### Cleanup - -```bash -kubectl delete -f akvs-signing-key-sync.yaml -``` \ No newline at end of file diff --git a/docs/source/content/tutorials/sync/4-multi-key-value-secret.md b/docs/source/content/tutorials/sync/4-multi-key-value-secret.md deleted file mode 100644 index d0842b43..00000000 --- a/docs/source/content/tutorials/sync/4-multi-key-value-secret.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "Sync Multi Key Value Secret" -description: "Sync a multi-key-value secret from Azure Key Vault into a Kubernetes Secret" ---- - -> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.** - -Sometimes its necessary to have Kubernetes `Secret`'s with multiple keys and values. The problem -is that Secrets in Azure Key Vault has no concept of keys or values. Because of this akv2k8s -have introduced a new type called `multi-key-value-secret` -(see [AzureKeyVaultSecret Object Types](/reference/azure-key-vault-secret/#vault-object-types)). - -In order to use `multi-key-value-secret`, just format a Azure Key Vault Secret using `yaml` or `json`: - -```yaml -key1: value1 -key2: value2 -key3: value3 -``` - -or - -```json -{ - "key1": "value1", - "key2": "value2", - "key3": "value3" -} -``` diff --git a/docs/source/content/tutorials/sync/5-shared-secret.md b/docs/source/content/tutorials/sync/5-shared-secret.md deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/source/content/why-akv2k8s.mdx b/docs/source/content/why-akv2k8s.mdx deleted file mode 100644 index 8d027dfd..00000000 --- a/docs/source/content/why-akv2k8s.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Why use akv2k8s? ---- - -import { - ExpansionPanel, - ExpansionPanelList, - ExpansionPanelListItem -} from 'gatsby-theme-apollo-docs'; - - - - -## Avoid tight coupling to Azure Key Vault - -By default the only way for your application to access secure objects in Azure Key Vault is to use the Azure Key Vault SDK (or API). That is not a good solution, since it tightly couples your application to Azure Key Vault. It also violates [The Twelve-Factor App](https://12factor.net/) principal for how we should [handle configuration](https://12factor.net/config) in our application, by not passing configuration from the outside-in using environment variables. - - - - -## Sync Azure Key Vault secrets to Kubernetes - -3rd party containers in Kubernetes commonly depend on Kubernetes `Secret`'s to pass secrets through environment variables. If you are storing these secrets in Azure Key Vault, you have to find a solution to sync your Azure Key Vault secret to Kubernetes, or worse - manually create and keep Kubernetes `Secret`'s updated. Would it not be much easier to store everything securely in Azure Key Vault and just sync the secrets you need into Kubernetes? This is exactly what the **akv2k8s Controller** does. - - - - -## Inject Azure Key Vault secrets directly into your application - -With the **akv2k8s Env Injector** you can securely and transparently inject Azure Key Vault secrets as environment variables into applications, without having to use native Kubernetes secrets. On top of that, these environment variables will not reveal the actual secret in Kubernetes. For more details about how the akv2k8s Env Injector works, see [How it works](how-it-works). - - - diff --git a/docs/src/akv2k8s_small.svg b/docs/src/akv2k8s_small.svg deleted file mode 100644 index 87e7c0ba..00000000 --- a/docs/src/akv2k8s_small.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - diff --git a/docs/src/assets/akv2k8s.png b/docs/src/assets/akv2k8s.png deleted file mode 100644 index a48e3bb38b2937bc7cee6bb47930775d9c0972f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44512 zcmXt9bzGEP+g!R~C6|zp4(V>pS?o-=cr8 z{@nZQiMeLxniH+8B!h)cf)0T|uwKbZsX`#|K@bR>I4UxDhh<{o@gI;)167ovwg}T?*{SI%Z?^gZ~Hv#Df9_Ox~ z<U@*UP`@jv;$XCz2V%JGe-~5}Qi(xpDu{v`BUD0adm8{Fl-Q1}Y zzk-9C8y#ZQ5XuFZ(e;;%io(Le)AK(oO`jVY?DzKf?bPIW@X^C_Rhg<9(&K91x{BJa zoSQ#Og6;qM)#A51U3g+pNtycy@oc_F$00gBGG4%gzb+0{SVB;%--F`NM|~ zx?^=Dn@5+(D~)^aQ;F9uY~kkmw~i`QnSOa2D%je;sYHSd2waq;zMSPg*>>@+Q)i0L z`XDd~BR%sEG`F<;;OXb*w?3N2T%0I+y^F7tO^J#dg!lsLNJalTA3qX@!o$YKrkv0I z>)bZ~qzB_RHsf|)qrIaX4KBx^!+q3=KSk$3hQVUTdh6dL)sJo!+AR6&xdk@%_D`?> zdUkyhJ5EYuD8cte0V8jaeH=M+UMLDq-Ob;&11-eG!^6W49O1+6PJPydj7sq48bAFMrSQbr=!F%Q6qmoDxw`uh4JL2WJ)aX-i+b~79Ifx>5lqudV>!FA8zJ(cz6yf%FC~3y@c<*=u(#V_?1$i zy@V3Rwd7q$Pg5nj*)fM2|6qMox9Ngz2D`L;V=W=Gv9lxdJsKby`z(R@qJnN1K^EE{ zvu$g1qgz#9UvEGAK@r8YcImt7D40w_Mho51Ce~0|RCup^zK^MbT1;t53W|yyyaEDO zn}N4Of%=!DTAivzX<*ohlrNzDiidM*uLs&%TU~Nbq$|%XC$A>8SWf4_ zEs&I`j!f;G$n>)N@nZJ%RqdUp%9U(@*GMEqK(j2f9JF69EJhqPM4Q9S-Ms{i*`be} z{Ik7pwf#z7x&;sW;Qlt|5$iQtHb=iHhxN)i>)OS^sejknNqZj`7gyxy_VEh{+e|qw zVl6He4j7W7z}n5~h2Y=zlgT!QAv4xEL@d%WoAd$ub^VGFn{P5 zuMC%qkZvBeLYBoZW02m*Nf=1OR055lN>!ycft^Q~c)ehBw{dejU6N<(aJ%iJxIZM& zwGN?_g@DIZP312d`c4S?p4*vvcr;qBb^3Q1sHvU&RiLXMV~^`sZTGLLX6_1#_KONW zf{IYXMU+Y?OxcXLqMM+iV)OILu=dQn#asGDIipVvCO1JRe$@l#$aCbb$ zrnb!vX8OAte^wA>)Jo6nYq7kKRaFk-mi0NNwb~gAKCf8_+l12O8dzVRZp)Jt&r)3v zN$QiJJGCzMWpzR_BH+i<6!srdRQQNq z&m`7$_+HeVpL-aBDKUmgXPCfz@uK@3!A#yf9eN`1&5v0%KE_L}TU)e$yAVQOb?LR; z9!pImGLFv!gABE|Kv^YekVBP=e^@(B)>JNc|MkH06;yEJB`zC7UqTMmH$|EE6BW~C zz&CuJCO4&^pwRAf_Io~dVqzj?+hw`!;r@n^TLFrQ_J{+|7d$&p^8VbM|7jB=Ph7Kx zNk^K%uyRjyC%sJ{QKemcYtuNWI72vh4`-SS*Z2)*zqw)Iu1%O+sH?b3!~j2GT8z{? z`1MS(k1$D%nBo>)Q`gWqsSQiKtp3gK!6vZZ?3gFIdr6e2J_d^-Tp}X=r&l`#55Hu@ zu4i07y92<7182T`(|7I0@GQ@BwdIv<$9&@-0{}{0Ca|ZfqZKBw*nqWPI^mzTs915X z_vzp(%(tV@h6jifIGXn3|mI;u|M< z;O$ZN*RNkA!=ZudYHIb=gt6NW12;+p_}F=#M;)Or^LLoc5m72?9byPSisSXRBhAf4jJ>UT| z%vx2#B3xW2A`mfn=$FZ7sGFLSj|iRKk0N&Y;wG9te|L1-1;?B-OGt6{8*A9^XBOs` zC3ZGwxDOi+3ct%t--sav(KW(pJo0cx5qtHzN&mEMgeEwi9O-f{(o%Y{_y_?BuD8^ zhwD86&PTMsF1w0bI9C|LtoCQDmZewj*U;j^^=++8x!9kOpST-11AGAaj4M61-LF~W| z*^t2gO~BOB($eKdUnB;_&C*a=Jmw2%tn^zn)R1OkkNqW+z+Fj-R{A_8v1GXta`_Tf z3dIst$JcZz4XSdrOX;iuklg(v=fl+4Qk;yVhj#V;sn>0=9JC(dP&1Awf@k+ZWhHUe z?3u|_s6i*8a0v#-&aG@ra!2r#mK-#8on=$w0$}^g(xs3lkNhBq;Gk1|#p;u7uG&*l zR8%Yw3(OY|L43i2e*6frlmUmK6n5V`{e88-Y=DKqmG~^rsK>uEuPVo)d1*kL;B#&O zP{o>E{NPOxKw0Y9q$o~iZ?6!x${I5r>}k1L*|MPIPd%`=an5sANZFr|zW%1=T|l)f z=bQd+N@@9gQd-y6D<7p~?w#uIqJtYN{Y8}+j?gt)m+*Iq#V zFuJY3c7Rp-QJ6-F3J*ElW(yQ(v6{-i9vmFxoxIYd>aQ~Ayvk{`=aX%@+!-kP#F4MH zOM&6!%-%gBN>QDEGR;RKz9-j4(4(mku=X4;y!DH=u63$^yneEod`hs$Q-CS#)9TMv zGM)_6T_%5sZLW%yD0JdP4Jo+nd??@XCMqp0^$i4@1M}g`=%GPgDCa-$zr_i-o-NSb zc4-mJ7;7k<{nasIe%zEY^5f}|mvBew#Tk4&fVs|ED7~-W?P*x-qOWkALZp)d@|f}7 zPpD~Bww&*aRIVjeW+&se`0sy`V0LA=H50>sTC}P5Z$tst=pP>+PXuHS&}(w&pih$BuVJx`O|1*((4-I3_RFUTs`nQ) zJUDVT=^onN02oF^cZ?ohCk?fM!M`>2fBM38wVNH0C6p@XN7)3bT^Zq$K3i?Wvba@B z@L>7CPc0h;z)&{cz#^z$Ku^8$JzYR?ZrB=1>^cv|@e3Lpe}eb|{w?JK^J|eab$bns zdE_DIujS?Cf8z&CeV>p0=2ootV4TRI$3X8>qe31;AnV%SGEYooriPO)mB2T^nl)Zz z@+s8PN?5BDcH=3MfGsYr=TiN0;{L%en1kuol)3wlv8d#2vTrLsopt>fr7TB<3Lj>& zq{ft%05C?f(Y}jUNXYlEYr)O8>A?G)z{xLZ;?O-JCU~kS_ra&0-;$yROb@E6s{q?I{M>q}nRR*J(MUP*GE5F=Onj}uHH6mGTOh8C-H8Mc=m_Q&2 zBk?z*LZ-(z6y2lB_~B*T7A|ux_~ugzJKn62y9CAtdm&4RZmV4C0(#qOK0hN%3gh!UnwtZA zP4RsHBrl%E$CCIgj1b5RsJ^?wh1W-QK@mWsf8zvR_7N3$ZAQaM8QA@=INQ)B$<{df z@98N?N=g>BwhE33I5KC9;Q*oWK%J$q`ip|$AYjhwf z)`6Q^OEX4j*G(rECPjm6C9h(ei#3ny>7MDe@|2gCM|SQ#QZjaAeHe!;>5^}!f@kAbDGq2u<*`}rkQvan%l!m%)2OW z=g3iOmJtru0nRF@`e1`fGc!0q(S+QYr8b^&AdzwH~P zff9KAt8@j_quN>S38jD9gnp-84K=Br#a6|!oQIwL$)BEoL_hFAn^2lFT(L1l_s|U{y){HV_X>`M&e;Vz@-mILj;6_W$stz`!iNr^@ z_jXG~LdCCA%A z$EZg+I_~D_>8M1Pf`S{}-?wac9x%(DHz0V!UGxh-Jh^wi7Fum^c=&~wsEdEk^g|i6 z2}V=;t#kevs(e1OmAHHMRyKRff$E~ z$oGrGKAfqyXK4R4ZxgvQ;A=uT+1Va|vk588?h{Jb;Y-ZDVw{a73?$*7J=pT=O2j~b zW5q^n79=-y6YM{=n;V+qhV;lnstDnBQAi3CB>I*SWh6C?%_{ppAV()iM_0uo|E`av z;M%znO;t6M`^emRVB}_S;Z~^3e-2i@<9Y~uUoC5b|E58{o%dne=$`hb^P;0#+O}iD z{kwmywq2ry&Ue57FsKL@hj7F@%h-87IeGJwEPAvq4wdvkLh-0ZJ0qY$_Uulbo%9|R zql$e+JQxJZ9z2kE1&MdHa_>4+Os#UF&!wXWbHxobzwKwX*fNx?-vlgQ+%Z?}ef=jahXB2EnDmxI-C!S#E75OC zK??695*9wuMJx63$B!YQWgDd`?lb;V=>Ay;hVb6J2J;;Ukp^~`l@Zx@((Ny+hPIWd z$7!l1z{K%3H~+B?=xW#fZgFC#^aA}qONa$?FK6x6a%i=~mqL~X_mR5)1eQ=AyGtAg zOJiOv#hcT3BtYJW09z(PE+!9{O>?#Nupm=TwBI8rQWSU?Twb~R`cLk&^ecDZ^aV$4H{6k@ja?PZ-B%T5q52kbJg<4A0^?4 zCE=^qk|5won7CTXTYfLzYf=+GkeG$h2L)=9f`Z~>hOeYJ+4O<{S8*T-{3$rGkJD7;`wJia72sh zUzwWa>8D1DqXuiUSS~f*)c^}oWNMEQAARce>(^bmvNQ<@&9a}wq0HR~FX(_3Fowa_ zK0Pxx_n9_J!6Wm-GHuwdX`H)Yf?7waXn@v`gg*H(v)NaG*Jxm4b|0!o)qQ$WPmI}9 zMSu?7yFIiLhrw4-YzGMv_6?FmFX%=qo*{oFq51lo22gjGksKe&8P^NK68sQKaVVk{ zQ`aQtpwepvh1~mZJEER{_13Nz@GB7?0W*qcEE zVftqPXsZd|?AITBYxh18`cz(iu9rT~P%`c^X;${$gr%{2YgzzDOzh9*E-g{9&ASp-mu;)BVFu?x$J6)5dsKKLQ;ffto#?sPq z5(^vq{uIdA%So;&;n~+l+gv?1*k~EO z(E6rT_KV3|)1#b9Z5E$!iH$d+1rLQg-a`!wkM*mXoZrb99pa7n4=O9j4ZSwP^@YjT z$YKZ1H8eEt3c%AlwOJxc@I4^i3MyN_wS!W${Dgfg!nCG*okX5`+tL_}_8+77QX;l1 z7cZpI)tNbf+xJYi<2(7UG%-49bf$&(e zJ5^k8az>lr4A;()eR|dSU9n2hN1vmO4N6prMfb=wRsYU|0>+H7A@DL1^FIEu*LBm@ zB_!UK^JpRV$7}$LMy0i_%{O$f^$);rEn)I58M&4|_P7rvVLn!4B-CnD*Mso6EhOt_ z%%ZHAm#|z+6^4(tS2`8XJY)~=eh2evRZza1o0{Z=VUAE<-3lbhz0{~Rgr1F__{ASC z-oC!hz?pQXLD$*l6PrE^8J1o~?4pBj)58R$40txf{Q{fk&qyC>k+tiH0H+##4* z^7F#u-ZO5%$Tx?o)0|8wyO-i(1{=a>nj7Dr3=Su_Kfe!9M06qdmK3n6p?O;)0Q{r! zRB=hAcdUI$2`4cSbH`&EviN~L3N2U`ItTAlV=uWvWld#tRD38?ymBocVyU56;!Nvt z4nC#?JHO=*jSfz-cY!SZ%scw(CHx*udXF;Trco#MS|GwiT+SM<8Q4koSRw08a=^U! zsP5C+&~U~GiQL_#iqbn(1~yc0b(U3u|9Qf~!b00D0ELxCPvVH$dGRN9^zctk$&v^ao#!t$_Hj=AkZdpNB1S90Ge3*rW(KOvy7D@$I|W}Za7!41e*AyLtQ zzsptyB6mcAM?~a#cKbIoUCeD)SDiP$GpQ8FVW@xLjMD>@rkEH@(|D>Co-Fa; z6*Sucm!N;_R5vsPv|Z7sMSq7KeZ$f(Bo?pxIEZ=YNtafvH>$AlCg$PYm&=?;(5xWZraT^bDc%f{PJoPkQzn88J* z&ejawpLQNebr|pg0;1eSG=5AV6-q*=9?8P8d|(Ib9&bQ zX~&@5sVGj;s+d=-{mWt!;_G+)r2n4<_USK22lR<`0xTxWdhCpj#CQ08R_ZW6oT2m zNw=VN;GJSKQqRoR0CeHVCoxg2L#1;utq=lC#_^c1Ca9eO%sxAkzjh%pdYHbA|7;@i zB?qb;sO|Ah!bI5R@}9-*p)wi~GQv3iS;LWy8&rlDl|cEJyH~ldmS2#B7HsLI#+mL$ zO9TKJxV$pshKGH@$lbl{{d043Q^!}gO&})Fb+aCdql#c{`d#uRWq+&rN~3)|cojqq zZ5=eQj5ROM*ay6O>?0WEo;j5-4ta_8+v!lF7A??b@wa)H(I0s}g@f6=-y&P#CGomZ z0zzF+cA!7|u5+F-xM^+U9Tol2kJpw*zrESAkBdI8ZRM(NkwxiXwyMJBffeM$3AllQ zI&JZ0c3JJ`=+t`3Vh+mR6q#e&*s_dUAjxn<1js2Vj>zdWL?=&s3bfg4S1+%o0y|wF z?(Y&yRX?uPu`o|u^{P%tA_2K_crwd+zo(4Gmha+Rw>UIk3%M!^A$s%XDbGX6^y;mL zImD(OzKu7>YsUelZAEd;@<+B~u3Zl1GQW&_b{{WH`h!I3HwML^bA^63qLE7zZk_kq z3z_*Euqhept18UM%yDL#rwL*8?0p*L;kKJcUTHhtkKJ+#5ueXeg!Bu{r{7*x@a=bY zb`Ei6jjstMgobmwpCiO4m(FnEZf?7><_9!{ZDshO!oi-A*uEss4d>XwQXGVxyX$)G zCJdisxGfZ13;53WEfzdq-+f6zJsWdA4S%lmuIMP5Bi01C?hg%O5#MtZ=PZy+7kXvJ z&rVPMcE+=~Ubj}=oIbV=Gb-dOWI%kNf;53b?62QXt^#l2Jf%Q}Bw212_1nBZ7mq!= z+k*mvqk246(Ce1%p?sOzKlN*{W1X~_=*@dmpzE>x*6(3puk~?Uwc?90Miw_H6=^TP zve8vsf|X|jTC18u;Bq-od)~n*5O5o|t#1O2ka9_}6%@VFO{3a;l$1+n_P z_yGmwz}$+s5jFbawGkF;m6+=EBLqV%E}PG4GqtP%1|DUXkY}&bGZg%X_X|hBpMxbq zO<^HEooVAtR%taeIt=t|sr7az!UoMcMP#;V{($Aav?Pc~F&r$m(6`vRk9a1ow$+aJ zMs$|@26FmVBij7}Do01TAc%#9b*l!(u>!i@2mA@MlL7@z%WI$n6m6b#kWa&n0A0iug={;eZ@RVCrPVC`3o#dRhfhao=AL7 zn%)KtFRWYrMWG|NxV>~ygVL%johwcrndl?N?f^vPFD@rKg;t zGL%~Qz3MO-iOEv_cE=J13E~E3ArAeWpd;%Cfmjqd1XDBl;eqKOVpQzvA-(klzb2KyCdJElThm@nzEllx9g4N&zuCna> z!ooeBS;dWXil}7_$-}`^EQlOn7-_U4n)lM8b(^!`26{Sh*49d|vI_)?n4v~2=ms0) zV1kdPdFt^TUx5Wv^W$g%3qx-6<^~E|#H68io=*WXWQ#M!8B?N+(*$LugpSN z|I6)~igEkHl_3$+`fX4mky0uEiEiHF8n*AgL{zs-UGE`4vH-N&eZvi{e|7sks{FmU zOmT1m9YRCeA?=@@9B5FKaBwa{F&Fw28SBQ9h2v_VSvDPboHLo#-rw(SDdsO9&Cm)s zWMt%W*B1R!`;|$*Y9Wu2zLTL*&<(B*XMI)0q6*P$*Zc*ObZzMV;1jKHQ$oh$dVK2h z@KBki7Y8?Q9Xx4?@Vo)Ok@!yR7=D#3ftYazw2Tc8&StnsdU2|)T#*O0g)_!FPUMZQ zRrz!hwb_)hDQhjSe$b2QEPngeKEWRMBfhr_7+bfSaTsh-!djR=ymdZDJ?2OnluTuE zqJNSE_v`K7VWdef&oZ=vvWV$>@^Mo zvaCwxr7Yj}vayQVpX5?!XUguGSaKIMj6rw0NvBD?7X80HAb-UaWb_v4-zJZ_3KhEy zwg2Vj!{@L*?url}8!F0*Emdfw#)%skD`hQy_-1Y;oen`r7fZdg-`?>IxBN|v{PH4$ zFFLK3nQ%3bPE7TlYuYA*MbF}z2{aNuY>}ZwQaQ-H6pt`pkNeIGH%L6KPdzhl2V4N$ zt0HM2Lr3U4jNL2@uzJ|p$v2lQa6BD3lG>HXf?OSdVfv@@fG_3j(Il-MeInr&X3~t; z?S6AV(MnQ!BOLdIWkHV`qQPC-AW9k@08|~SbK5|{Ac&kevPeB>|9FwZ!hop|2FpcN zaXV`mq0yCjjS>g<5hlYrqLN2g_R1A>0(mv%xql#*tCFQV`}QqiX{cy8P00qSWUJLO zz={^wfvg0aHeSG41TIROg$@`)^$)C6W_axUCj7@y}xM=v;(Q+~2<|GAO?S_qW1cE5#zlESiNjZhagB9?om2qs^W zlq+aTIFweaw|2?haH?CN`WmE&RsfT_{c#M!UO$ou{;jPbl5r*U8K2Q*?GKyN1jJz? z4U2NfvOUK*8XjYiU5J@$Xz+DKP_yE1pwgU#`)A}umCk(l7Z0{ZWrO@wsFfYPt`M!9 z#`n6WDn6+&M8e1tnO?mXOya8tY%w1@{Anc}$TY7Av0?d4G0uG-!u6XE`pKe-EM${S7)@WAQt-j~J5XN{(%G_@C*e>_L5W z!Au%D!Dd>xR)&PF!HxG7LqcJK3G;QtE-|*#lqQBAA8eQ={ow`;+s>BP$%4Q86Ok}O zNe|MWFFDhJhwzj}s+qYO3_j=@CwyIHiZr--AZdbV9Kj;{XvS*v6LlVj_k*zMO2a}H zDFFrk=uCXi8IQMSdeH+n1iSywu-SqxeUel9;yXE+dLuUM>&su!oPYpqd{GWcE-e-f z6V6`q<1&TA?Ak_X&gItbzq+R>bnM zPVD~%A`Ohn5ZBIdj`Xb8wfF|{zm|vVw@|WsyW~@YB8BTtTsEUNLac7ApriKQXmXr%H141Ln~iX0SzV5by2g6-(XMx*F;#||)mvZj zf|BUn0W*G6GIMiwj%qe;8MhrXU`h~#VJ>3&TyhAtmhjcr#_yv7uO}{wmgOwobiQAY z#D_PGVTXsz8o&9Jv7}9%;qLOXjQe^BflTmVv!4JENh)|Gr`q<8YyQ5589UHpN-#Qi zI!%u3oH1S&aeWo3;ltz-CO2#THb;kVvWfsLUMX_=1oqn2p0T9P1h#N{Rq)`QTk+p& z^q-!(eQEqdGTFja@Fpu?BXc;C!8>gP+FwLKi4bbf?$!ib`pS|~c@~TOxCeXGSh4fn zoGoY|P_(X#spy?dbQX>JK2f z+5mkP?@bpJCT9i$fy3&siI5UzlOuR#gb(JjLjq)GSMM`-Y~z%|`PUA%dW|8A)jw`K z2vDpny2exSSuv6MU3&VY0F;e3gvl8dq<u{$v%@~k+`L@sZWaG01)e)v(K8Q zqqTMH6cj577eR**hTdd9I(!xuP6Y#7qur}KE;!m)CorD~0!TjH#K&ismVAr|m}m+_ z1d|sx45@R%INZ9aW7|I^3a6FT)Fdxt|IrCIR)f}ln3+JOdjqsLs~W|)j633kM4Y-M zBn8Fk?@uDMSR^9iU0DTsGqQDi?4h3PGs1h+mz75+N70 z^o^B_aR-&-%SbBef3l+`tavb%ival_E-eInxf7Dt?1Q}7AC?dK0#EqdIRCXwO4Jze zo2|1OB%*X@xseKF=0WEy=@)eC>QL8I>_|GPZvvIMviPbCxV`6`XyRBlt zpd&qKI}o*LQ+!0CG$kvmQV{O`YMgC}@bgs)s8L!&l0RZednRNx7~rWP=$==kmUXOSnxKL>!p0J+wv#iG{Y;tdIGAERCHfrLwp+PglowdZ_GuGkBrCO;& z9+OHP#c)0{#ha)QLe7R=6gd+OF}Y7C4Dgg@DqI4}`%Ps-^F{5TcU|LuQt z8AjSr$~V{{#)feGD$1aY7Vq0+9%E6}8=^^It(Y&Zny!mn@O!P@!|GloQ0ixbTNdcD z-*m~RQonR7yfSl>Hu010In#8Qby!6CV3|=$qU}WaWJ`7kti&t0)o-Cv0}*l7AjJt< zKb;?eT&Q8eko)+fyIXw7!1Mb{tipdKKbe?>g!AdpM=nLKVDDU?6mQ_s&B#7it9rdw zAgzvCoGR@a-+lL;aJ7D_=bn``UI0$>Nd#Zzx(&DLh3HwnP5H(KLyAcAG zv3`Nw9Mq1?M(-fzi&C%EE1!muYzR8gJoUaMu1Y`wV;Q%VWVDzE_XOJRs_%bS4`ci* znrZDB7~v8P7CHiB*?|c+a}~WHEoQ-XtY4{x^aeHJH~!EnHr_$&*dWl3b!ga(FbO2Y z-x=!t@T-mjBC2vP^Th`>9qw~}h!?(hE?gTr-9Ls=kHYCMWshsT5~7ndkOtucDc&BF z(cOcEVuU2EZ20rU@FWzc{6%!Ca#B)KPj?Rw%Uv(pg=e6@T!91%IGZ}xU?az%sl>QZ zGoRX*%rXUpn)owX$d1FUuI-!^;@@S{4FgXBV2-z^ckyZIk2-9M1T%bY)L%~hMD;qw z6~tstdl4kUgn!x2BW16ZL(t^kZjo57 zF_Ema&=Ddw`?%LZhspywBCvc+s)6fI@9}{jrP9^e^xfn!XktJbUlJWF7d6ANd>o6~ zL1H&O@9}*HnDB7%BoQZsK_}9-tU%JPv48T@Jl@K?%Q}4CKx`boj zV^Sa>*gVhiwNac6v(9e$_>plGj%I--6__&d^u&y|aQk0$ORL!+!DD@J05_cy+_~;2 zaEdIa z`sTBEzTOLr24n=v0n+$M0ju3N$(MOIre2Ewvi%e4S2_#!kEs8@)i!$=Vg;9nudB|Tdnl7 z4VKqp{dGiW_8sDCT!Y40nCU%~0-*~*_?Y%*xEGF1JulT&zHyN}=6xa@mwcadUUY;g z7XuF?A9F_kIkdhir}`tYS&rCYFpe9z5Aa0L`rks=U@25|v7 zvvOy|!EJ&H?K}A}!5l1_0DIk`hs-QtKAcNBhw>1!W!>N7iq4rBE7j_$@T%BDz!J^s zuk<8j!~zkI*_TKqj%1x#pWqwg8KfLZx@@{8v5;}GWqN;J4(Jd8&mXjy4nrFX@L=U- zRHuhO;zfcIw(S1y?(V)-y(bfw9eVyxFhPtSt``-@>K?m8SbRSAAlRd(?&RO_lk}HQ zaD)Z>V@9-Vq8H&iuVD6%2Wa4;np;GiR9?PXvRyzlA=A5kTi6&S{0_PzE_SFrXX>}K zQYG#nacgZlNwYL0AnG8+I-rt4;Popt7Gw>p9;6?- zd9Iw^2Pa3qsT;>aG-e@O`35pE;Ch853hTc?qPKbc;e?re&pk=MGTgZ)G4lqh1sdk4 zj!-o~N(%Mf0v5`Jn=a_n#seqCX*}HDWHKmhVk2{3di6=o=$?H3;ALEh8RxLxH@zed z$_*!VS|pcO2}PgQQM5S>zX`n7qnlLD`zb3pmcsObiE6#5Z5qn{$xjrkWKGzQ6-iPp zP3p@AP>}hh&SBI{*eZ^GO*|;Ez9%hMC2`7QK3p)Lp8U@pvbK8M1bv zIJl$<`lCC(2A#;TcT0u%JPv;5N{ZSpwG3pegpG-~AHV^+6WMuz~n1e{gmN(LbW<&%IfiZD+I@V)zMa3)q`Owr1 zEDM{1{mClBYu>6Bn(1jK}$@?G4}mKFe5N znlW7ucEIp-*N(*v%mofZs97za3&ip8+V54dC%1N^CVMUynC=N4+!h+6bWz_}ld3a$ z){)wdc`4uGT05#)Ww>yc)S=e5(=28|w8gI|v-l$|R+skjY6Mz&NtV_K6tQ0oGEID0 z%tZge@*9aiT?-iQP90ZW#n5NpLEP}zGw{N54)5*1yrt`Dk zZ^4}PrAC#aN~LF{JL|Xc2ltxMVq$Y|s*?Vtapy;Dw@%Y7@(9>D@Vx7ap@;GJFY&3Z z;)0LDBTHNvgP%U9JO7-sq|R1s`i{qAnVqm9B#Vgw=t{Y&))`NQSByD886+ndJhJ8X z0l)i`f+?p-zBiRye61?4iSP$4i$tyb;{W(m@?bt`ID4$DLcCdJN^AkxmFt+K<%s2K zWIk{m7hbf50d?=zpPR+Bn>l};lLeZ-=3`F~?Xn)7LO=_wiG#kz_vDLR0Cg`r`rTwY zPrEo91Iw7UI%euCr~W_T7;4Dx1fM${@Pej{4!FTqT;tp9p}ww91QCmh$%rWJm7^Hr z^L>tB#=;u5#J*PcDn#2}`3Y*R&2p2Y5i5D3BZU2+LTNEJ|CHWRB22FOBi*zLYH}gn zg!6$W#)Vyja=jE)uMRioWR+Jvq1(!05PI+?rxL;j<}fW%BM<3gM1+%|_pGnUGA=9O zco>&=Xizu!JiKv9hvp?4dM(i?dPJsJs*u*_KIT8JHnU{EmL^2bP_gaod4Vzb1Hn+a zx1^9KRj9BS<;4iG^an|hAplOOvHniNus~BuDwaePeqQ^dCiIH6wzeJtDQrt{S4%Yb z2U7Qsir(Eg>30hWC{C=1Erq(Kfm(BaONv!Y;o@%`cAviDS0Ol*xS3>p8l5U1Dhh&Y zB(A19E*mfe-Uak;Ez9lcuKdCT6CRxg_9om#hb9XfOKTP;Ynm8XI<+h!&>hgFZ}<8# z(CvlF=x__igMdk{2#MCQds6WHtK@Tc+=I@Q7t3l4-Xx)T=yDr_1t!~jVou0TaB&LE zphu})Nn1wl;#!CS6d)`z>bCP?4Zn9;ds+czw8QAISRLAg4 z4ZPRc6K9-uT&>B2CXewr~7q}7Y{?&jGx6I zW1`XQGa&laU%hiJJhL_1YPI_|YhB1RLbba2ZA{PO#0)bTfjR{QFhWTGP{eX*vXxZ$ z9FNfddAw$^XZDuA_5--!S?g1<*)Zumxd$^lz6RvQMbo4XTC~eVLxzmj_?u!)vLq?S z`CHpWZ(kePx9=trn(e~-gp5fMx&0u7a=U-Vi995k$>&rHy2NX5qV8)Ua(ZJ6VhJ1( z*`K@bSwDRtBL-;_Y9n>%*e-JJ2@Wyt?wi!+E+Ly5g94ptz#BIr)m?u+Rn9N=w+^-|SQ`PX!W;jyOb%yEU)gLnq-r5D!{PfG{d*ulE#* zB%?-kL)C9^Z!;$+$KWl|KlEuTpwIW}btWs-mDAx{6Fv8f?@WTEAo1|w+iIXVr6%+n zx$CYcXd>V^Gyxk}A1|;e`77qoBrgKUyzF90W)2F6z$IDP`O(>^3uobEG%)l+G0${@ z{q>&rSIF*?wf!(L7DhA+N^N4LAzK#4Z3c@g@`nzTiN}E5*EsEkRQSr^`a97C!()f? zp=V~|f`sv&V|15A$A*DdFM3lk|HLD&HVg$LJMC7W@J){`oL+nMz}Bz3=j`V2Y6J(W zsR;$_R+J)4GPAO?<(jKL)sWX5h6B}Vv7E-Xn~I4SCvGsvQ`M%w zek$8D4XnbLmjVt6Bag}VqYw%2sx@l8cJUd|yU9ghjHKF-icemv9qR!Tgr(uKJdpT> zWQf(9-)AIrLAxe0rM}Ew$v~RY@_Y7O(kmyh2~D3-n1YoBS&52IS`V@VqYQnkNf0c7 zV1?YSj}UG}Jdo(oh^rN(>PHQN{0qA{P=L-cw26iJ{GtBhCx^$=i;kV9@=1>i-?p3c z&e~VJo~jtMw)M1*D*0ReDrEF0b&L@vlpGw-mtCvdJqaoJ?e;nn`^1^1rW zXH?0^->$#a^R5>h2_#NkCvSud_O83PUnVq^2lc4$tE=Df7R|fZv5z^e1z3d34K+>O znr9&{Bfg}2@ubNyrbv%CxOS1Ul6tr(~sD@y*_N2p0z2`)@w*cvQH{G%rQ_ z99I037Yf(!tw~=%Qh&R1r(d-x2z>Qs`7pY#-`v9?z~I0LSwVckzR5osFjhAS=XAEH zU5xZj8t+-WbRR>;SPKY0#BK3EHCqKAe=HF+9~0E`%%S2fZVO_c$PEiw-e>l?`i?Ac z={`=4ERVgmX3+Ua8bamxowV@|yIO8hU4Vb8z0;gTe7&f!Q8OF5X79VY0=rVb%o&-+69$ne4x4iludv6d^s(2aTe!D3eofWZ z-YVnOrN2RC>TaBWZiyH7lX%s&dvNY8+}P56q%%uMF&^Phbg~R0_{-q^-3WYKhWS*8 zuwW0zG8?qsnqdUK@nippEL)#}8sTd5&n>;u9Iva8NE@}@vuz)iH5~l64lU8dCG44_ z*nbpN_DMMocR5h#&lzef$%TY(j(VAfFdSR88II3xX!SCgBMQHD-9${-KUq&Gsp~t) zX;i5|tI$M*4<6QqSCn3NUH>8xl!klY1@td9kj1TPn_1G2D_E}>mzX%DI4dlLO1$f4 z(3g_QjOf(y{BOR2+{$m>FIMZrVd1}?Ac%}OjX#frTw%TpjOgJ+)$gi@6otLpKyXD$ zV3sGli9j5@v5s0U8kJi}F>Usw80b;K3zy-qVsjm50ePH*tuKB-riwwI>v|MFjFu>1 z!ZOJ@Y8{9Bl@sOiWd}6uHWVjFS82+5X{stw=d$%O^7LiR?IQg923J_`Z#`s(82>KY znp85?sNy!)jn6n)(Ci^_mJiwoJQx4CDo`B?{bHN_6I`|-I+BYb0jrhGkiVqJCCw

8mKuG8Ih|CLJIIS2ToucO+V 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 W#AghIXyOd77|Q_Am0U9spa0n!OEh`_ diff --git a/docs/src/assets/social-bg.png b/docs/src/assets/social-bg.png deleted file mode 100644 index 5ca914084ee45b5db0c95b14237524d5bf55bde9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823782 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

I#%tSegU)d-Y58X6!;mg2MfTV#-d)+o zA`>m(@_eA6)Y2XTihA$NS{SbgUZ9|((kOl6UP8=W>^Rrxoe5w)ZQ`q zYXyAmIs^scHzK)5O)l%2gJOZDa}J&q@k?3)rq`vkUdro`Qny}+YmHv2rA9pBe9s{k zO~@D!LO?+1&Nr>*FPhJ-pSxn+S2~0fn(d!V^Y;=veamw$xzlm{Y&?%FC$6|^`#R8@ z(E1lVKQ)Nke7IXYrUWQ|48`aSiY>KISe-NL&SbzTNTD!irAb(LSIVNxug-iExG6w zIoKeq69Yw2KwaI>RwBz7cQ+w^`4qMVIDwQ~?+0-1CC3yCQ&Xl@|Km#EVGHS}xb$jNam z8|Rt;H~-z{3`U}2jzz6hGmxT*(YF1w%UZC())r&adynJsh=2a`pZN6Y6CNHOu-omr zV24YYxQqguX=R?9jn}Q)`5#3u{atOsh3MRC@9k%@bH9?-Ki}3CPz}R?F5p3+P#(IcfKwCU2x6amx&T^20RKBxQTB9o{|Xb>@;h)4up)Xzo!E#1jzt~R6ZMx?_bmkh zQoC3JfCzIE=S$}>XWAB)m2GR+OA_@$@Aj$*d>%25@gK-7S4&o(&Fh;_*fX%6_{EC- zThiZ3^Mg|Hn;xfh<`6sPcsxcuX-!z{8tVI7j?=a8ZlP^=E$#dFuFzk%1@l45r9y|^ zIetU}c4b3{@%HwH^ZDF8$9wzN7MoV?M-odIv$iiZh{0gESYSdO zv<#VUZjB61``SJd02vUe=(GK#0;!u4&}@GjN>}xM5g=aaq=jQJi4g-r93=@vLY4qw z2XY|>l|uCA2B(ODq#Yd5zJyqGO61ag<#h^>)O$y+sA*%&Cu?jAv zxt5CI{#+=9rZA|Jgjl1<`^mPCMEvI7RrDDBQ4u`LyBT}x3&g{JacVIpnpJJMOd_kLc2bS-~wL0!%18E-)ZiWs^wHvuKT27v9d6OiiB@M_A1Ma^*yR3C%BMaKyg?dw@}~R6?DrsmKg=8 z25J4{8X%GzRE|NYC{zuqGt8<>9OZOs#zhbD%4``p#iUysAC?%>F7a=hgtFO-x3@Qh z5M~p=OSXN>*jt_3WLpw=3#I=x_T$p|?b7GJ#(I4eHSTC!-p@l&joI2hDDrD}7o{RY6V@ zxd~aI!K7%M6m?)UY-&KGa~6}`5dm8SV3v;rQe&zfIySuF^FY| z+g#b7&!t!~1c_ACQPV31X5tMv1f^&bzXLfB8a&_~Ska3N0OC@TnN2epMrl!JpGEZ? z3_Vd*dRG-pjq_b-E(6x?E^8W_PBFU}u=0BhcZA>ua5y83XHd{YwgfQ8#JL+JC3kZr zSTTWykUE3L7GujAkT5-gIm)K_&}yZ+qE{ichid{9?II;pm}h5-Tx@?S=y6ORR06|! z59jxALKtZW3=fdQC(!;AFzf;H2qLPTx6=S=3^Yca8l@=G04Q`6MeRJQ2J|^FPG`m# z0^kT94gs;+&1r!~Oahyhb8ZF)ithpIluS$7Md5#i=TTNnBJZfD-W+@5dJXJ^_ zG}4740_tW5CH+?nnBv?1+88Ct{+!5}6V~iZ|5(MMv33u3Od5ORiKvv8EU>H2ScX)h!#HY`nu|M1=x>WB_ zEnw4gBRlWCHmZveq)YW*wtrs8CDA2aWKf+1Zkw%IQ1stJXzY1M z+lX3YUB)TGJlT7}x+dft6ULeZh3(hSJ6V5ph0fGmF!2`j&sz|`?R?et<*L=1fKp}0 zX9};@P{h4)ehD>V4|!02KKIOX?OYz?oU1g#%w}2O$iDmU|NigPZ=G`(oX7Dz!tY$+ z9%X&jIMxRpvt_`ak=V^je^TWuqQ53ZmAwafr^Sze6Q@+jP93yZphyCE z#{hd}Syb;nLD<|#^_@NjsZl| zD%RsYiekl7u%$k{*>zVGFgE(kUAtUT#7+>U&D^4Eos!khXg_(2dEQ!pLbf)d?)}Vf zZpAJZeoR4~m}d2Y0fril-^u-JL5HYDc%59S84v1!YJ4C8p=A`BXat*vb3*jD?Zowc zxhb1d>Hk&jl3UX$HneNN@~e^zMQNrz6czQ3j7^5kc(_)%L56lp81C$K7a z)%sm)be?NT!#M_;)_*M}2g>*4q?W%)MFTD;FXJ&qzb>wADB%`mO5|sg&v}ZMR6t8; zZ30!Mm&k&z4CYhn6GSn2W2nAA{`dpC-46ftU;m|yQ`2O2**C6{Pw5pUmTg=nea9;# zewN;Me~yz06?HlO#&Jw*t>1tD9slS5{2#o$ywveQ;NL#!+kKa6v#Ypii~xa&z+w_% zF3GM)LD|fToF(t$+^lN~0mYaT0C*Q;&*fUvdF_7%eX{BOx|r~FD71V@M9lANcz9EB?R#^}j%OcgZ^wj&Yo! zD2}j`O@Vj)G3q)j$?dT`C2L&Y+W5-M=lRmNsid2=MPUIfhV`O$5njI5ntkT=g0@L( zm9D7YK8N?V_U_lBHWP`Y8JVA7+t0C;{-bjaFE1|$A>jAlf5+)`!eB`XDLcFch6G@x zsAW=gE{cSaQMXBf-Ze@iv_D-jVdc)_Qf!_l9j!-KiITEO;`ucntp1o9=Va)MAPsWR zhP1-n^gv7-I90Q!fytFYBoruL4*5F8jn_!rd8b5i5n3tLjBFrP$iv6U7v6#VkQUl; zv3mKiTUxwarn|`SmP{565Q?FzwHnN8fPxu8Mz}z56f4W%c@be;(U8vkyw$d}kSZyI ziORsV!|{B=+wqL^`HY<(6de(roe={t+{5i3useK$+uwo75Ob=ZjUr^MsF1QBjpL}5 zpoUZ=rH72p?>WS}Jy9yg&>2H>&lPT9v^SxxuRQN1lwMmC*Vk^nu|XR&K0a!TMH4ooU=`9q1~h9(*|95t6EsL-0*sS??1|)%Mh( zD8HqqNSupH3&7p|Vxl5bq%w2TU;6Up3--gVp;XU_uS-#s?RfpDO3GW?xl3%;r8egp zjjc;G`qq#!bDyn!cP&j~552KP4}9radr9u{yyH0H>({UN^Upui_0Q)sy!XrK6J=cJ z_4CaLoQ?~ZB(wxt%#}55MH7Ckh*C!`(X>&SL@Oj+#89!U0TFf4#0i{HGdnGYvmho5 zoFlO5^;)nsA(4?1%cfBq+d=hf{eVQnBLes#qK@IBHnG_Ikc1Sl8m#m;A+Zv~1}Ur| zA!*;1?N;|Y&J=dDFOj=U3z_XFWHzEIVUr6}a&d~J^#G-WM@Z;eO9+?pF#(FmwZO9_ zTZQ#FLl0|lP8b0zQlJ>*iMqYEg3Cp?5d|Ldc_n13x*{o!BB5dEVoK$y-1v}O1=|k0 zJp#ufp)+UAz?AS=vr`Q#M)BoOV)=jUHl=R-pgC=FonPUcUt7OFe$@J=pWx`Dnh4i3 zqD-!_F@U;OoHplYw8!^!SJ&vNuVq+ik+r@1-io;G#cI}$-Ksmh<~uL7=OxlsbLZ@> z6>rG^Q$Aw`4Nyw_mc&?Co^P?WMG)oR zhWxc8u%VV-US3l1$A1#-X#ZIaAX2R4TX`7LLZ65X$YTRBu`84r2rXd?cthJ{w60U> z2+cGG+mDn=+PRGUr5MR9HHFCm%=)*Z=H94cBuss>NdQ*`g1QFc(iR8<9#zagYV|f~ zSRczTF@}^FkBt{{u@qT6dq^l?klvHTm@Bc-B1Hxx%&^^*dd3+AjmU(wWb4YYA5WGF zPJ;k1&(HYw?Hdk2onBxy{M zh8Cg-U;x<=r(|pnp5liPB{ICP<5AgdP$nPK^gmA9T zB zeWTvO=RLF_x7H)QwPSTjfF;>I)Aa5*pRB$;OC-MfOdmIjjgeq>|^MvxPu-|R-SYKzV?QFJ-uKWIT$%iFFq)Ypp<`>AM z!nx8eTj>u=@4z{S{eBO4hoA)*Aq0%$h#(oE5pyM>|DI=%OO)c_F-y}+$l4X!f+}D^ zQ@BGfopk7m#8Eq*seKnBcz$}q@4x?!fBfSg*gX!ZZMoFkxo{lL>NMkHHd#ZNZM^5} z=Ph){Pibei>iaJJO)FYZYYE_Mb@MK@i*11Nz4mpfEz93c`}g!qYpdo++ae)u+`YZD{*Z8_X$~(HPkW%+H(mPeK)%RjoN(3aV&A zVQaEhZ_?~#MX$L?xfW>&ePve?QW>Jff1K~1$Q}@hj@UB2c3%|K82a?Lp{}Fb=weZm z1+ZWV*5Z#dd44ft7Vnt4bFji_AGr< zcw|l6ZmdaWVms;B&cwED+cqb*ZA@(2oY=N)WB2>*|GN6HPgbw4s;6!uO%T6Zu->*f z%V_9RW+e8WyrNnKJ4#hDXcbd6`})av*%_p-deWnCMoc+1_e?iUYHzFGCD-Ir=5SpV z4y)CSvIdRzGQoonI}DyWO9l`9$Kv?*0DWT?zL)uRUZ2Y7A1O@X8~F1DReYXS8j%<6 z!*fo&xwk-()c?fbxqe^i#+tr1;`gFwC{wBQ9sC)@g$gRX3?ft$Tb%P}lVJu(;dNpq zum+PaoQ_Cgdye(WxRk-py5Dg)^-%WStDH;w6jdme=tUOsa%04r(YgA_k&@uDhwY?H zOkhC^G_Zt6aIg}&39a_LIZ}D&2$@GLvc&kX>{9T@;^~o0N+#M3@`oK_Wbl+AjugnN ztdUy(+81dh4M0)$|1*0451re?e;6Cv+a;fx5wDPu4~1MeUbJU!d|zGICj?mAZ^?*X zO--3~j7-e`t}mTY6JuS<#CxBRbM~5^G0SS#}P*bY7-Dz7P z(xr-uy=wrnNGVz}rt82N|Mtzbe}JdrUdVqN7&2u44xTl~`=cx+Twb(;RMKHF!%DwH zd8QU}f6O(A0Sb3pR-%XDiLnLq-QBLET7ko-Mnou<&fG%aA;(NlD9(4V!L}<0TxQKli14?5N7;KrhB8w`VW#g&xcH43VM1+O|5~{&gu2-=(%-tc zTpH;XwQG~Mek#96U8~ahm{M`p<3b)kyUe}^q9by_m=o~44JmdL^6=D(F%dn>)oMIO z^WR?0JqWGqE^jg9^lL(eD5=CsKEJc)`uA=9#3x`DJKG$*Cm`*M#7DJN5gk6gHt#-{ zUT>G0T@i-50d*ZI@SA~OmyjaIF&$7%R>#z3P3!wD<|oa^w9`6U>%ahzuh(h6z1P>a z0$k>^lPx$K&fZQ08^u=?MeYu(;RnG00mDlR^71dX z?Q34K@zg$ z9M=}Hx6YXYpp#wy1Boe^36{_xh=DvD&ylg0*&TY9QFYJB+KJ)(5e`A`=c)Fg=MWl= zR3eC0y7ZCfr7}P=tG5qyt0XTmDQRWHEG13;c&|R_%Fj4&U$y&4Pg?6W!&S5F{j+WB z6fSbEM@erx;_f2fq~cMh5R22RS~T?*8K?fJ$NDx~lh2gaqq8`>+U6P^spH_^WYheH zXQc>+oeWsbrq{1FZZ|$B=l)<4PZRJPp^(gxH$aZNZw z>$|ei^~*QlE1Yvs|D`d#Qo{*@vDmKXq-vA!%@md`dF74>HpnGE z<3iLi8b@`q-j04!JZIwR^eFe<)il<;l^;_C?GH2^dVjv5mCVBe^?GCYm33-5hM`_h z2In6S3XF4BS8eN11m0EuG*rH^*K36D^^B-Tw*G$)C4t{Z!2Yc{jbTcb@+a-$!=!+_ zWFO2A<@7BP*VcMt_;4khAru}dCJ~Q9TiNY9QjYBM!D!^cu|ac5xGd?4btP#@iv?uQ zR*^fwKiaT$T5A1V9qi41`I2xr5uB6}WO<@dbg)vD4*21oNjzh*GRu_=%)xKfWr12(M!H6h{;qAUzkiSkDs8&8f9)J2VoNu-~ zr2m*#6w6Hk4*hLcBP)U_kkSI?Ee6+bgZ4T4udj(^o@+;HI|gd~K)eVNTMExof0uaZ zMkE2A*esyfi>AaEz$1Syx|?=p$GCIhInbF)k&by8Pws6QlVY5()6kkP@xHrd$2I4H zwz#yWP`h8@nv!GlP&O6P%@Qq?API}*?jUjK2MyS+4Dfjm>u~II;DaIsITfXCyyAWE z|5w*DFd!uSLb{*=e>IZFNULOr!PX;ImL+f1tpS1_@Z{@cJZXny!E$hStmJVDwVPZ$ zhLd1b9p^)RM1*|t41P7mmF4OMbO1z|EfJSz=ywUfrb^_Fo#&pDO?DEUFq@@GYNyvy z0OIh*kBdpuYlTDc5)G7TTepF`{`d^!cJY#Gvq)>7Huvbojk*4{68MPraVL`a5qI+b( zH`r035=3VIt2t1|K^7mmB>WtXt*5ajSS-2=%;sE1A|6k=+W=kSPvC_Kn0sDzRZtWQ zhqab;${U5>*)EyiW^iIb0`2vm)v4*rtyjJ%P^e@n)dIdaZcGR^0Fd?$|n$i|o=f zGGsjt;!8teQmgpq(o|j0k&dx2QDyUbM$+(xo7DLh8z<+o8;t>bC{=f3tsRpsd-FRs zm1nhj^GNSvM++_LycO@}+Go=-6{~&=#2S5msjk(#)W}H6@z@<~AP~wbD}V}K>nz?>?eqW^yqmH+6ospI>a19~{my?Q>* z?WayEPAQ5N63VuhjEm?U)ChY1U(ewgoW63D;aUKaY-;2_&tH`27ld0R0RMD2(L7=- zxR_CcmG&ZiT~a+i*^GtY`Ta{~>e2@X9|MPsY_haym5~oSQ%J6n*58~%kADLtWJ0(| zU9($<6%b62{K05qaZzR!2RoRIbSMuGg#jp(568}0u>c)IQqiuhtOp?NQvx(r0iCMA z7);LYzfti7Xcci}vg}sh7wM+f<6e|S;eNP7_lh`kA#B|yl_zUXZPD*4cZxmDJsYCJ zz+kQaa%t}Gov4^_AWFHbHFjpY%%kk)4^{2iR(!*43Fs--}5@E1hNL65KuM`C?P z`+mY!O1L~BXvft@dUnP6vz51ww%{wEEb;s_?6`#le@pZQycUPs^$TR}a`ze9pIcoa z4GDC=JV@Te;NO#&zz@owMNvLo{K+TL76h(`Gk*tUJ=`YeJ=2-+mnD`jKJto}UjenBQ)W zzo#C0=-=u#wN}FU3sB#(_8h^9W{1Vml9or=YCJRh=nBng=A=$cANC&`gOi$a!A~5v)BfckSxxq-`;$^*{fV`< z$hG{)PUM5B-x8#F5feK^pjc9n)wfuLn`V+r>$21tqS5c@Qu5t5(#kelEJ5b$yz$I$ z>*-IR{id%Lq4jo0b9-s5Ay>mh@pCOeqw|RRF-EI!zta?aMnZTTrXN~rYlv3dC6ij)V=eu)7rJ!>7(%$EzXau^Pb0@mTXprY$aN=oFbHBTjg zs?P~uT|d?~(OJ^!*9)R8r@IOvLrG!%NrVGj5XK?He+Q_UjhfKbKr$V4fmLbyYEAvWCI6qa_wXO^VcEc-GyU;*EReDhXC7u@9m21beQBtb zqcNdUjMo#t^6XtY4|Cc>gr-fWQh~u%1tp-FSlf)qd=}M#O2JZEQka7%zXe-;+EYWiEXGiu zbV;3>@Ok%VhjwdDSAE@;wG3Zh_}mof7_$C_92vW2#Kqse<`dY;AsQhW1s#|&@WZs{ z*yy|d87^sh)+yooH!f0YuN+P z=X>MMae>rNq-xU>jX9FHkVnU(_UMU%R`Sm|&jisw{=x&dMRBq!K0<{*ZFb70F;0iL zGFPC6y?IUoe|w)JknpCRgZ<%PeO;?4pu1yWb2GpEcUKT`X}#QbzTsWUah+NB>dkiE zNHZ(U(hrU)fW>lYPD`Fi3Ucouunepo(m~T$tU|9bNItitX3Hl95=h}&G&=rGW{NRt z_Z4otv*u!wTBbYHdeCWiEr{wBmYlJu9bj=q=C|6*hfIrnv|Cu z#DQqMj`vxs4X=()i#-oPQrM>`lYokhlbzM&F}p~drGCkZK_fKuAy_HC1rjLL?XvVX z**>HIo|c%ym3gf5%D!>PwEhTd=FH+95J;xeDA20ers3rmU&Z9;uxJzqkIkobiR!^-O#mbe@ zNYyOEGxDYl@e}&!Q&s8uRs%4#0(doHMWglo`oIbu$QSIlr371fyE=aB4P8qq$QFc2 z9-IN*LgM3QFB?9z$oa^US0L|N%$doSIpZ7!+0Ix+No|xsChRj-Tqp&k4<2ubEZ!o9 z&~&&%=RYz1-9^4MqyDzaO5P>>Yax@(R^ofK@Vs^^CKx_cDn%>gzH zT_0<{xzsj-iDH~Ye0#P1Ln}-kW`FOBB_&xY4UCNhA01*3+Ia(% zbE`}N9NZvCdAPp_s(GG(C1qm}fE4_+h@S}OGR;Rd&;OqQwoAR};=5(zp9BcJ>{OV>$EH$rw&$*bqQ&b1haA65NtuYk>l)=DgBI0d`D;FG8@ z;bTETHv<3$c9vDHh$=FBy`6S`?7o z3U|T;khvE&GuU%y1HXu-*Tb`adWcY{(qaSe|Hsy9BGuXNXzeZK+V-mJ0p0c5qnp5> zk$u~(5GVVDhqaBvai$tzf1?0UfRP3T_P4(b@Z7jUAVh6$;=gy`xrPGWY(ApCj_@;D z{NUH>VViJhYm4v$&Hhsx9-f~~I+$vpU^1we&t4m`BvS)e6!>80hUy3EhDZ1I>j((iO) zWR4u}L6A7~RfZpVmAu2MU?M-YJT*rf18HF|g8e!L%Wam@vi&ki=G1*Xl(;T+;J;v$r5SliL5hb|J! zr#AWjAwBbnuY1#tf(=U!(PLt5^hc4z{0m!Yg8+u>G|rL;i0RXm9>0lUa1ZSRrXo#c zXqy(tiYmaP{-7la+r|R85Jk^hewZ#5Vc$vxk}3q2yFDMJYCG?Bg~EfUVHs@L`uRa( z`r5RtjT0yLjDLQ0Jbu%j_cuXk*j)jL7u9p=t5@2;GVfKE-WE5uFU@R_wp809+k%c8 z{c7HMQeO(KlxMGJS+eFqbtP$9#y01k|J|{0cciRiC$>V=d5s-K6s)#AZ@*m}-iN^e zX`XTy48+fcyA3BtYO4utn|D9EBwY`^|H1Y^FYL$baqfQu5Q<{iMvKk-cO&hiTC%VK z9sB>6CFk{azIurWUeqG#xkyaT*6iwng4t?RdM6L zXUIj+C9Cu!hPuec(aH?cx5Pmq?S(xXKT#V!8M2B6qkb_?P-FfB4#zb+dH+ghgxx0b z6i7j%PCDxzFs8WDMkJ%vi41MGj2%P}BV&!g<^ak2V$$mekpe`gtPj7KdW3=&ykz7n+Tl>Y!W+MM2jxdr5$%!Dh3@81gU{(e(@*+YTe zo&YM@u^ooEwz;t@ms5qsKga@l5w1u&&e{I#q$O4~O$~Aq;_#~aiDj7n0s>LrN2H$b zTQsxZ`tBcG_&bP*c!-MR2Fi^gD&`^x^DDaYv>om>uJ`zbFoT>B=$$#bx0j~~e!gCP z_y4G6kJURtu6y^Wlzn}t{~}DtXszwjTP;+|fw^Qhf5vgL9n{_5HF<`wEkn!2|4`wkoMh4v>-W>ko`GY^ZF>4-H&77xs*9`9f|l9G9F{8+xU z%LpzVHd&8ZO2OAK(iPs>%v-8GRf3XdexC>0*YFG^jJOHJf}>+bOE!1v_%7@@E^a&> zIdUbgIjy`?lLJg;#=q>AsWfm&PiF_uCsubCwr3#3oqr~6=$vtO&SOX+cnFCI?(KEb zz#IMiPrLvW-rD>5g-+-48Qln--CwFxTzb+=Y}a&NlXKp;>NUu%mkyhO`!gXFJeJCA z@54O9{aDIsXZ7L5mY^2k2T6GJ6Qw3e4O!=WFOPASoiA+(#H8OMa^p_2dn)pI4mU$+wH>H-N~l5 zcAAhSQgi+gK`=bg$&J!%K)BDJT}0MC;ykA)3LQs}H5R@YL=#mQeOUiAo!W8t-uf|# zrbyzmWTYRzvpJmXh!fPbP2VWJnTWyah)|rl`P1EKZqwJw>Zs4m6aPtE4a(~<{D@av zUcI$Oofu3Uw>DTZb1l2uhW-6SMP?yGOs2~;_<|xRIp{b#!H)!M^Sgrx&F?oYMKD=Z zzExm0LG8T|jWHf8XXS~m5h&B9zBzJ+3UR2A_`7Hvm|04ZvVHle_Tn{Q@5MJ;>8+#m zR4TCXClyvOg=yVB=Wwg;{ek_;W#2CDF@jDk#~8~w%W=cx%Qs4Teh=c}f(e=t7dB&$gT0V0lK^{-w8zCwF&)bzs8d8%Ww@DO{AyLDHK&97(Dz@ z`Hk5mQEI_J2IRBWD`IWldSoecx`=~Fa7?oN48fLPbz)YH6?UC%9O;<8R-SMCBk$p~ zX%51fx@Au@UA@jH z8(EGHmU{9+cXo2`uD9?38F%5YPVYFVsI{^9U%uu;jTahlD*|A|4`UE0d1}4X4q*xO&?1a=i4CO=&(ACn@BF zwINu?lp~|a+078~t;!*fK1N_`t9H5MzCKDObQW}IS{4KCPV5@p>|&enc6`E-h_tOp z$;2+r&lwXSf(P_@ z#dqv^NRY?@Ter~7O_HmDumHIg0+8cU%O0r8A`*Y@IWC@C*DsM|LG48LIz*`IZ~iihb-nIoKWVDY^zsxPZTuHa{GV3s z*RN+_gv-k2y9~CBR_Vc)QaPnvenZD2ZWqK&M#>sMv)>9PLE`&rWkF=nCxBP)Ovxm! z8sVy|t84fF6g?=LPB=7DpfsJiKWi5y<)#%@76-NS$ZF;u07A8~I;l-6rK zA%m>q44e|xqIc&8R~Dlz<7ZNdfZWTMAY4^~v{ zUJtrGrQBtS%8!ybAB*C=iUX4e_JS;Umx!0>y}o!uj%qILxuK>9JHcaQA(mOGn>u%9 z0Huh<-h*zjIoBWAITL;h_ha*rqvhU1><4{0LMeg~i3QOb~jCi&za z!-bd|k|QKVdrBvd;v5ne6OWUQn}+6)Ohs(+X!Xc+_lqc-`bw={;RH7r>{s7NPAiYD zw`yE8&v>iN+t7eguYHeOpX$zQz@Rm&-+=cIk7b_8%T%~HR)J+B(mK+`gDumK@+Xa> z7%ii|cEIO7`e~Gub6kt!@0KACttI5^**IJ9JT32;HkYY6>=Zf*%$}$0$0lXuwyp67+xNmZsr|zYx*~ZZVW(`i8T|B=R$(T1z1NG);lBdfd zk`dL|4cMWmVpyQs-nO>{lwZw;a)r(z_p^mAnwXX_I>(W@NeQC`??c>9P!;|K$~s9? z`J_e^6v(}z>^9RoK86QGCRY+PX~-bgOh&&ra+Ln#78)I1n0ba zS?036aTfl}UbMpShluL>A4{eB%a<(NB$;JRNn?5ie_93ArXIgh(P(rc%aNd_-A*!U z@r+=aBV>C8^32Vj9q)1+7u?)EyE&p9OsuWX#F?N=^g z=U*F8^*=m7-W!BTnL`IN9)>fZ-ziu*ZJjIUE8Dkp>*2DrI_l=Zu`ARfScmJ$;U*-MN!5W$tuobK9eg1 zv6OYYGAYXD4AOzl#>mi)T#@HbeGwG@MLRW{n#w>y#AJM;@Wp2=U1^DFNwCH>J~9Cf z!~QgoQOs2}?YW@vRU0YSABX+&&4GYVf9;}`)Q2`m6AH8-$snu}{utCD-gpU(V;mFw zvxf6^@QUwBcmYcFpr|LA0P+srhPRI-@7*G+Vk-#yr59FJSS@M}nU}w;&?BsY%wtdl zLN+1YXw^uqvZMs`4qg4le`_Yo63R;FyZHrKbtQqt=Gn`xvNxd@2#W(hzy0w3`akpfm`Za4<06KD+OHh2g>MCz?bX!F@!{B8kJAb86lgodQ7z~-#oO-xHl7DE}W zBS+9PA_wCa`rwLkpzVi0rmRaCc8M~tUt2;GsmI1+OG*I^vLefj2!QJa{>lF@^}rZ~ zZ3=PH^PQ>V<_fG^HtUVJCoRP$xN@_EW;*)*sNJ+Q)1>}|5aX&aVcsgE=dxYOmsY~} zgl(iY`?Kfv?oLsHY7n9pARQ1yh^Q7*MGS#wEI6PA6_NbFewv|xG~q_6 zPr}JyvtT81w;UrireCp455A$I&qd;;gv|C!s@Q|>s;NA#g0c`4HTf>TEGiXFfco!Y zlRl+*Q*?=Fu{dJMJAK)uGcw(2*e+_km_}mM(c|^s<&Lcx8sBbn5O~;1^2mA-AWVS*KxXEx7%|`$_44!(QgV#ZnJrdJarmQc6=GYgag+7UMvEm4ojePY zs=OJbz-A%6g zpo<ac&$qZ3sw#A{kOlI&~F91>zd2j7S{H~R-&~u|49uV)9|o&V)dOI&<8Y- z|A(Id8{a_@F=o*7>Ye`TgUyl+?kVOAYK+c$JyEr0S!VoYuZIQ!@dvh;2q=>>LL@cX z7XOmrm$gMd4!tJqFC;$u#@SUCSv`;94C4K#@(`SH+8wEwC+2sZk@u$=g!%|i!Z!8T}MSmxph5b=f zN>DszodU;viI+^niwoD|H!&t~!7)G74I&-QC#f;e6xT-Y={xZHP35}Bh!U;wRs0tagR zn`%Ab`_1laCo^&N8;K$chsdVL0I%bajefPxr?UC@gps1@{Ta@C{nd3bR4Z;meO~-x zmRPU9eU3}d>ytKYTdK+1<{ZF(Y@X}&yxfsm)wt|5jkO2RJbu0MUe7IVIKvFwMa%JTXT>!xD?cP3zs>i5Sn zA8?^D34D?r#p#XdTg6#;X(cSHP-JR?ubf06P*z$8ku8%mIM>WKg%Abfi6;&i!Wv-A z_G2mS6H?Uy&}*J#6Z??FRTcS5HUbo6NXU7e92cBj-ov+H2!CYE#Jp=EnRgGS?bWqJYwnt<5We|d($S~re~;{9fx>$%PcwN0kPg+r&ICbm1F zoB-aN4Is-uxO9Jb@n4t^kjMj~41NHQhJ?a4HkY14fE}ut;zf!3#GYND z_`h&F6>ce&yYP(mcE7TOg;Op%ikf6@I;G~P{^?aBM=%KSM~#a3ER?1ehliuz+lC;G z66(fhSTs<{dqRqj+!))-A=huCyl>wP&n24<2jWW%?g%$92?a@I+T|UdM;_A?-`^TM zpUx_(rj{f_v|zQbAk4iW&>K8~%C-PLF=DJ;YFq})iHj{Qtd*@jR)zp>q6Fx_JSTf_ zS9{pdJtOldJNqbCvAsiIu*-7L+E;EXazD4cE?g6(X8^5uaasF+PCB{q!SSzhfyCP0 z7t!Zr8vjgwFIf)P3eAwRr^_#3{F3n{65h#_2ba8D~YZ#Jrlv<0hA7uNX_WFVSTlZb(4XndbP>PuAm zyxf3pYxfM>w)}fTN#1(xe|c^AouwB+WQd9Mg1gy%cn_#$zM!!@4QcDxjyy zX$aFvUit^xf5PvPk&!cQ63RbSC%;Oh5ezl53?9V?q}8oU@qaBq_-h^XAYdx<6-)AF z=3UebYI97LA6l(5lbg=(sg)Hcl9zR-Fp~w1U(13M-C?~Fj}hmX&*g^-Fj>_GCj6pB zb;Q!4R=F|8{6itxul`3yP^n7UnudEtySG2RN&IolrQDf^jJWl$Upi~}M#)n?4_#)B^~CN{f$o#T@#c6asbA7(-7BPmqNpX$N7{F8g%i-l*+!lt%`XO#RUgbF z0NruuPwKn?IcYEqt~&V@~j(jRMNs>{fJC3D27{%;;49vO|6El&+q z!RAuSmh0`$n^Ki}EiY!5UtJIz=;J3%ZcB-e>QXnZkw;L$;8L(tN+_*`O|y3KAkF(j zXFr*lfxyszKlK1GpnumN2siGZox!E1rnYu=4%)V4qV={6C0coI6*f2Q8w?H>em9OP zCMrKaKeu*u4INMCI_;??_7wI9`Q=XLc?<>ip^xGG6{&w;G(45)(Mhb4MQW{oLL{v& zh)^f0pC6Grkq4(a{=(YLP#C+D)?L%C$nRMtAq^?Tz%kF}W%)V?LKt zIG3wmuIr12FVH5zvIHHii{~?`bV^5FyW&y_ z0Lb&Kn%g!BLM*f7VeL}w7IK`3w}Itqf-nE#KiI=&D+|)CP4gg|(77Z5^|fvEkn*Qx zDXn0`+RSO_S`PTLDlw?KT$2-!aju_pBJX32<}NA?N)Yk+#QW#{8x<9Q7FT4Joq=+& zRQzHA)TIAIa9xTvi$!9yutgzasQ2fEt9=Kx^!sw}6{9NSddtdfL zh#MA8;A+j+Hg=eZg$cNI_a2R-aKsd>!@xF^2_=+Lm7o&l zKHXrTJYoFAunjCB;o$cFDHjshv$VrH%*Q#6bNMgjlZN=EEki9CRM$i7_}nYy72xrK zpEI}8y>iW5tP%-g`;Jj#K4c_1Ik&95aW-Sy7OUFP$S$@b*$_*>xA$3LrLC)LDp~Ku z68;UdZs#Ir6_A3SUk{jVPg=0?vwP+{ynez;X}l3_cCwJIdv5_HvRc+!@b zo4VPx=Z7)i=rMr+(`~MygY>X52m$+ar zUaQ$qAp(Yz(0+XO&g&Lk7TgFDGWHT08k+Ud*52Nq$!>Qu$-cew_SSwj!j|77+R*jH z-PK(UdzOMn8zEXo<_(nYFbA$OU2~UYe_67%Ea*MiWT7jfD_6Y@RFnE;6WS}7=c-^! zp=1Di!DO~P^L5b6Fk8zA{SSey6NkuN1-bRkq>(ln@WZ}6$5I6OaALs@1J3}r|FsMr|%+-_s)WWL)hqd7jx9k5s+hT=U z=JC3Wqc-(O7L!}-QRaM2UuN|;^7)fr%Vh=B9f6g3sDP-@nKYY>VoF)F32=Aw*aA#)jx36|z@!*6s} z1FF=@Ihi3gO(B!)6mMYZslo|8&>n7j{sTGK2Rl$C?C$j+UtaH`lIFQEfgP>AUyD{R zk<_)@MD4KgB}ug=f*hi_hP_wzLFBZRP8tox5A*(rm?Q4|Fj2ioyO>Cn03VH33=*g6 zi~Z)uG9Ngeo>@fid{XQ74Mz~a)0IcJS|1$R?iN-3TuFm2QJzP|b?mp_e*a9OKm!-@ z4?wI4h+G>a>DVuKN?_-Qf_`M|?34T);o;yWghJ4Ck|jlj$iU@O-%-WBK2d8=+|c{< znc!&=6OaZcy{VmacX^iiGBB51>OG?NN{DGKCUzOmBKQmf*_vdG@T`OO4rm#Y_af(b1%uxJm3&Pf#wWN zHI>93oM0qzbJ{}#$S0Xs(N_6QWF$!QN6|H4ENaor6BBaV-Csxk!I)?|h8H4T)7c;s zX0}v2uqJI5PTAt5s)*C^M_Z_waK&=yU4ZC<<&>A4urErQC|zR72x`u_MC(vIh!Fhk z_p|WPwzSCLs8sNs{1UrO%bzH6=uUegEesJ*hFs5EDB^Ed>!Ww?$lS9pmk$3$vh}=N zbp7^%L+rnd5>@E2iO((-5@-t9y+mgFn4SW6;!g~^+f{?y)4p9ArjR@EMqKW+_D0!t zyfH5Sq%CYuAE3pk!O`MQpvCH}SESx@Z!HCTgmkxn-w~|xw`&Uf%!;zC1F&_YZF$)2 z7mA1|*!%hE^H+Qt=Gd8+$WEug zC?-Rn>=!bRz6^s{aXMKb^TRa!Y`6p6JTG;9YXKJ-JGeomMgsR$_DlL;69J_!g_U%a zh@vRq#}23*2xKb_E6SW^-b z24T|yevQWvT^ixCj>%)-Ch>B!3(o8P;tvFA_JI?~Dx2w83h(#E@%mh9+t+;zr`s3x z+|)Yqie5{NmR-Yy%UetRCJ#6F&Oqp|7vLqnqZ=7y7DUuQV}_m@qV}$~EJal;l|iXh z1Qro?G0V3aRskD<(5ti9kzqvRb6fgmppMinpFe=2j~XdJjDI2tshOxizEMKIQsRu5 zX-6rJ_-IEuXaJYdB(VqaEgV_d&RI|Y&u6u_9=_rlHyEcrdSo+GiiJ({%r6Ez6h=K( z>BvyZ=ukv>MFH)4&MfrmTkD9hCSct2GlGb|mo@5fNcM$bbj^ zoO>1$rbuG+&PJW2ciH{KM7rQ%7^-k^rZgluma`SG?ZJE4xIyw)>6F1iL&c!1Pi`07 z?jf%(pI#MUhADX3Aa}qM{&Xn#)#7C;eF{r0;y~%dUXuygJ)nlxnn7SG5Ulen2E+3ecPA5%l;XC$Xf!VYOMwykvPxS#rh z?RyvguiJozgetOo05Ew@`$bSGWoCdfE#A2ejN&b7Nrpie+BN^gRv{_Ew`kn`PBEE& z2qI59I9uJ?ACaPly#Agi>2( zW4U>$!cyH@etk<|bvnvEf} zQmWF)ynU#BR7E4`;qLXzNT;{_UdWTrYQf&gG@{x6VB3-Fe$~v?-lFe;JpDMwBVn5^ z-~*C%soaXYLTlF0Veg;wrcJPp)QG8R)6qS?QP^6#Yd5Y1h+Wrn&M#*Nhxo`kR#59$ zi((>cgDe}r%o{i&81r?N~Oap{K(DLaH&qnS0wX)R+G(bBalovL5piP~t{i5glXMbU}yG(&l4DgKK-zNd)sq^~MoYz%UPy?B$@)d)Y zb=u~!ldjXh7r)s~-+|Z$aN5BQ>IRy8K0kSYIB5ocw_UZ*?Kd9b+dQ;YE%}y+ ztH(0JZ3V&W_MkkI)Px#^gj!=4Kgd%Yya4YAEhZ0s7C#M^04z#I_~S%~Y^T$b+8hO0 zLb-&jC$I#C#(M2UMZpz`y$t#5mgZG=uW>B%3vQ4bMftO!^pQSJlTJ=aZC!QOEa*D9 zJ8frFwe(Dv_Pg_5XplwFmaB_s-Y$}wFyj8Qx=xEHZK@r<+BFo|^KghTEm?l=aw z-nE1zka?72nUsx%H!gl!nS@`bt0QbN76YR>u(3jA8I=kRR*@=MN849)a}jAr<6(>8 zJS$F;O<1$?Z#3s$4SMI&veG?Cu|n_TG76sKr8)s7!#}b}cnFe>RAP5|pE%NLcD)_I zA*lq;&@>2hM_Ftg;29s5=9#+1-XL!bKIS3uGi1qc~V^s9|oxD;|O5{k|E%Dv7ii9mSm_ z0?r^qdXH+kgq)H^nk#d{!oN{fCk16GENK=TbvjBb5MHRKQ)!`SNE!`9Z?eG!6P%$V z`=C9(?y+{=uTa1Qt|8xJr$ZXpKsk)3Ew7+f`QEv@S7xp{eUfIvcD$pth2MVB!;h5f z33!+Jik@tRGW?cWHQ9FQ33XW|GB;~Zl#qsATLA3+r!P@~dHlJRn6BAYYt}8-4xOKL zGV@7)6n?8w@w`q>%7~O4oAhmTxQW~y;F4xCTC%E-kyEkIZYkoN`(w7vB!VVqL9k!1 zIZ!%N@p`MIf$@9{N_DxLGG)wOa%{9FvL;_x6|-CM;A#CgQQeK$I4P(-Nv@L*KAdfrtS z;mX?zCay$IMb-fTyXh8LP5c3gRf|@_vmYh{dGgMGgqrhV7+=k^I;Be#;RAii9K#e) zpe$l!WqNOr(mKI~xl)C<*@r2{j1Bk;(sVhKJqRrzk3%6)$nRk2Sk}hAT__E#jb)rS z3!Ko_ITeUiC>b!3Vl8|`eWQr!vYgU7L*0G~u!d7YHajx*^^VNf4T0-fIS|kI zG?~{M2@$swtKSRy&vG+Wn5Xy{?Qc2c6PF#=G=V6!Jx83y>)^)@S?mP9FtYR4Khcb= zwpIN#pJp3l{Z%T82$gJ?1|PABEfttlAaIV~K07tQnOg2jKnkmh8euv?HR+PwDTa5C zMYQcj#uoK69Uw;USGhLp>0ZT`u^p=cO(B)CyTQ1O)Zx!rpqFl_>?J> z@upP1`nlr`xw-VhoqNxn+cc@TxaWEn=NaxW<)WYR{2mG65nIz07IvM>jC#NTDU0V) zT|cMyVpFWb&g^rbdDAm|0>HC6>(uD`Tw2qD-C8JoFD_{2ytU=iY`$6S9`w|M2=<=> z54dlB`s!IgSk3u;Fopr4$t;ki9@bN<(;S=rwe>N=Nd1lk< zs^!3nOythW?f5*GdAac~wgkByZP8sO?YXUFb+RmQ8L!@sAZOMvJ?Rcj6inDxoKbM; zn|V4w5z#rJ2?`*$`WL2f-3o-{Juk@+yXRwO@?VatUy7KRr|86>WcgR4k4GBI0K}8+DV6SgaE@NYM zl(CPg;{p;rm!+QP3oE?v0#05hufLY5maawaN0*lA;Qp74Pummb7>76H|D)-w!rE%P zZjHM;6e#ZQ?(XjH4n>PQ#oaBqYq1x1D-_qD#idBG6bbC~yZ)Uk$2nOmYt3iOG44V2 zLCK#KDk>&+;%|W38UlXQe|x*1&#n5GS6+Qx_5WH&TH-)QNMmGepVUfW>}v1vox<@O z=O>x#1G}2@y70xtXbQGCL%CF5wffBj6L|ImBhQ;sDbwSU05trUXQXT8CD>dStj+@e?{f;tV<`F~{()UvK}-gz;o7J>iENGQr_fle(<4xP$ox3|K3t02f4Zz5_mN@{Fp1YB-l4_ z0BzV8)VQF%gr|BjqpSmi88uy+uL?)!lv}3#NolcynQUh-43hhVCZDhd`h7{@mDHXg zH$NTC?PSWo)4?Cm$D6T#5vLwT7sAxQ%9FfYp{wjGa9)n*;${sBDhdAjgxIbxiTqEIM;(S@Yv3&U5TDj1OaoeoBFb{M0 zp!?x|U$|(Uy*}bl(DIH-(fH8-wx~~e-uBw^|0P&(n1kLw&_2&wA;I>U?M33LTB+@9 zu()A7mPvgpXiUO3;jF#JEx)QkvL3l_x4Y{viSZhL`IE5hmQQ1|+hQQOXo2XSAaKAK zaGWXjEZ@RyPPJBAfDlvUl}BRqI+%z2Wy|d)bLtyqj>8xkaZL7-! zOKJSpR!{XV0_{&aiMttrw|H35k8^E^lh*OF zuc@et+_^ECkB7PGoxftys1kqtty#rJOyxs)M=vu02jJwq`{$LWCCtYGLxQLXJ6I#g@tLZTT~ zx|04`+|HLScos3yx-b-t9JFztj{HRP)R8&n<4~B1c3BslVN9dDbcLb|MH{>aCzt<9 zQ%^q=N6v=-sXGeIu*ikdaA={2MA<-mOc$;aeKA)^o?Ry_#US$*b$)>JI>Y??DMvuSJ)-EW z3>Ap-msLohJlIv%uW_(Hn1#us#B0AZNA1hkkDcfTxq#|jknx#d=LJ;OeWUhov2_X1 z?kNFN77w4CE1r5^ip2|Oove8+oElznNGSBKImO?8nlSAbNWe->6ANj;zv(HMdTY>y za5i`r;I|p_YwU(|0Zj~X)&Iu;urmkJ2-QDXo>y2eu_|#GQX85W(wv-jTD4GJNDd5S zyPt_&+A>Pt?2n2a9i`qK48??kq%NcXop*eDQ5exIe4xL_T@rvo8i%9&`m`0dq8(iHja?d^T@j~7D7 zF9RZ535u59+vnY}F|5TMk}aB0jWh3~PR?|wTFV*J9I$hBL3|;rP%U;q4&5)`%~FyN zzSR)uD*-*#J|(m#6w-e`W16%s3)B9f$|3oZoiH8eW!W58h-GcaERYT-0CiFh#}ee< zrGryO6YV)B=8Rlj=R^z%>=cws%PO^Y;kqfg zK%-;n<3YXtdi*HS@Y^+UGPA*U%bZl_MK*1Mt(lqzy0KxgCc)ZgM;hG<(}b|j393;k zg#VJ!ZtfC5N|+IwLscB^l+V9@Md*+9rJoPj(`O)g5V8}}%ZjhAecd>}rH9qmf4POx z)jt1>X;69;7;>IZ_jn?6yU9<&FRly<8EA2ClP#;>@tYBgCa&d(?s$ESpRRHofdGrf z$7R*tpRR9K4!&L%oC&Ui5L0pOE~*V^JZ`$>8Z_Cn4ED5Y^cUwy;BIjGy*>q=w{~>k zeC`hanhPRW1)q4!JA~Y!Ke;|Rf<0V><0C9}&cn0C zYigr#6`xQ|i_E!N}SE2LpM&JHhy_Hm~bXM-?(pWj&NMoM3&a;IT zkg$OQlPVchi!|N?dpB|jaP)?aw| zXxM1WjqGy*q^bDv^N%(*&`swM0>PrZthrF>-m(;jW50?-P+<{w3800P>KH*1Q>+c$ zv!tj~Gj18#wMW;QL?TPT$u+wSW9PPx$6AQ#EQ%S*cyyTR8(9TZRt`Rj=w;kbPr z$LDHig^DwQ@0tu>4^z2k@-0F~;aF_0mZ`RNp|zVqaHe5rP!tLq105ZJdOb-a;HX)i z`y3Ffk7^CoiPnrfW}xF-`&46(buAb3I>2*LySII{NB;d7-U5I3Hy zDZ&7pU>%0tT)VqiUH{X4{j0n+V5VUJw(FHU`+21|>G!ZLD!x;E=xp_M&4D`*#}z`G z-KYTyq;tobQy0)HPG|nbA8Yc0OjlTgT1Rz8gF5Ar)9O&FZAa|gnLKLwgJu#|Yye!f zg&`%*t11%;6bizubW0d2#*BJ^tI{nY)~El|L<9Iy&M^HlU-bT<;1$VgMdfR` zr+1{dmP#xlbh`c*L+(B){|Y9+6Z82S=VbI>l${rs`NZ(oLPwhpU#}H?zNgFL@ipdS z|IAH_7sLPyW}d|W9VBRo73A;U2iW}U%@-e^=!Ap>nexxl<0gN$zdXrf&=s~x7%BB7 zyV$XZZH5d+Uw6wtiYOs~7DkN$!90Xbl%BwM_j7k1!v=?ff1@Pi0P+=5t;C}$c)PkA zn)v6s2q{JW7O( zS`Qp}!qEQ8(39#YW4{9Zh0&~>MeOpHbCJ=}PQEhMBiP((s14jXtl0 z`5TjFLyZv|qTTB?US^5W2xluSEs48Ay4Y1kBIXJQMVf|wxpaUQ&r$c8DQpKF3;vb* zq}=yOJebXAhFAEc;se7aH1o*u>Uqj4g}{v}`&m`)Jtw(M9NCYpRd_}r_mYOL18aPe$j~_oDnrmQY!Goj^#zi|O+EB=Xrpk$EckN`P6XIR&s6s!KX}`?o*p zw_sxAJ7l%NC=v;Ew*e8|XE-a#46Gv11Y-<<*A=r>Eoq20^s$(O(?Ob5BjL z+cs}N?uN$D9IXHPeQ)}Ecb{EM4t3i9;?(&?LG1?28)v*bFCi&kiAiaPrukdY7B80j zyP@XGpYGsDZ;!w{_(&%!+tCoNIy3W4@2Ug>GHTcyI}+TQo$j2p1U_ck=OUoiY+58w zzte@%md?a)_=uJIlPPNDNSN_{>vurWe%{TR=e;wfWA5hfr_1~yG+ivig=|)-{e(ALok44u#9G@hf-=&@tHy63klU5T#R9m+9mS;OE2ar@pyZ z<>36nlPJU)Q-SkjQf73WsM*c9c#-i{WI}W_N5H`muG>aOS$4d}%y#|8Ok9*mss~Uz znkX(VzI_J={u@318yJ`vA0My!6R6b%#!WsHUlRQwcfm668l0Tzptf5aBwr*e}# zJaU&in>H(XnVK|v6LC5kV=S6OU8JbJEWe*Uc6WqSp`MuSPv~iNA-C%)U7~|+&b#9w zTnJ9(xT6jbS0L!lFcW^NT3tTqpItEI)m2V9W%s9`3jX1HN=9T%b^BxYR(kMugovnY zy&rQx7ihk0EwIK?Ib-|jk`@eMZ-uU@w_ruD-ZC{e&17EqI9vYpG8HfM{1-rd%y9U55HB z4?eP-np(!5sQqY!2$sT4IJIPG6^WzN2#4=%aRku6QI5Gw7udMJ=`7f1^j;Mj(dy%n zwOd<9{yaSf*ZI0nA@8nWwi~QWzY33JC`Xs1+PK-sL?yBy{K1+w-gGQUtFbh+pIzs+ z^DTJBt$9M1o{nL?50vA0%j=SCJ$C=4uLZl`p|GcY9B9_5_=1MC6X^8TyLUg(3(lPv zO&&Z81{=cqSAQ>Upp}r1wyCoW@b`~%%=f(0U&Ogcc*2TTzUqydyLxtJVlN$tBPe@B z*<1r2lU5aI16|Mm^3^(pc8P(rox8+V_3&==;I6VCSF?SE5i5IXw0Wh7LZ@wRYeBso zNpd_}?9+u0H=V~%-n5G|vvlG042uyMY`_8dXJxT)-6=68E1}tG^ScNd-#gLDD9<%)wzw0SkKf0J6>p-{x%~?g)H}`rScZsG;9-2roeO(e z`TRNM)^t9`06ys7^o#1*Uqfv;>hTn(Wb0yKbQ3ZaM33JK3n~_PkovK(`Z*qD*tL?* z-?fuzj+L}H_D*d?sbPNQN^Ejc$sv8VI~Z3{w5VA#VpD4j6P371@y<16c}-EG0N>59 z|J(Zh%gx&J#e30^e<&UProCEXOzgTZcy8crhK+%`P{#~3s=go zKsxqptkX${7`xK);~O@zr1O(sd{sjsj1I7$ljMlruf~&=*En)+YI-z}GLg7Q$6+ad zxlS#NbQFF3yDXA+x!`Q8>{I?LCy9B0>VXE6n;^XF(mM~vhQ`th3J%mE){p?*$~Px+ z3)8NZ&Q(38a#oBtzR^73u%oV_Y%3v_wQ6W)twj6hqk$zoiAQV=lk<^Pvi`NP2Oq#% za2s76p(~<4O0;rnNuZ2!@>aP9ctaa0NqTkZx9!HAO3iOsX>SKF1aIThv#P6Ju0E z?C*(+>l=p~5{z~-tEyZjS1It%8oORe+v){~w&0w?A&T@LntZZtbdId3-*Qj$g`kbv z^cpr)k(i@(_S4yDDsG%9l`7e z7S!}xCDRyY6?MMb0QKa_*nhLfzl#WQ96>xooy~KC6oolZXS8L5HV02B?VA#ZTArQY zpjwJjaFZ%jmyzU)q55TG|Ky_Z<>nAAjry2-TUIsj_I!aAfSp-o8to9#qz1~ zx+u8V@Rn^5k1d2pK5TiQc-3w~q^RP)2Enpn(oc9^rU~^!#Whgp)9h3zbS0Mw$fh+k z&Kn{#^zN=LgT4SSGcMT!iTH^4XKj~1gFt))$aX!I!m z;+ag71GE+$-}w#6k4>1hiGl)7h@f+Fzf#5Zmo3e$g?0rv#k;5lOi~JKlqwB6WYEDc|yZC`udhb|uxhB|9)Me8+p@sIM-}Q5FCdeZD zLs&6KmR(=9c1I%&EXtOi~A>xtkJ! zsqWE_wV({}B{OZ8q*t;>#5bLKn5P9zo+vU5F`3au?x5f8k7&n$D78%CLbg-@<6x#bwlPVyB2K%eqzG0@>QyLRV9;8Ck^Cno zmEjf#edlMC>C;LD3zXyS8njJWfjgX0EP1nx8HW5}QroMVPK7nYS)(&1MGLh- zdOfXfH)nR^c6XbvH(0cQG$4$B|Cg^{$9e&w!@KHVUr#=nTtDS9jGK}I0HL$Kb6`R4 zTp85x8*ZSb&BwdKmcH?uev#Oc$SXvH`M0|H`}Yqu#<$U`_f+hmI5U;R)+2A8?#u%m z%`w$9^s-finHA?3ZUQB~B)Q`oT|a#uchrObXf(a_JCLk1RO%&>Me1$VFY=@qS0#UY z<_b@p!5t(a0ZnJu|U~x zCGY2+^bYA&)Y-FFbDNaPAdEyduv+$s$&W-e%F*pbLy++GCLB<2A6Iggv*=P**mJ}L znubkN%2itZi3<_Jnalgsr9VfgO~DEtVkO%fhEF=*&~Uc$bof)SS?A6o?w#Ui0AD%Uk<+7!D5SC==VVnpejzs$1?EZSZT+fSdrpX1YV^nwk1o(V% z9Al*n*xElNLHWukxlNFsRD%+DXk`Oo__o{Xw4SAB*LBPH5?YTzto45&R{#R(u< zEEhMYPW5EmG`B1iZ>2g+_emWSB_+NS{F=!E0EnZwG$@gn)-`x$UL-pL@_42WNazr< z5Eahgs^>`=%Duz2Qf1P^eACBNQ}&sC$y(+7cMdja>$)9?6Ov^ERjNCuWJA}7e-}ou zGM(yf8c9PJom-VlE@)-SG&~4y2`_s?Gb#3o=O4Bf zmfege(bEodUrFNIcWyvC5$#%qUmFZ0)^ck*HN?A+EiNxR2eMv1v))hDW=-gHsy84SjsRX!IzWgMDH!DY~dmSh?grq973HO^b}cSq9m zlM{r0f(azO-U`dC!hjq1uGguDrNN%+Go-Y~a6D>QUl@HC7ENUop&=U>LnC2RtEy_- zgs$OzHdMIKk#=$agrMKT3)ue zFJ9G)CGdK7un4F?@sndqD`b)yN&^w@gA`M{@JrC)ZF*DVOqQGVfHt!pZWrRpO(XgA zLr&<_h&S{y`5sa7707PDQS&~SE4JaIFGrpOGHW>kOV)`veJsP@Bi{VUBX|b)@KJPB zVbC7q7MfK$viizx76??Ux7lM9ER0K?U1PTWR=m1n>NK|K8ah`!J!>MFx~?XFhSV(L z1<}>f3e&v=!DfPf4~*~6qUuke`k$IKaoEs=0$*j|4<#Lg zOePTwhmM5{&jcD^Hg@=Zxcxp}VLvmSE!@w(I*o=cEN(DokV( zB$@Z~2w}GHnop-zpKqZ-F@Ov4xnG9Bo2+MEdiNL6|9qwp2Q3!N?m%!teSLi*)S94D zZCvu?gIb`sKf5J&eQ?O3(_158Q=&|EzY{5emkG>QyJc2xznsHR5~#4h7@YFk=|*hp zIR-J>@yc$oAF{yzXJHI^J|+|q6Vp?)tOwOYA7J|g28xp$U1$;nC@E|ZSyz2R&_atA zEEQP(%4BqMPC6+vn5tDh{Z)0^7(g_`5EyMJ&Ak}_2$m|6zsh~e#A+=h4loj(u<3#k z6sQE*SKLeSn%81|Y(&hFel2aV&bm%gS&$-UG;$=4RH9e1g836$A)V}Gwk)UfS_G>e zv)erhl;B8|PPRJ~Zhg%iQTEhu47Bm3o5-6+>1{7rH74(y{qz z(HT;D80CibMD9A&kl})A+zbEx@#|8z=y_xo~=j|@FV!ba`cS*hf}V|-rextprqE$U~{<)aUSbLTXZI|$UZKKvH+11 zVShQppET}uKd2dpw)BUn^EJwU7Bx!PdN27fnofQqb+rmc<$b96+V|-Gm}`dCC>z#H zyR`LuSJ_!PHs+P!wq-AV+}m8>w(Bs)BwaDfEHlD@B+SIcJAPR~+T&I>2ON}9 zy05aK3#9hOB^PrxS|YOd@0s2H%we{8uV)<}ObPOVgC)&)E1?mt`E-!?z3q!HvvrkL zAmpJvHEo^*aLe1Pt}`;BfD5mGi}*W~hbEY+)Fd&JA@HdN2k967nUczyV+7@_|& zWGj4nK|dW?;gOtcammM?kptQ$n%%uT`y%PqYhmNcCX$DW8Zd#hN zqQu;02)?uy7tTr6?pp@>hVpM`z_^pxmuQ~M5-eS*6gNP4 zM#sN(8C3g4YMvByx{;&Jh$ugm!ArKs+B4|-nQT!WG{^ZOC=~@5*Jp?v2v$cH%LX@{$n_E6Yo7ZN6EvaorEpe{^QK110OpTIeUFE2 z=LhcCt&>M|q!sqnz2Ys<$|-e-SlcYn#|7rUEV}@=FS}FXew%Zj*Jb{=J_~F*~hAj&~=Is zc-zbB%m#0trtvY7ieh@I;}0%|iXiF2r)5&4D0KR1 zq|YVwv7~{>j;hWr|SC5Q@^o9 zBvokW`?Gyt=m$9_Cg$i!&o18=k?g_3Mh>nXsm^-OQm#&hMlefp4G8$WfRS4)Jm>T)7SB@5jiRVZ|(P5X5uAF*il+e{5g z_Sg+}Y++qXoyJ;RLfR=&d~xKq`u<}EJTT3grF~&nN22RA9{q>40hmemDzTGlUAe{c zb{q0u{iYJ7fkc<|>!?r0GnU5^c!kU585%AzM`3<drs{R zs!%zY&3g|qt^irmq#8^Msi!L}7z)aKMehz6bkO66ww4@V>|xUS?4Pvx zmp^~7Wu;nHx<4fJaG>Y}Ry?FjskvQ}+DVye!%eL{+i%yJUZ_%cfwtfldc>eWQd7I_ zlnZu)qRS2%ZDp_d>3%AU)uI^G@zCSH0`3idfQ(AJK_i?9e|Ms0W|UQyql)g^;BHBr zhn2U&*}EI@dsryLAn8e)-?3&MGlOMdRb7~`Q3i%f&tytG-azn*#R1N^1rju6RKx4* zpTkKMa6QQF`~pbhp={fgN#h1iB@T$L+-6SMlgpSZD^cLBLQ3v;s9wLS3b7O{yotjpz{+z1C7$Wlk5%5rj=i@!d>9SI$+lI&h}!(z?NsNC zuyklbl}^VbM2Sqz>+}hRQZgEwqp7Mb+OirY#lv@H@e0G6;Xn$dNVi?WcZBUNl-n$0`ilWp!?)SKLy*o!yMr1Aa8dckhaq7u`V?K+ED- zBe|Czex%!%KP{#lcb_IhtH1F6Cs*ii6#2w^SRpz|kZBd!HyNiz*VNsnDUq&^0^Ab& zixa(JgMD@Os+JtzR5o`GnQ9>W_u3YXQ}6<)IVa>ZSX2ooW#S+|lOWaQEo89yfJQl; ziN5344?kA;+qH<_*eF4cWF6TauHwdl@0|wipq;aK`RKTEvA&L^k3^ml^DgnJswwqK z#5pwNc#J2XJG}HM{3ABW+T38d54)A-0yJ_|!Oih-<^a7~OCoKC2cBx$~v=}6=mwhhI? z7*Qmrn^VYClr4L6{gD;0f#lJ-_+m1>C@|&lMD6<9a@*};pv2;(vF-wBj43 z=_lG`Fe?QS{ks${V~@$DETcZI^eP+tU@Q`i|4HpUmd=IfGAj*4`wTEy0rEy#Irfyn|m=frGyF z&tI%F_J0NZQrOlIt-XHs5)$ZIhx{+Ho)Yi(U{@S$W~BIq={F@X##Mfi6l!QuovWlm4A{kR0#-rQtHjSEigtwDF8P9^fF zc;Ij#%3vVVQoRhm=VdV)Mv|OCe6LJy>u8O^>W-!7SVhtnk}ogFN1%v!l~H=2O4e1E z&cXsZTgzt#LEG&H2c8sy!&8UdhlQchK!3T8OTmm|qgPkiEP!!QD8|*~+PkTF%?Fr; zxRs~a7~NtKdT!DgX9GGM7yg*XUtkcn8~IOIqNjQ^qUGQB&Jx>Y&dd2-AhGk{Ixv}l zXT&(L`xxA(1Fh=cwCrLQn*7XlmXfw3er)C{p2T_Z{w~HU!^Q>;wKouwasJ{0qm~iK zzWUA%7Mt&1%XhoZ4>m;6=$tH!hq^w8+5)xWCk4e9U7x={4O~*{TO}e<+8o_LlpkoQ z-W`m|!!Kzgb&r-tB$H`tJFx+QB7kwXk*}iODV~ zo)LJ0l@-m!;#3sm{dlBKly#*?@}yc7U1)Nvpivpk3@D0*IYzI%@aK?ne+Uh=O5(1o zeUiOV_LcU=Yr3g(uVa3kl{?Jtk`RZvUFy{YL}+v^zS6HCn-%;c@NAKV{rX-?h4~O{ zmaOK}+RPSY1|Q8YhUxP%x76Qx*u&4x_A|Qt9oR%{2Yo*5^-$yM2jPnM?i}z2f`IqX zz{>}qlj?wVBRWv#_n)r~G`&Eo_DWxq@1M$#F7wHVg9o$QT~mmkm6R2CSzjMq)@rTm zUH3Z1{xCN1oz8KZFAjak6_j&gHZ1-6uddDH0xz!>9}X*%;Wtit15#Dc6#urW)#;e4J)};B@1QE*F#rUxln5%s`^TuR#}iT|X$W4=O>!{W zs5XSEKHQH`*=E56Q|oXM!slQR!Oad7Qh|?jP8IJIObqJyM@;7z!AVp7mqz%Lt5l19|xloUc`VXGpGbs+jLaQX`55g$lm*J--0 z(Q(CT?7D80>Rxfvo6SMK<6htpob2kF#`x0JKd@xjOq>vih0|rkWIdr{8qxO~*%9cHyM51WkZjK6{#t5+NzH?6FDT!C)M@wepa!v`CPBfpC zUDi6sjsFy;$1jN{*Cbnt0wDPeZ;9?OV}%TG30Tko(m|E{g%spm$UE%(fG)# zVUb{)B6dgWj!NO5W%N{TM#u%b6{MgJxG4z2QUpPRUjSN4;S zJ^7v!v6t6J_3XHh`2Om9tE}&F<{?2sk>-NZ?rYQR554U4-RG{dkgNA60ISvSXEl#sM9hai|A)i0rZRjpAirpst%7oYoi-}2Xe1iR>(jg4;20H#t5 z%^k<Uqghsi<&ObdBd;-$U!Dr9wIt1cVm~n%*FJOTD~Qs$S_^2zN*P~e{lNVlMQ0Qt zmWbfWs%RTQxK@Ic++u_v%Bg2jBDWaf%q6Tv|8)SbZE0f$Vldt95B&BoKm_R|o&7>M zBUTy;Lb?5zJ#?M1XZLw;T*?eO5N&ofKTR3jt(xs7xnBzT7oz%?NnNg1&wF`Z5t-s? z@F)VC3L9?|6*VIDJRw+{)bhA{*|$fmebUSHlI<64*e}vNW5aAoi!=b*U7KVxeSMw; zj?fCEKY{i=;98|Cpw#7&vn!9PBV#_dZp5&6phxd-DJJRg=VMncS1Iz7c;Dv#5?0l2 z7dYBN!FD<5d3_HTDQ$xjFY@x(9lc?fSk5FRU7S%~Clnth&Ns~waz)NR$1&M07T{qA zC#w-hmfr*d1}i!>oM2AaMbejKlQjK8rlUooT@{7#uuQ(F zDj`DUsgp&3d<_rXmYNE%=bSK!QEuNZR04l>e zLF=zgegI>Xpx=I?BzC>?%geZs@Y+8Y^*>d^LqLZoUP2PaJ$Ql~#xViI!`iIpCZxfU z|MPrwkqhbA&uA0lcve+QC440EBIEkK=sE$X=mZ6;Bfk9#;S+^e6>G~H%}*1tF;*o0 zv$A}Q$Oohg7EVXFJccX*lTiAeFf^cA5UOC;mAq0`c7nKNWZU9)GxD_(w#!jDjSlK7 zycg4(O=ZSm50o6LEz{n2ODd~U=Q-#>1DuXwd(oft!Qu43`eP8v35jN7 zm^J#XXboC4n8ZW3T%ZBIoPn|K77qJn+NO)x?xWBu zfSN;5bp!>0w}&JYYQRd|c2-IB^s5O}KF;m{o}&_ruoIO@f@zz}dZxI#*BOnNcNwE6 zi=vh6c7#lm955w1T=DJn0h^vqiBD07AG$@Qc(P)=U=J~}ToL9|9ZfuxNaQnxD>LcB zBC3?(S#g${FsZG0wjXS1z8vydJsuq|cx)^|>n=zX+2oGJvA@Lm1k!~}{EzbW-+xnR z7FWPm+9T4C`PS98P4?jHwNnGDtqrPHjt6OZv6%^h{q?JPas3SglmFoiN16xU^AF8W zA3kbVV`s^lYw=l05(A*!g)Ab4$cU&#wF4umWvHONl2$mXgNgzD6g6d3G1NU-m$f4R zZWxJ3o)w*IE$u(TgYJ#H2NT_{3~N@T4tT4>NUI95oJIUmQ2#+i!1^Otx_v#1hGk|A z*2sDJ){gPRS74PTmJyl-mBio&Q{%`5OWE(|Q=pz(ni=I1Nt*dxHW~Pc0Hyp0Ml|C2hV?MsBj2oo+U>)^^N0ZkA z{`#njCvECEv}G~v)4oVb|F;+945+T&+;v(?!rJIKsncFoa1~xzdA<_a-t7{ag}@{J zzpe~vTl{+S=jHLz>Cc}^2cb|*dw*pp_k`kYf~f0S#T{*s^UZ3R))C-XPX3yqZEn^iP5CjagyG;mouIyB#g(G^%oTx!+RAsvfyB$G1}nuXkI3XqW(A%`FWc zV-7|Bp;?9os7|QLj-qSx6QJEr6oXYZtATQwUoAKNr-^ZQ9HGun+h46Ze&Gt*6 zTbHk~&hi-O8g%qa6aSHgFdPv7Q20s>o>#9FsEGMY1pf_{h2bqI%&VbL;}{DK_sUC~?a(2?#z~v1xwqkD|N&PKEZS zwk20S0;DBQ(fs6gC2WjBHRu*P=ejIh5p!VpE_j+Qf+T_xziyk!SV#j6uZx=2V6Av2 zC;3OtK7A_U_NOynPWsRsT}1FpUit{5AzI`Ge5K8owGN*M9D)FcDgO+$7WI`CVkV8X z^hJefox}QC=&YD&uVC_CIH(Mo@KyP=IBt}H{5vhW9s5`cV7PTuIg*{Nz!FVMn72Sj z-;ziME~~X#+`Udau{IUi-L_q0nFWm}8|^u9EU9(@N?`h}x$=@|Rqofrwx4ThYo~q~ zq|$^Mg()ev{l8+dq=ybiVc#E@)&J}18#^9{Z)$4t`0_>5^Rs8afIMYklm)ndVk>*T zGstgl!1w^9{AI3kaPge*uaNlLF@HU5;jG%&)fMaepOjFYCHqqs?RiOU>U3VppH!Ud zB`rGNr$9!W=3v%Lo2S<&`fmobBQaBl!!S+!8>H(~bL6n@MkSRNN(jG5f-S(GVCmb@ z4XQ#ZyUJx_SjzK^@N%=E8T%bnhI3jNW1Z%=7C(eQ#TTBIfWm& zFyLMMKwg(Y`+Z>o+FPjjsidg7-;_K^c!=tn7 zuU{Sl$l%_JG?9SNo~dTSbJY*;b|9cz3K|n;%!F|MsMUSOH?eUU>^hQL(9>{qnDErB zAy7{fX+%%YIPP6XZ}|kUOIB|KXPwk%1d8Xw*%dCoY)zT*)GEcg|P` zSu)%p`&w!p`OR97s*zqG)!AQ6Sy_UP93k( zKbTeo;jVs{CCCG2o℘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

T`ZRA_Q~qGRv)w(C!wFqxWXK~xQLl7r$> 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℞_*g$+8U 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 Hq2+QvdDt29@3NJ~j}MBbo&voHSgcM0qn8 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�cls* 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�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 - - - {data.site.siteMetadata.title} - - - ); -} diff --git a/docs/src/gatsby-theme-apollo-docs/components/custom-seo.js b/docs/src/gatsby-theme-apollo-docs/components/custom-seo.js deleted file mode 100644 index 05176e7d..00000000 --- a/docs/src/gatsby-theme-apollo-docs/components/custom-seo.js +++ /dev/null @@ -1,22 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import {SEO} from 'gatsby-theme-apollo-core'; -import socialCard from '../../assets/akv2k8s.png' - -export default function CustomSEO({image, baseUrl, twitterHandle, ...props}) { - return ( - - - {baseUrl && } - {twitterHandle && ( - - )} - - ); -} - -CustomSEO.propTypes = { - baseUrl: PropTypes.string, - image: PropTypes.string.isRequired, - twitterHandle: PropTypes.string -}; \ No newline at end of file diff --git a/docs/src/gatsby-theme-apollo-docs/components/header-button.js b/docs/src/gatsby-theme-apollo-docs/components/header-button.js deleted file mode 100644 index 90123474..00000000 --- a/docs/src/gatsby-theme-apollo-docs/components/header-button.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function HeaderButton() { - return null; -} diff --git a/docs/src/gatsby-theme-apollo-docs/components/mobile-logo.js b/docs/src/gatsby-theme-apollo-docs/components/mobile-logo.js deleted file mode 100644 index ad11768e..00000000 --- a/docs/src/gatsby-theme-apollo-docs/components/mobile-logo.js +++ /dev/null @@ -1 +0,0 @@ -export {ReactComponent as MobileLogo} from '../../akv2k8s_small.svg'; \ No newline at end of file diff --git a/docs/static/CNAME b/docs/static/CNAME deleted file mode 100644 index 4b4bd309..00000000 --- a/docs/static/CNAME +++ /dev/null @@ -1 +0,0 @@ -akv2k8s.io \ No newline at end of file diff --git a/docs/static/_redirects b/docs/static/_redirects deleted file mode 100644 index df6b08a6..00000000 --- a/docs/static/_redirects +++ /dev/null @@ -1,38 +0,0 @@ -/ /docs/ - -# Add Developer Tools category to root docset -/docs/resources/apollo-config/ /docs/devtools/apollo-config/ - -# Get rid of "References" category -/docs/references/apollo-config/ /docs/devtools/apollo-config/ -/docs/references/apollo-config.html /docs/devtools/apollo-config/ -/docs/references/setup-analytics/ /docs/graph-manager/setup-analytics/ - -# Split "Apollo Engine guide" into two articles -/docs/references/apollo-engine/ /docs/graph-manager - -# Redirect Removed Guides to Platform Features -/docs/guides/security.html /docs/platform/operation-registry -/docs/guides/monitoring.html /docs/platform/integrations -/docs/guides/versioning.html /docs/platform/schema-validation#versioning - -# This lived here for a short period of time. -/docs/resources/apollo-config.html /docs/devtools/apollo-config - -# Redirect Removed Guides to Client & Server Docs -/docs/guides/schema-design.html /docs/apollo-server/essentials/schema -/docs/guides/testing-react-components.html /docs/react/recipes/testing -/docs/guides/state-management.html /docs/react/essentials/local-state -/docs/guides/access-control.html /docs/apollo-server/features/authentication - -# File uploads no longer have a home, but the blog post is the same content. -/docs/guides/file-uploads.html https://blog.apollographql.com/file-uploads-with-apollo-server-2-0-5db2f3f60675 - -# Move our Apollo config docs to the References section -/docs/platform/apollo-config.html /docs/devtools/apollo-config -/docs/platform/setup-analytics.html /docs/references/setup-analytics -/docs/platform/schema-validation.html /docs/graph-manager/schema-validation - -# Move Graph Manager docs to their own website -/docs/platform/* /docs/graph-manager/:splat -/docs/references/graph-manager-data-privacy/ /docs/graph-manager/graph-manager-data-privacy/ From 6f0a0d669aea0f1b0da7b8256ece52e145984b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 22:57:02 +0200 Subject: [PATCH 226/251] docs: remove github actions and makefile entries related to docs --- .github/workflows/docs-publish.yaml | 44 ----------------------------- Makefile | 8 ------ 2 files changed, 52 deletions(-) delete mode 100644 .github/workflows/docs-publish.yaml diff --git a/.github/workflows/docs-publish.yaml b/.github/workflows/docs-publish.yaml deleted file mode 100644 index 49011f6a..00000000 --- a/.github/workflows/docs-publish.yaml +++ /dev/null @@ -1,44 +0,0 @@ -name: publish docs - -on: - push: - branches: - - master - paths: - - 'docs/**' - -jobs: - build-deploy-docs: - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@master - - - name: Setup Node - uses: actions/setup-node@v1 - with: - node-version: '10.19.x' - - - name: Cache dependencies - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Build - env: - GATSBY_ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} - GATSBY_ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }} - ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} - run: | - cd docs - npm i - npm run build - - - name: Deploy - uses: peaceiris/actions-gh-pages@v2.5.0 - env: - ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} - PUBLISH_BRANCH: gh-pages - PUBLISH_DIR: ./docs/public \ No newline at end of file diff --git a/Makefile b/Makefile index 3ab2d35c..b18a72b3 100644 --- a/Makefile +++ b/Makefile @@ -118,14 +118,6 @@ ifndef TAG $(error TAG is undefined) endif -.PHONY: docs-install-dev -docs-install-dev: - cd ./docs && npm install - -.PHONY: docs-run-dev -docs-run-dev: - cd ./docs && GATSBY_ALGOLIA_ENABLED=false npm run start - .PHONY: fmt fmt: @echo "==> Fixing source code with gofmt..." From bf0ff572a4616aa18da4d9d5ba8d254796f68f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 23:37:24 +0200 Subject: [PATCH 227/251] readme: update refs to new doc repo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee327f17..b6338515 100644 --- a/README.md +++ b/README.md @@ -83,5 +83,5 @@ Azure Key Vault to Kubernetes is licensed under Apache License 2.0. ### Contribute to the Documentation -The documentation is located at [docs/source/content](docs/source/content). We're using Gatsby + MDX (Markdown + JSX) to generate static docs for https://akv2k8s.io. See [docs/README.md](docs/README.md) for details. +The documentation is located in a seperate repository at https://github.com/SparebankenVest/akv2k8s-website. We're using Gatsby + MDX (Markdown + JSX) to generate static docs for https://akv2k8s.io. From eb9ce1766140cf609acaea47529c12dd29be0fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 21 Oct 2020 23:41:26 +0200 Subject: [PATCH 228/251] controller: add missing rename causing build err --- cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 1b0a4a66..66a88338 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -222,7 +222,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) } - updatedSecret, err := updateExistingSecret(akvs, secretValue, existingSecret) + updatedSecret, err := createNewSecretFromExisting(akvs, secretValue, existingSecret) if err != nil { return fmt.Errorf("failed to update existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) } From fdea43b1f1fdb087ad5de42bf5c024772e607458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 22 Oct 2020 09:17:38 +0200 Subject: [PATCH 229/251] controller: better debug logging --- .../controller/azureKeyVaultSecret.go | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 66a88338..1991ff7e 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -44,7 +44,7 @@ func (c *Controller) initAzureKeyVaultSecret() { } if c.akvsHasOutputDefined(akvs) { - log.Debugf("AzureKeyVaultSecret %s/%s added. Adding to queue.", akvs.Namespace, akvs.Name) + log.Debugf("azurekeyvaultsecret %s/%s added - adding to queue.", akvs.Namespace, akvs.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) // queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), obj) } @@ -62,13 +62,13 @@ func (c *Controller) initAzureKeyVaultSecret() { // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv if newAkvs.ResourceVersion == oldAkvs.ResourceVersion && c.akvsHasOutputDefined(newAkvs) { - log.Debugf("AzureKeyVaultSecret %s/%s not changed. Adding to Azure Key Vault queue to check if secret has changed in Azure Key Vault.", newAkvs.Namespace, newAkvs.Name) + log.Debugf("azurekeyvaultsecret %s/%s not changed - adding to azure key vault queue to check if secret has changed in azure key vault", newAkvs.Namespace, newAkvs.Name) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } if c.akvsHasOutputDefined(newAkvs) || c.akvsHasOutputDefined(oldAkvs) { - log.Debugf("AzureKeyVaultSecret %s/%s changed. Adding to queue.", newAkvs.Namespace, newAkvs.Name) + log.Debugf("azurekeyvaultsecret %s/%s changed - adding to queue.", newAkvs.Namespace, newAkvs.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), new) } }, @@ -79,7 +79,7 @@ func (c *Controller) initAzureKeyVaultSecret() { } if c.akvsHasOutputDefined(akvs) { - log.Debugf("AzureKeyVaultSecret %s/%s deleted. Adding to delete queue.", akvs.Namespace, akvs.Name) + log.Debugf("azurekeyvaultsecret %s/%s deleted - adding to queue.", akvs.Namespace, akvs.Name) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) err = c.deleteKubernetesValues(akvs) @@ -103,7 +103,7 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { var akvs *akv.AzureKeyVaultSecret var err error - log.Debugf("Processing AzureKeyVaultSecret %s", key) + log.Debugf("processing azurekeyvaultsecret %s", key) if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil @@ -148,7 +148,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { var akvs *akv.AzureKeyVaultSecret var err error - log.Debugf("Processing AzureKeyVaultSecret %s", key) + log.Debugf("processing azurekeyvaultsecret %s", key) if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil @@ -193,7 +193,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { var akvs *akv.AzureKeyVaultSecret var err error - log.Debugf("Checking state for %s in Azure", key) + log.Debugf("checking state for %s in azure", key) if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil @@ -202,20 +202,21 @@ func (c *Controller) syncAzureKeyVault(key string) error { } if c.akvsHasOutputSecret(akvs) { - log.Debugf("Getting secret value for %s in Azure", key) + log.Debugf("getting secret value for %s in azure", key) secretValue, err := c.getSecretFromKeyVault(akvs) if err != nil { msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) - log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) + log.Errorf("failed to get secret value for '%s' from azure key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg) return fmt.Errorf(msg) } akvsValuesHash := getMD5HashOfByteValues(secretValue) - log.Debugf("Checking if secret value for %s has changed in Azure", key) + log.Debugf("checking if secret value for %s has changed in azure", key) if akvs.Status.SecretHash != akvsValuesHash { - log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", akvs.Name) + log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, akvsValuesHash) + log.Infof("secret has changed in azure key vault for azurekeyvvaultsecret %s. updating secret now", akvs.Name) existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) if err != nil { @@ -232,47 +233,48 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf("failed to update secret, error: %+v", err) } - log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secret must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) + log.Warningf("secret value will now change for secret '%s' - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) } - log.Debugf("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + log.Debugf("updating status for azurekeyvaultsecret '%s'", akvs.Name) if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, akvsValuesHash); err != nil { return err } } if c.akvsHasOutputConfigMap(akvs) { - log.Debugf("Getting secret value for %s in Azure", key) + log.Debugf("getting secret value for %s in azure", key) cmValue, err := c.getConfigMapFromKeyVault(akvs) if err != nil { msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) - log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) + log.Errorf("failed to get secret value for '%s' from azure key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg) return fmt.Errorf(msg) } cmHash := getMD5HashOfStringValues(cmValue) - log.Debugf("Checking if secret value for %s has changed in Azure", key) + log.Debugf("checking if secret value for %s has changed in azure", key) if akvs.Status.ConfigMapHash != cmHash { - log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", akvs.Name) + log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, akvsValuesHash) + log.Infof("secret has changed in azure key vault for azurekeyvvaultsecret %s - updating secret now", akvs.Name) cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(createNewConfigMap(akvs, cmValue)) if err != nil { - log.Warningf("Failed to create Secret, Error: %+v", err) + log.Warningf("failed to create secret, error: %+v", err) return err } - log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secret must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", cm.Name) + log.Warningf("secret value will now change for secret '%s' - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", cm.Name) } - log.Debugf("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + log.Debugf("updating status for azurekeyvaultsecret '%s'", akvs.Name) if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, cmHash); err != nil { return err } } - log.Debugf("Successfully synced AzureKeyVaultSecret %s with Azure Key Vault", key) + log.Debugf("successfully synced azurekeyvaultsecret %s with azure key vault", key) c.recorder.Event(akvs, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) return nil } @@ -381,7 +383,7 @@ func (c *Controller) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecre return nil, fmt.Errorf("invalid resource key: %s", key) } - log.Debugf("Getting AzureKeyVaultSecret %s from namespace %s", name, namespace) + log.Debugf("getting azurekeyvaultsecret %s from namespace %s", name, namespace) azureKeyVaultSecret, err := c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(namespace).Get(name) if err != nil { @@ -440,12 +442,14 @@ func (c *Controller) updateAzureKeyVaultSecretStatus(akvs *akv.AzureKeyVaultSecr func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKeyVaultSecret, secretHash string) error { secretName := determineSecretName(akvs) + now := c.clock.Now() akvsCopy := akvs.DeepCopy() akvsCopy.Status.SecretName = secretName akvsCopy.Status.SecretHash = secretHash - akvsCopy.Status.LastAzureUpdate = c.clock.Now() + akvsCopy.Status.LastAzureUpdate = now + log.Debugf("updating status of azurekeyvaultsecert %s - secretname: %s, secrethash: %s, lastazureupdate: %s", akvsCopy.Name, secretName, secretHash, now) _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } @@ -463,14 +467,14 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.Azure } func handleKeyVaultError(err error, key string) bool { - log.Debugf("Handling error for '%s' in AzureKeyVaultSecret: %s", key, err.Error()) + log.Debugf("handling error for '%s' in azurekeyvaultsecret: %s", key, err.Error()) exit := false if err != nil { // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. if errors.IsNotFound(err) { - log.Debugf("Error for '%s' was 'Not Found'", key) + log.Debugf("error for '%s' was 'not found'", key) - log.Errorf("AzureKeyVaultSecret '%s' in work queue no longer exists", key) + log.Errorf("azurekeyvaultsecret '%s' in work queue no longer exists", key) exit = true } } From beffb63d80ccce9e4cff6a91ab7bcde35c7ebe2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 22 Oct 2020 09:22:44 +0200 Subject: [PATCH 230/251] controller: fix copy/paste error --- cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 1991ff7e..dfe16143 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -256,7 +256,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { log.Debugf("checking if secret value for %s has changed in azure", key) if akvs.Status.ConfigMapHash != cmHash { - log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, akvsValuesHash) + log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, cmHash) log.Infof("secret has changed in azure key vault for azurekeyvvaultsecret %s - updating secret now", akvs.Name) cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(createNewConfigMap(akvs, cmValue)) From b29085a85fb71fe188dcae7a00b6a880098c3047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 22 Oct 2020 12:09:06 +0200 Subject: [PATCH 231/251] bump from azurekeyvault api version v2alpha1 to v2beta1 --- .../controller/azureKeyVaultSecret.go | 10 ++-- .../controller/azureeKeyVaultSecret_test.go | 2 +- .../controller/configmap.go | 2 +- .../controller/controller.go | 4 +- .../controller/secret.go | 2 +- .../controller/secret_handler.go | 2 +- .../controller/secret_handler_test.go | 2 +- cmd/azure-keyvault-env/main.go | 6 +-- cmd/azure-keyvault-env/secret_handler.go | 2 +- pkg/akv2k8s/transformers/handler_test.go | 2 +- pkg/akv2k8s/transformers/transformator.go | 2 +- .../keyvault/client/azure_keyvault_service.go | 2 +- .../client/azure_keyvault_service_test.go | 2 +- .../{v2alpha1 => v2beta1}/doc.go | 2 +- .../{v2alpha1 => v2beta1}/register.go | 2 +- .../{v2alpha1 => v2beta1}/types.go | 10 ++-- .../zz_generated.deepcopy.go | 2 +- .../client/clientset/versioned/clientset.go | 18 +++---- .../versioned/fake/clientset_generated.go | 10 ++-- .../clientset/versioned/fake/register.go | 4 +- .../clientset/versioned/scheme/register.go | 4 +- .../azurekeyvault_client.go | 32 ++++++------ .../azurekeyvaultsecret.go | 42 ++++++++-------- .../{v2alpha1 => v2beta1}/doc.go | 2 +- .../{v2alpha1 => v2beta1}/fake/doc.go | 0 .../fake/fake_azurekeyvault_client.go | 8 +-- .../fake/fake_azurekeyvaultsecret.go | 50 +++++++++---------- .../generated_expansion.go | 2 +- .../azurekeyvault/interface.go | 12 ++--- .../azurekeyvaultsecret.go | 20 ++++---- .../{v2alpha1 => v2beta1}/interface.go | 2 +- .../informers/externalversions/generic.go | 8 +-- .../azurekeyvaultsecret.go | 24 ++++----- .../expansion_generated.go | 2 +- 34 files changed, 148 insertions(+), 148 deletions(-) rename pkg/k8s/apis/azurekeyvault/{v2alpha1 => v2beta1}/doc.go (97%) rename pkg/k8s/apis/azurekeyvault/{v2alpha1 => v2beta1}/register.go (99%) rename pkg/k8s/apis/azurekeyvault/{v2alpha1 => v2beta1}/types.go (94%) rename pkg/k8s/apis/azurekeyvault/{v2alpha1 => v2beta1}/zz_generated.deepcopy.go (99%) rename pkg/k8s/client/clientset/versioned/typed/azurekeyvault/{v2alpha1 => v2beta1}/azurekeyvault_client.go (63%) rename pkg/k8s/client/clientset/versioned/typed/azurekeyvault/{v2alpha1 => v2beta1}/azurekeyvaultsecret.go (78%) rename pkg/k8s/client/clientset/versioned/typed/azurekeyvault/{v2alpha1 => v2beta1}/doc.go (97%) rename pkg/k8s/client/clientset/versioned/typed/azurekeyvault/{v2alpha1 => v2beta1}/fake/doc.go (100%) rename pkg/k8s/client/clientset/versioned/typed/azurekeyvault/{v2alpha1 => v2beta1}/fake/fake_azurekeyvault_client.go (74%) rename pkg/k8s/client/clientset/versioned/typed/azurekeyvault/{v2alpha1 => v2beta1}/fake/fake_azurekeyvaultsecret.go (71%) rename pkg/k8s/client/clientset/versioned/typed/azurekeyvault/{v2alpha1 => v2beta1}/generated_expansion.go (97%) rename pkg/k8s/client/informers/externalversions/azurekeyvault/{v2alpha1 => v2beta1}/azurekeyvaultsecret.go (81%) rename pkg/k8s/client/informers/externalversions/azurekeyvault/{v2alpha1 => v2beta1}/interface.go (99%) rename pkg/k8s/client/listers/azurekeyvault/{v2alpha1 => v2beta1}/azurekeyvaultsecret.go (80%) rename pkg/k8s/client/listers/azurekeyvault/{v2alpha1 => v2beta1}/expansion_generated.go (98%) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index dfe16143..6b3f3d72 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -23,7 +23,7 @@ import ( "fmt" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -36,7 +36,7 @@ import ( ) func (c *Controller) initAzureKeyVaultSecret() { - c.akvsInformerFactory.Keyvault().V2alpha1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + c.akvsInformerFactory.Keyvault().V2beta1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { akvs, err := convertToAzureKeyVaultSecret(obj) if err != nil { @@ -436,7 +436,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatus(akvs *akv.AzureKeyVaultSecr akvsCopy.Status.ConfigMapHash = cmHash akvsCopy.Status.LastAzureUpdate = c.clock.Now() - _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } @@ -450,7 +450,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKey akvsCopy.Status.LastAzureUpdate = now log.Debugf("updating status of azurekeyvaultsecert %s - secretname: %s, secrethash: %s, lastazureupdate: %s", akvsCopy.Name, secretName, secretHash, now) - _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } @@ -462,7 +462,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.Azure akvsCopy.Status.ConfigMapHash = cmHash akvsCopy.Status.LastAzureUpdate = c.clock.Now() - _, err := c.akvsClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } diff --git a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go index d707e687..6d15449c 100644 --- a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go +++ b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go @@ -19,7 +19,7 @@ package controller import ( "testing" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" ) func TestNullLookup(t *testing.T) { diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 2872de4e..d71cb001 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -26,7 +26,7 @@ import ( "fmt" "sort" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index eedf3484..3a7ac46f 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -39,7 +39,7 @@ import ( akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions" - listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" + listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2beta1" ) const ( @@ -143,7 +143,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI secretsLister: kubeInformerFactory.Core().V1().Secrets().Lister(), configMapsLister: kubeInformerFactory.Core().V1().ConfigMaps().Lister(), - azureKeyVaultSecretLister: akvInformerFactory.Keyvault().V2alpha1().AzureKeyVaultSecrets().Lister(), + azureKeyVaultSecretLister: akvInformerFactory.Keyvault().V2beta1().AzureKeyVaultSecrets().Lister(), options: options, clock: &Clock{}, diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index c957120a..92a410db 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -26,7 +26,7 @@ import ( "fmt" "sort" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index ded26113..dc677882 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go index c0f990a6..39a1d638 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go @@ -22,7 +22,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index a9a50695..393f95fd 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -28,7 +28,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" log "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -277,13 +277,13 @@ func main() { } logger.Debugf("getting azurekeyvaultsecret resource '%s' from kubernetes", secretName) - keyVaultSecretSpec, err := azureKeyVaultSecretClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + keyVaultSecretSpec, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { logger.Warnf("failed to get azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error()) logger.Infof("will retry getting azurekeyvaultsecret resource up to %d times, waiting %d seconds between retries", config.retryTimes, config.waitTimeBetweenRetries) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { - keyVaultSecretSpec, err = azureKeyVaultSecretClient.KeyvaultV2alpha1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + keyVaultSecretSpec, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %+v", secretName, err) return err diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go index fec73294..3d581c1a 100644 --- a/cmd/azure-keyvault-env/secret_handler.go +++ b/cmd/azure-keyvault-env/secret_handler.go @@ -23,7 +23,7 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" - akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" diff --git a/pkg/akv2k8s/transformers/handler_test.go b/pkg/akv2k8s/transformers/handler_test.go index da8749bc..cfc62672 100644 --- a/pkg/akv2k8s/transformers/handler_test.go +++ b/pkg/akv2k8s/transformers/handler_test.go @@ -19,7 +19,7 @@ package transformers import ( "testing" - akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" ) const ( diff --git a/pkg/akv2k8s/transformers/transformator.go b/pkg/akv2k8s/transformers/transformator.go index b2ac9716..8b9fd0fa 100644 --- a/pkg/akv2k8s/transformers/transformator.go +++ b/pkg/akv2k8s/transformers/transformator.go @@ -19,7 +19,7 @@ package transformers import ( "fmt" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" ) // CreateTransformator creates a new Transformator ready to run transformation handlers diff --git a/pkg/azure/keyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go index 5235933f..bbf81166 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service.go @@ -24,7 +24,7 @@ import ( "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" ) const ( diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go index e68e7e6e..3501599a 100644 --- a/pkg/azure/keyvault/client/azure_keyvault_service_test.go +++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go @@ -8,7 +8,7 @@ import ( akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing" auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go b/pkg/k8s/apis/azurekeyvault/v2beta1/doc.go similarity index 97% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go rename to pkg/k8s/apis/azurekeyvault/v2beta1/doc.go index 0f65208e..db474baa 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/doc.go +++ b/pkg/k8s/apis/azurekeyvault/v2beta1/doc.go @@ -18,4 +18,4 @@ limitations under the License. // +groupName=keyvault.azure.spv.no // Package v1 is the v1 version of the API. -package v2alpha1 +package v2beta1 diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go b/pkg/k8s/apis/azurekeyvault/v2beta1/register.go similarity index 99% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/register.go rename to pkg/k8s/apis/azurekeyvault/v2beta1/register.go index 3ae19f64..2baa769d 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/register.go +++ b/pkg/k8s/apis/azurekeyvault/v2beta1/register.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v2alpha1 +package v2beta1 import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault" diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go b/pkg/k8s/apis/azurekeyvault/v2beta1/types.go similarity index 94% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/types.go rename to pkg/k8s/apis/azurekeyvault/v2beta1/types.go index ca767c73..3be0ee3b 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/types.go +++ b/pkg/k8s/apis/azurekeyvault/v2beta1/types.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v2alpha1 +package v2beta1 import ( corev1 "k8s.io/api/core/v1" @@ -122,9 +122,9 @@ type AzureKeyVaultOutputConfigMap struct { // AzureKeyVaultSecretStatus is the status for a AzureKeyVaultSecret resource type AzureKeyVaultSecretStatus struct { - SecretHash string `json:"secretHash"` - SecretName string `json:"secretName"` - ConfigMapHash string `json:"configMapHash"` - ConfigMapName string `json:"configMapName"` + SecretHash string `json:"secretHash,omitempty"` + SecretName string `json:"secretName,omitempty"` + ConfigMapHash string `json:"configMapHash,omitempty"` + ConfigMapName string `json:"configMapName,omitempty"` LastAzureUpdate metav1.Time `json:"lastAzureUpdate,omitempty"` } diff --git a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v2beta1/zz_generated.deepcopy.go similarity index 99% rename from pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go rename to pkg/k8s/apis/azurekeyvault/v2beta1/zz_generated.deepcopy.go index ab724864..78504042 100644 --- a/pkg/k8s/apis/azurekeyvault/v2alpha1/zz_generated.deepcopy.go +++ b/pkg/k8s/apis/azurekeyvault/v2beta1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. // Code generated by deepcopy-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 import ( runtime "k8s.io/apimachinery/pkg/runtime" diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index 68fa4c1d..5408964b 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -26,7 +26,7 @@ import ( keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1" keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" + keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -36,7 +36,7 @@ type Interface interface { Discovery() discovery.DiscoveryInterface KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface KeyvaultV1() keyvaultv1.KeyvaultV1Interface - KeyvaultV2alpha1() keyvaultv2alpha1.KeyvaultV2alpha1Interface + KeyvaultV2beta1() keyvaultv2beta1.KeyvaultV2beta1Interface } // Clientset contains the clients for groups. Each group has exactly one @@ -45,7 +45,7 @@ type Clientset struct { *discovery.DiscoveryClient keyvaultV1alpha1 *keyvaultv1alpha1.KeyvaultV1alpha1Client keyvaultV1 *keyvaultv1.KeyvaultV1Client - keyvaultV2alpha1 *keyvaultv2alpha1.KeyvaultV2alpha1Client + keyvaultV2beta1 *keyvaultv2beta1.KeyvaultV2beta1Client } // KeyvaultV1alpha1 retrieves the KeyvaultV1alpha1Client @@ -58,9 +58,9 @@ func (c *Clientset) KeyvaultV1() keyvaultv1.KeyvaultV1Interface { return c.keyvaultV1 } -// KeyvaultV2alpha1 retrieves the KeyvaultV2alpha1Client -func (c *Clientset) KeyvaultV2alpha1() keyvaultv2alpha1.KeyvaultV2alpha1Interface { - return c.keyvaultV2alpha1 +// KeyvaultV2beta1 retrieves the KeyvaultV2beta1Client +func (c *Clientset) KeyvaultV2beta1() keyvaultv2beta1.KeyvaultV2beta1Interface { + return c.keyvaultV2beta1 } // Discovery retrieves the DiscoveryClient @@ -92,7 +92,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } - cs.keyvaultV2alpha1, err = keyvaultv2alpha1.NewForConfig(&configShallowCopy) + cs.keyvaultV2beta1, err = keyvaultv2beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } @@ -110,7 +110,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset cs.keyvaultV1alpha1 = keyvaultv1alpha1.NewForConfigOrDie(c) cs.keyvaultV1 = keyvaultv1.NewForConfigOrDie(c) - cs.keyvaultV2alpha1 = keyvaultv2alpha1.NewForConfigOrDie(c) + cs.keyvaultV2beta1 = keyvaultv2beta1.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) return &cs @@ -121,7 +121,7 @@ func New(c rest.Interface) *Clientset { var cs Clientset cs.keyvaultV1alpha1 = keyvaultv1alpha1.New(c) cs.keyvaultV1 = keyvaultv1.New(c) - cs.keyvaultV2alpha1 = keyvaultv2alpha1.New(c) + cs.keyvaultV2beta1 = keyvaultv2beta1.New(c) cs.DiscoveryClient = discovery.NewDiscoveryClient(c) return &cs diff --git a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go index 3cbc6345..b356e51c 100644 --- a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go +++ b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go @@ -27,8 +27,8 @@ import ( fakekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake" keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1" fakekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" - fakekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake" + keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1" + fakekeyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/discovery" @@ -93,7 +93,7 @@ func (c *Clientset) KeyvaultV1() keyvaultv1.KeyvaultV1Interface { return &fakekeyvaultv1.FakeKeyvaultV1{Fake: &c.Fake} } -// KeyvaultV2alpha1 retrieves the KeyvaultV2alpha1Client -func (c *Clientset) KeyvaultV2alpha1() keyvaultv2alpha1.KeyvaultV2alpha1Interface { - return &fakekeyvaultv2alpha1.FakeKeyvaultV2alpha1{Fake: &c.Fake} +// KeyvaultV2beta1 retrieves the KeyvaultV2beta1Client +func (c *Clientset) KeyvaultV2beta1() keyvaultv2beta1.KeyvaultV2beta1Interface { + return &fakekeyvaultv2beta1.FakeKeyvaultV2beta1{Fake: &c.Fake} } diff --git a/pkg/k8s/client/clientset/versioned/fake/register.go b/pkg/k8s/client/clientset/versioned/fake/register.go index 2932114c..0c4d891e 100644 --- a/pkg/k8s/client/clientset/versioned/fake/register.go +++ b/pkg/k8s/client/clientset/versioned/fake/register.go @@ -24,7 +24,7 @@ package fake import ( keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -38,7 +38,7 @@ var parameterCodec = runtime.NewParameterCodec(scheme) var localSchemeBuilder = runtime.SchemeBuilder{ keyvaultv1alpha1.AddToScheme, keyvaultv1.AddToScheme, - keyvaultv2alpha1.AddToScheme, + keyvaultv2beta1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition diff --git a/pkg/k8s/client/clientset/versioned/scheme/register.go b/pkg/k8s/client/clientset/versioned/scheme/register.go index 097f00a2..996ac0bd 100644 --- a/pkg/k8s/client/clientset/versioned/scheme/register.go +++ b/pkg/k8s/client/clientset/versioned/scheme/register.go @@ -24,7 +24,7 @@ package scheme import ( keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - keyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -38,7 +38,7 @@ var ParameterCodec = runtime.NewParameterCodec(Scheme) var localSchemeBuilder = runtime.SchemeBuilder{ keyvaultv1alpha1.AddToScheme, keyvaultv1.AddToScheme, - keyvaultv2alpha1.AddToScheme, + keyvaultv2beta1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvault_client.go similarity index 63% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvault_client.go index 9d7bd2ce..9ee95de8 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvault_client.go @@ -19,30 +19,30 @@ limitations under the License. // Code generated by client-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) -type KeyvaultV2alpha1Interface interface { +type KeyvaultV2beta1Interface interface { RESTClient() rest.Interface AzureKeyVaultSecretsGetter } -// KeyvaultV2alpha1Client is used to interact with features provided by the keyvault.azure.spv.no group. -type KeyvaultV2alpha1Client struct { +// KeyvaultV2beta1Client is used to interact with features provided by the keyvault.azure.spv.no group. +type KeyvaultV2beta1Client struct { restClient rest.Interface } -func (c *KeyvaultV2alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { +func (c *KeyvaultV2beta1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface { return newAzureKeyVaultSecrets(c, namespace) } -// NewForConfig creates a new KeyvaultV2alpha1Client for the given config. -func NewForConfig(c *rest.Config) (*KeyvaultV2alpha1Client, error) { +// NewForConfig creates a new KeyvaultV2beta1Client for the given config. +func NewForConfig(c *rest.Config) (*KeyvaultV2beta1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -51,12 +51,12 @@ func NewForConfig(c *rest.Config) (*KeyvaultV2alpha1Client, error) { if err != nil { return nil, err } - return &KeyvaultV2alpha1Client{client}, nil + return &KeyvaultV2beta1Client{client}, nil } -// NewForConfigOrDie creates a new KeyvaultV2alpha1Client for the given config and +// NewForConfigOrDie creates a new KeyvaultV2beta1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *KeyvaultV2alpha1Client { +func NewForConfigOrDie(c *rest.Config) *KeyvaultV2beta1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -64,13 +64,13 @@ func NewForConfigOrDie(c *rest.Config) *KeyvaultV2alpha1Client { return client } -// New creates a new KeyvaultV2alpha1Client for the given RESTClient. -func New(c rest.Interface) *KeyvaultV2alpha1Client { - return &KeyvaultV2alpha1Client{c} +// New creates a new KeyvaultV2beta1Client for the given RESTClient. +func New(c rest.Interface) *KeyvaultV2beta1Client { + return &KeyvaultV2beta1Client{c} } func setConfigDefaults(config *rest.Config) error { - gv := v2alpha1.SchemeGroupVersion + gv := v2beta1.SchemeGroupVersion config.GroupVersion = &gv config.APIPath = "/apis" config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() @@ -84,7 +84,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *KeyvaultV2alpha1Client) RESTClient() rest.Interface { +func (c *KeyvaultV2beta1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go similarity index 78% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go index ebdae956..aefc97f0 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go @@ -19,12 +19,12 @@ limitations under the License. // Code generated by client-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 import ( "time" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" @@ -40,15 +40,15 @@ type AzureKeyVaultSecretsGetter interface { // AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources. type AzureKeyVaultSecretInterface interface { - Create(*v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) - Update(*v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) - UpdateStatus(*v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) + Create(*v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) + Update(*v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) + UpdateStatus(*v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) Delete(name string, options *v1.DeleteOptions) error DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v2alpha1.AzureKeyVaultSecret, error) - List(opts v1.ListOptions) (*v2alpha1.AzureKeyVaultSecretList, error) + Get(name string, options v1.GetOptions) (*v2beta1.AzureKeyVaultSecret, error) + List(opts v1.ListOptions) (*v2beta1.AzureKeyVaultSecretList, error) Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecret, err error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) AzureKeyVaultSecretExpansion } @@ -59,7 +59,7 @@ type azureKeyVaultSecrets struct { } // newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets -func newAzureKeyVaultSecrets(c *KeyvaultV2alpha1Client, namespace string) *azureKeyVaultSecrets { +func newAzureKeyVaultSecrets(c *KeyvaultV2beta1Client, namespace string) *azureKeyVaultSecrets { return &azureKeyVaultSecrets{ client: c.RESTClient(), ns: namespace, @@ -67,8 +67,8 @@ func newAzureKeyVaultSecrets(c *KeyvaultV2alpha1Client, namespace string) *azure } // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *azureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecret, err error) { - result = &v2alpha1.AzureKeyVaultSecret{} +func (c *azureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { + result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Get(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). @@ -80,12 +80,12 @@ func (c *azureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result * } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretList, err error) { +func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second } - result = &v2alpha1.AzureKeyVaultSecretList{} + result = &v2beta1.AzureKeyVaultSecretList{} err = c.client.Get(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). @@ -112,8 +112,8 @@ func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, erro } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { - result = &v2alpha1.AzureKeyVaultSecret{} +func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { + result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Post(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). @@ -124,8 +124,8 @@ func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v2alpha1.AzureKeyVaul } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { - result = &v2alpha1.AzureKeyVaultSecret{} +func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { + result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). @@ -139,8 +139,8 @@ func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v2alpha1.AzureKeyVaul // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { - result = &v2alpha1.AzureKeyVaultSecret{} +func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { + result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). @@ -180,8 +180,8 @@ func (c *azureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listO } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecret, err error) { - result = &v2alpha1.AzureKeyVaultSecret{} +func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) { + result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Patch(pt). Namespace(c.ns). Resource("azurekeyvaultsecrets"). diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/doc.go similarity index 97% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/doc.go index 550ab0af..98601438 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/doc.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/doc.go @@ -20,4 +20,4 @@ limitations under the License. // Code generated by client-gen. DO NOT EDIT. // This package has the automatically generated typed clients. -package v2alpha1 +package v2beta1 diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/doc.go similarity index 100% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/doc.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/doc.go diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvault_client.go similarity index 74% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvault_client.go index 27d829fd..8676cf95 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvault_client.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvault_client.go @@ -22,22 +22,22 @@ limitations under the License. package fake import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1" rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" ) -type FakeKeyvaultV2alpha1 struct { +type FakeKeyvaultV2beta1 struct { *testing.Fake } -func (c *FakeKeyvaultV2alpha1) AzureKeyVaultSecrets(namespace string) v2alpha1.AzureKeyVaultSecretInterface { +func (c *FakeKeyvaultV2beta1) AzureKeyVaultSecrets(namespace string) v2beta1.AzureKeyVaultSecretInterface { return &FakeAzureKeyVaultSecrets{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeKeyvaultV2alpha1) RESTClient() rest.Interface { +func (c *FakeKeyvaultV2beta1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go similarity index 71% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go index f21962bf..4a60ac09 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go @@ -22,7 +22,7 @@ limitations under the License. package fake import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,29 +33,29 @@ import ( // FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface type FakeAzureKeyVaultSecrets struct { - Fake *FakeKeyvaultV2alpha1 + Fake *FakeKeyvaultV2beta1 ns string } -var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v2alpha1", Resource: "azurekeyvaultsecrets"} +var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v2beta1", Resource: "azurekeyvaultsecrets"} -var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v2alpha1", Kind: "AzureKeyVaultSecret"} +var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v2beta1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &v2alpha1.AzureKeyVaultSecret{}) + Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &v2beta1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*v2alpha1.AzureKeyVaultSecret), err + return obj.(*v2beta1.AzureKeyVaultSecret), err } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2alpha1.AzureKeyVaultSecretList, err error) { +func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) { obj, err := c.Fake. - Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &v2alpha1.AzureKeyVaultSecretList{}) + Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &v2beta1.AzureKeyVaultSecretList{}) if obj == nil { return nil, err @@ -65,8 +65,8 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2alpha1.A if label == nil { label = labels.Everything() } - list := &v2alpha1.AzureKeyVaultSecretList{ListMeta: obj.(*v2alpha1.AzureKeyVaultSecretList).ListMeta} - for _, item := range obj.(*v2alpha1.AzureKeyVaultSecretList).Items { + list := &v2beta1.AzureKeyVaultSecretList{ListMeta: obj.(*v2beta1.AzureKeyVaultSecretList).ListMeta} + for _, item := range obj.(*v2beta1.AzureKeyVaultSecretList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) } @@ -82,43 +82,43 @@ func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2alpha1.AzureKeyVaultSecret{}) + Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*v2alpha1.AzureKeyVaultSecret), err + return obj.(*v2beta1.AzureKeyVaultSecret), err } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (result *v2alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2alpha1.AzureKeyVaultSecret{}) + Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*v2alpha1.AzureKeyVaultSecret), err + return obj.(*v2beta1.AzureKeyVaultSecret), err } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2alpha1.AzureKeyVaultSecret) (*v2alpha1.AzureKeyVaultSecret, error) { +func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) { obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &v2alpha1.AzureKeyVaultSecret{}) + Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*v2alpha1.AzureKeyVaultSecret), err + return obj.(*v2beta1.AzureKeyVaultSecret), err } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &v2alpha1.AzureKeyVaultSecret{}) + Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &v2beta1.AzureKeyVaultSecret{}) return err } @@ -127,17 +127,17 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions) - _, err := c.Fake.Invokes(action, &v2alpha1.AzureKeyVaultSecretList{}) + _, err := c.Fake.Invokes(action, &v2beta1.AzureKeyVaultSecretList{}) return err } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &v2alpha1.AzureKeyVaultSecret{}) + Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &v2beta1.AzureKeyVaultSecret{}) if obj == nil { return nil, err } - return obj.(*v2alpha1.AzureKeyVaultSecret), err + return obj.(*v2beta1.AzureKeyVaultSecret), err } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/generated_expansion.go similarity index 97% rename from pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go rename to pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/generated_expansion.go index db5561ea..b8c95bdd 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2alpha1/generated_expansion.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/generated_expansion.go @@ -19,6 +19,6 @@ limitations under the License. // Code generated by client-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 type AzureKeyVaultSecretExpansion interface{} diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go index 033b8f9b..d60091ad 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go @@ -24,7 +24,7 @@ package azurekeyvault import ( v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" ) @@ -34,8 +34,8 @@ type Interface interface { V1alpha1() v1alpha1.Interface // V1 provides access to shared informers for resources in V1. V1() v1.Interface - // V2alpha1 provides access to shared informers for resources in V2alpha1. - V2alpha1() v2alpha1.Interface + // V2beta1 provides access to shared informers for resources in V2beta1. + V2beta1() v2beta1.Interface } type group struct { @@ -59,7 +59,7 @@ func (g *group) V1() v1.Interface { return v1.New(g.factory, g.namespace, g.tweakListOptions) } -// V2alpha1 returns a new v2alpha1.Interface. -func (g *group) V2alpha1() v2alpha1.Interface { - return v2alpha1.New(g.factory, g.namespace, g.tweakListOptions) +// V2beta1 returns a new v2beta1.Interface. +func (g *group) V2beta1() v2beta1.Interface { + return v2beta1.New(g.factory, g.namespace, g.tweakListOptions) } diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go similarity index 81% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go index 6066443d..15467f5a 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go @@ -19,15 +19,15 @@ limitations under the License. // Code generated by informer-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 import ( time "time" - azurekeyvaultv2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + azurekeyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -38,7 +38,7 @@ import ( // AzureKeyVaultSecrets. type AzureKeyVaultSecretInformer interface { Informer() cache.SharedIndexInformer - Lister() v2alpha1.AzureKeyVaultSecretLister + Lister() v2beta1.AzureKeyVaultSecretLister } type azureKeyVaultSecretInformer struct { @@ -64,16 +64,16 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).List(options) + return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV2alpha1().AzureKeyVaultSecrets(namespace).Watch(options) + return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).Watch(options) }, }, - &azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, + &azurekeyvaultv2beta1.AzureKeyVaultSecret{}, resyncPeriod, indexers, ) @@ -84,9 +84,9 @@ func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface } func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&azurekeyvaultv2alpha1.AzureKeyVaultSecret{}, f.defaultInformer) + return f.factory.InformerFor(&azurekeyvaultv2beta1.AzureKeyVaultSecret{}, f.defaultInformer) } -func (f *azureKeyVaultSecretInformer) Lister() v2alpha1.AzureKeyVaultSecretLister { - return v2alpha1.NewAzureKeyVaultSecretLister(f.Informer().GetIndexer()) +func (f *azureKeyVaultSecretInformer) Lister() v2beta1.AzureKeyVaultSecretLister { + return v2beta1.NewAzureKeyVaultSecretLister(f.Informer().GetIndexer()) } diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/interface.go similarity index 99% rename from pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go rename to pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/interface.go index d1154e3a..fe3869cd 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2alpha1/interface.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/interface.go @@ -19,7 +19,7 @@ limitations under the License. // Code generated by informer-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 import ( internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces" diff --git a/pkg/k8s/client/informers/externalversions/generic.go b/pkg/k8s/client/informers/externalversions/generic.go index c0ab7b44..84c5005d 100644 --- a/pkg/k8s/client/informers/externalversions/generic.go +++ b/pkg/k8s/client/informers/externalversions/generic.go @@ -26,7 +26,7 @@ import ( v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" ) @@ -65,9 +65,9 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case v1alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V1alpha1().AzureKeyVaultSecrets().Informer()}, nil - // Group=keyvault.azure.spv.no, Version=v2alpha1 - case v2alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V2alpha1().AzureKeyVaultSecrets().Informer()}, nil + // Group=keyvault.azure.spv.no, Version=v2beta1 + case v2beta1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V2beta1().AzureKeyVaultSecrets().Informer()}, nil } diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go similarity index 80% rename from pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go rename to pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go index 60cd19e3..ee9384df 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go @@ -19,10 +19,10 @@ limitations under the License. // Code generated by lister-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 import ( - v2alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2alpha1" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" @@ -31,7 +31,7 @@ import ( // AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets. type AzureKeyVaultSecretLister interface { // List lists all AzureKeyVaultSecrets in the indexer. - List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) + List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) // AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets. AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister AzureKeyVaultSecretListerExpansion @@ -48,9 +48,9 @@ func NewAzureKeyVaultSecretLister(indexer cache.Indexer) AzureKeyVaultSecretList } // List lists all AzureKeyVaultSecrets in the indexer. -func (s *azureKeyVaultSecretLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) { +func (s *azureKeyVaultSecretLister) List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) { err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecret)) + ret = append(ret, m.(*v2beta1.AzureKeyVaultSecret)) }) return ret, err } @@ -63,9 +63,9 @@ func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) Azure // AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets. type AzureKeyVaultSecretNamespaceLister interface { // List lists all AzureKeyVaultSecrets in the indexer for a given namespace. - List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) + List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) // Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name. - Get(name string) (*v2alpha1.AzureKeyVaultSecret, error) + Get(name string) (*v2beta1.AzureKeyVaultSecret, error) AzureKeyVaultSecretNamespaceListerExpansion } @@ -77,21 +77,21 @@ type azureKeyVaultSecretNamespaceLister struct { } // List lists all AzureKeyVaultSecrets in the indexer for a given namespace. -func (s azureKeyVaultSecretNamespaceLister) List(selector labels.Selector) (ret []*v2alpha1.AzureKeyVaultSecret, err error) { +func (s azureKeyVaultSecretNamespaceLister) List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) { err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*v2alpha1.AzureKeyVaultSecret)) + ret = append(ret, m.(*v2beta1.AzureKeyVaultSecret)) }) return ret, err } // Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name. -func (s azureKeyVaultSecretNamespaceLister) Get(name string) (*v2alpha1.AzureKeyVaultSecret, error) { +func (s azureKeyVaultSecretNamespaceLister) Get(name string) (*v2beta1.AzureKeyVaultSecret, error) { obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) if err != nil { return nil, err } if !exists { - return nil, errors.NewNotFound(v2alpha1.Resource("azurekeyvaultsecret"), name) + return nil, errors.NewNotFound(v2beta1.Resource("azurekeyvaultsecret"), name) } - return obj.(*v2alpha1.AzureKeyVaultSecret), nil + return obj.(*v2beta1.AzureKeyVaultSecret), nil } diff --git a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go b/pkg/k8s/client/listers/azurekeyvault/v2beta1/expansion_generated.go similarity index 98% rename from pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go rename to pkg/k8s/client/listers/azurekeyvault/v2beta1/expansion_generated.go index 24f06b36..7129d527 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v2alpha1/expansion_generated.go +++ b/pkg/k8s/client/listers/azurekeyvault/v2beta1/expansion_generated.go @@ -19,7 +19,7 @@ limitations under the License. // Code generated by lister-gen. DO NOT EDIT. -package v2alpha1 +package v2beta1 // AzureKeyVaultSecretListerExpansion allows custom methods to be added to // AzureKeyVaultSecretLister. From 21a156292d34179a180bd31d172503829f8a1b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 22 Oct 2020 12:25:41 +0200 Subject: [PATCH 232/251] replce leftover ref to v2alpha1 --- pkg/k8s/apis/azurekeyvault/v2beta1/register.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/k8s/apis/azurekeyvault/v2beta1/register.go b/pkg/k8s/apis/azurekeyvault/v2beta1/register.go index 2baa769d..9ff6fd85 100644 --- a/pkg/k8s/apis/azurekeyvault/v2beta1/register.go +++ b/pkg/k8s/apis/azurekeyvault/v2beta1/register.go @@ -24,7 +24,7 @@ import ( ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v2alpha1"} +var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v2beta1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { From a7b67a6cc575eda2d69dfbd7908e6bfb3b1415cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 22 Oct 2020 12:58:15 +0200 Subject: [PATCH 233/251] controller: only update akvs status after all secrets and configmaps are updated --- .../controller/azureKeyVaultSecret.go | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 6b3f3d72..73901aee 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -192,6 +192,10 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { func (c *Controller) syncAzureKeyVault(key string) error { var akvs *akv.AzureKeyVaultSecret var err error + var secretName string + var cmName string + var cmHash string + var secretHash string log.Debugf("checking state for %s in azure", key) if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { @@ -211,11 +215,11 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf(msg) } - akvsValuesHash := getMD5HashOfByteValues(secretValue) + secretHash = getMD5HashOfByteValues(secretValue) log.Debugf("checking if secret value for %s has changed in azure", key) - if akvs.Status.SecretHash != akvsValuesHash { - log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, akvsValuesHash) + if akvs.Status.SecretHash != secretHash { + log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, secretHash) log.Infof("secret has changed in azure key vault for azurekeyvvaultsecret %s. updating secret now", akvs.Name) existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) @@ -233,13 +237,9 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf("failed to update secret, error: %+v", err) } + secretName = secret.Name log.Warningf("secret value will now change for secret '%s' - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) } - - log.Debugf("updating status for azurekeyvaultsecret '%s'", akvs.Name) - if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, akvsValuesHash); err != nil { - return err - } } if c.akvsHasOutputConfigMap(akvs) { @@ -259,21 +259,31 @@ func (c *Controller) syncAzureKeyVault(key string) error { log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, cmHash) log.Infof("secret has changed in azure key vault for azurekeyvvaultsecret %s - updating secret now", akvs.Name) - cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(createNewConfigMap(akvs, cmValue)) + existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{}) if err != nil { - log.Warningf("failed to create secret, error: %+v", err) - return err + return fmt.Errorf("failed to get existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) } - log.Warningf("secret value will now change for secret '%s' - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", cm.Name) - } + updatedCm, err := createNewConfigMapFromExisting(akvs, cmValue, existingCm) + if err != nil { + return fmt.Errorf("failed to update existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) + } - log.Debugf("updating status for azurekeyvaultsecret '%s'", akvs.Name) - if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, cmHash); err != nil { - return err + cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(updatedCm) + if err != nil { + return fmt.Errorf("failed to update configmap, error: %+v", err) + } + + cmName = cm.Name + log.Warningf("configmap value will now change for configmap '%s' - any resources (like pods) using this configmap must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", cm.Name) } } + log.Debugf("updating status for azurekeyvaultsecret '%s'", akvs.Name) + if err = c.updateAzureKeyVaultSecretStatus(akvs, secretName, cmName, secretHash, cmHash); err != nil { + return err + } + log.Debugf("successfully synced azurekeyvaultsecret %s with azure key vault", key) c.recorder.Event(akvs, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) return nil @@ -430,10 +440,14 @@ func hasAzureKeyVaultSecretChangedForConfigMap(akvs *akv.AzureKeyVaultSecret, ak func (c *Controller) updateAzureKeyVaultSecretStatus(akvs *akv.AzureKeyVaultSecret, secretName, cmName, secretHash, cmHash string) error { akvsCopy := akvs.DeepCopy() - akvsCopy.Status.SecretName = secretName - akvsCopy.Status.SecretHash = secretHash - akvsCopy.Status.ConfigMapName = cmName - akvsCopy.Status.ConfigMapHash = cmHash + if secretName != "" { + akvsCopy.Status.SecretName = secretName + akvsCopy.Status.SecretHash = secretHash + } + if cmName != "" { + akvsCopy.Status.ConfigMapName = cmName + akvsCopy.Status.ConfigMapHash = cmHash + } akvsCopy.Status.LastAzureUpdate = c.clock.Now() _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) From 70cf2cb12d7d3cb1174164910ce9336ac6ad0546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 22 Oct 2020 22:30:21 +0200 Subject: [PATCH 234/251] fix input version --- .../controller/azureKeyVaultSecret.go | 20 +++++++++++++++++++ cmd/azure-keyvault-controller/main.go | 3 +-- cmd/azure-keyvault-secrets-webhook/main.go | 4 +--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 73901aee..4bcf91bb 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -21,6 +21,7 @@ package controller import ( "fmt" + "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" @@ -36,6 +37,25 @@ import ( ) func (c *Controller) initAzureKeyVaultSecret() { + done := make(chan bool) + ticker := time.NewTicker(1 * time.Minute) + + go func() { + for { + select { + case <-done: + ticker.Stop() + return + case <-ticker.C: + c.azureKeyVaultQueue + } + } + }() + + // wait for 10 seconds + time.Sleep(10 * time.Second) + done <- true + c.akvsInformerFactory.Keyvault().V2beta1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { akvs, err := convertToAzureKeyVaultSecret(obj) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index f7fcd0ea..6ff1abf9 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -54,7 +54,6 @@ var ( ) func initConfig() { - viper.SetDefault("version", "dev") viper.SetDefault("log_format", "fmt") viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") viper.SetDefault("auth_type", "azureCloudConfig") @@ -73,7 +72,7 @@ func main() { flag.Parse() initConfig() - akv2k8s.Version = viper.GetString("version") + akv2k8s.Version = version setLogLevel(viper.GetString("log_level")) setLogFormat(viper.GetString("log_format")) diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 277ef828..adcad605 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -77,7 +77,6 @@ type azureKeyVaultConfig struct { authServicePortInternal string kubeClient *kubernetes.Clientset credentials credentialprovider.AzureKeyVaultCredentials - version string versionEnvImage string kubeconfig string masterURL string @@ -254,7 +253,7 @@ func init() { func main() { flag.Parse() initConfig() - akv2k8s.Version = config.version + akv2k8s.Version = params.version logLevel := viper.GetString("log_level") setLogLevel(logLevel) @@ -278,7 +277,6 @@ func main() { dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), injectorDir: viper.GetString("env_injector_exec_dir"), - version: params.version, versionEnvImage: params.versionEnvImage, cloudConfig: params.cloudConfig, } From c13052cb984dd537b091fa4e9afbee27fa54b42d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Thu, 22 Oct 2020 22:31:08 +0200 Subject: [PATCH 235/251] configure generator for api v2beta1 --- hack/update-codegen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index db6f8506..eae76f4c 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -27,7 +27,7 @@ CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ${GOPATH}/src/k8s.io/co # instead of the $GOPATH directly. For normal projects this can be dropped. ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis \ - "azurekeyvault:v1alpha1,v1,v2alpha1" \ + "azurekeyvault:v1alpha1,v1,v2beta1" \ --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt # Generate both v1alpha1 and v1 From 1fb49b4a54c9892a86f98a57466aa55ce275ecf6 Mon Sep 17 00:00:00 2001 From: Darren Glynn Date: Fri, 23 Oct 2020 15:15:16 +0300 Subject: [PATCH 236/251] Fix typos in azure-keyvault-env and changelog 1.1 --- CHANGELOG-1.1.md | 2 +- cmd/azure-keyvault-env/main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG-1.1.md b/CHANGELOG-1.1.md index 0c1eb2b4..d7efc3f9 100644 --- a/CHANGELOG-1.1.md +++ b/CHANGELOG-1.1.md @@ -43,7 +43,7 @@ The most notable changes in this release are: * Updated tutorials * Show multiple versions (currently 1.0 and 1.1) - where 1.1 is now default -* Updated authentiction docs to reflect changes in 1.1 +* Updated authentication docs to reflect changes in 1.1 ### Helm Charts diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 393f95fd..9a1cb4ee 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -197,7 +197,7 @@ func main() { }) if config.useAuthService { - logger.Info("using centralized akv2k8s auth service for authentiction with azure key vault") + logger.Info("using centralized akv2k8s auth service for authentication with azure key vault") } else { logger.Debug("akv2k8s auth service not enabled - will look for azure key vault credentials locally") } From 36592e7517b590757627eaf405ffb0890881906e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 25 Oct 2020 23:36:50 +0100 Subject: [PATCH 237/251] * replace logrus with klog v2 * fix log typo --- .../controller/azureKeyVaultSecret.go | 96 ++++------ .../controller/configmap.go | 44 ++--- .../controller/controller.go | 22 +-- .../controller/secret.go | 36 ++-- .../controller/secret_handler.go | 8 +- cmd/azure-keyvault-controller/main.go | 74 +++----- cmd/azure-keyvault-env/authentication.go | 24 ++- cmd/azure-keyvault-env/main.go | 152 ++++++++------- .../authorization.go | 13 +- .../authorization_test.go | 9 +- cmd/azure-keyvault-secrets-webhook/main.go | 178 +++++++++--------- cmd/azure-keyvault-secrets-webhook/pod.go | 38 ++-- .../registry.go | 8 +- go.mod | 1 + 14 files changed, 320 insertions(+), 383 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 4bcf91bb..575c79b3 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -21,90 +21,73 @@ package controller import ( "fmt" - "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" - log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/tools/cache" + "k8s.io/klog/v2" "kmodules.xyz/client-go/tools/queue" ) func (c *Controller) initAzureKeyVaultSecret() { - done := make(chan bool) - ticker := time.NewTicker(1 * time.Minute) - - go func() { - for { - select { - case <-done: - ticker.Stop() - return - case <-ticker.C: - c.azureKeyVaultQueue - } - } - }() - - // wait for 10 seconds - time.Sleep(10 * time.Second) - done <- true - c.akvsInformerFactory.Keyvault().V2beta1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { akvs, err := convertToAzureKeyVaultSecret(obj) if err != nil { - log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + klog.ErrorS(err, "failed to convert to azurekeyvaultsecret") + return } if c.akvsHasOutputDefined(akvs) { - log.Debugf("azurekeyvaultsecret %s/%s added - adding to queue.", akvs.Namespace, akvs.Name) + klog.V(4).InfoS("azurekeyvaultsecret adding to queue.", klog.KObj(akvs)) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) - // queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), obj) } }, UpdateFunc: func(old, new interface{}) { newAkvs, err := convertToAzureKeyVaultSecret(new) if err != nil { - log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + klog.ErrorS(err, "failed to convert to azurekeyvaultsecret") + return } oldAkvs, err := convertToAzureKeyVaultSecret(old) if err != nil { - log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + klog.ErrorS(err, "failed to convert to azurekeyvaultsecret") + return } // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv if newAkvs.ResourceVersion == oldAkvs.ResourceVersion && c.akvsHasOutputDefined(newAkvs) { - log.Debugf("azurekeyvaultsecret %s/%s not changed - adding to azure key vault queue to check if secret has changed in azure key vault", newAkvs.Namespace, newAkvs.Name) + klog.V(4).InfoS("azurekeyvaultsecret not changed - adding to azure key vault queue to check if secret has changed in azure key vault", klog.KObj(newAkvs)) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } if c.akvsHasOutputDefined(newAkvs) || c.akvsHasOutputDefined(oldAkvs) { - log.Debugf("azurekeyvaultsecret %s/%s changed - adding to queue.", newAkvs.Namespace, newAkvs.Name) + klog.V(4).InfoS("azurekeyvaultsecret changed - adding to queue", klog.KObj(newAkvs)) queue.Enqueue(c.akvsCrdQueue.GetQueue(), new) } }, DeleteFunc: func(obj interface{}) { akvs, err := convertToAzureKeyVaultSecret(obj) if err != nil { - log.Errorf("failed to convert to azurekeyvaultsecret: %v", err) + klog.ErrorS(err, "failed to convert to azurekeyvaultsecret") + return } if c.akvsHasOutputDefined(akvs) { - log.Debugf("azurekeyvaultsecret %s/%s deleted - adding to queue.", akvs.Namespace, akvs.Name) + klog.V(4).InfoS("azurekeyvaultsecret deleted - adding to queue", klog.KObj(akvs)) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) err = c.deleteKubernetesValues(akvs) if err != nil { - log.Errorf("failed to delete secret data from azurekeyvaultsecret %s, error: %+v", akvs.Name, err) + klog.ErrorS(err, "failed to delete secret data from azurekeyvaultsecret", klog.KObj(akvs)) } // Getting default key to remove from Azure work queue @@ -123,7 +106,7 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { var akvs *akv.AzureKeyVaultSecret var err error - log.Debugf("processing azurekeyvaultsecret %s", key) + klog.V(4).InfoS("processing azurekeyvaultsecret", "key", key) if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil @@ -138,7 +121,7 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { return err } - log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", klog.KObj(akvs), klog.KObj(secret)) c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = secret } @@ -149,14 +132,13 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { return err } - log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes configmap %s", key, fmt.Sprintf("%s/%s", cm.Namespace, cm.Name)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", klog.KObj(akvs), klog.KObj(cm)) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = cm } if !isOwnedBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner msg := fmt.Sprintf(MessageResourceExists, outputObject.GetName()) - log.Warning(msg) c.recorder.Event(akvs, corev1.EventTypeWarning, ErrResourceExists, msg) return fmt.Errorf(msg) } @@ -168,7 +150,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { var akvs *akv.AzureKeyVaultSecret var err error - log.Debugf("processing azurekeyvaultsecret %s", key) + klog.V(4).InfoS("processing azurekeyvaultsecret", "key", key) if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil @@ -183,7 +165,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return err } - log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes secret %s", key, fmt.Sprintf("%s/%s", secret.Namespace, secret.Name)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", klog.KObj(akvs), klog.KObj(secret)) c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = secret } @@ -194,14 +176,13 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return err } - log.Debugf("successfully synced azurekeyvaultsecret %s with kubernetes configmap %s", key, fmt.Sprintf("%s/%s", cm.Namespace, cm.Name)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", klog.KObj(akvs), klog.KObj(cm)) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = cm } if !isOwnedBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner msg := fmt.Sprintf(MessageResourceExists, outputObject.GetName()) - log.Warning(msg) c.recorder.Event(akvs, corev1.EventTypeWarning, ErrResourceExists, msg) return fmt.Errorf(msg) } @@ -217,7 +198,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { var cmHash string var secretHash string - log.Debugf("checking state for %s in azure", key) + klog.V(4).InfoS("checking state of azurekeyvaultsecret in azure key vault", "key", key) if akvs, err = c.getAzureKeyVaultSecret(key); err != nil { if exit := handleKeyVaultError(err, key); exit { return nil @@ -226,22 +207,21 @@ func (c *Controller) syncAzureKeyVault(key string) error { } if c.akvsHasOutputSecret(akvs) { - log.Debugf("getting secret value for %s in azure", key) + klog.V(4).InfoS("getting secret value from azure key vault", klog.KObj(akvs)) secretValue, err := c.getSecretFromKeyVault(akvs) if err != nil { msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) - log.Errorf("failed to get secret value for '%s' from azure key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg) return fmt.Errorf(msg) } secretHash = getMD5HashOfByteValues(secretValue) - log.Debugf("checking if secret value for %s has changed in azure", key) + klog.V(4).InfoS("checking if secret value has changed in azure", klog.KObj(akvs)) if akvs.Status.SecretHash != secretHash { - log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, secretHash) - log.Infof("secret has changed in azure key vault for azurekeyvvaultsecret %s. updating secret now", akvs.Name) + klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, klog.KObj(akvs)) + klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating secret now", klog.KObj(akvs)) existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) @@ -258,27 +238,26 @@ func (c *Controller) syncAzureKeyVault(key string) error { } secretName = secret.Name - log.Warningf("secret value will now change for secret '%s' - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name) + klog.V(2).InfoS("secret value will now change for secret - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", klog.KObj(secret), klog.KObj(akvs)) } } if c.akvsHasOutputConfigMap(akvs) { - log.Debugf("getting secret value for %s in azure", key) + klog.V(4).InfoS("getting secret value from azure key vault", klog.KObj(akvs)) cmValue, err := c.getConfigMapFromKeyVault(akvs) if err != nil { msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) - log.Errorf("failed to get secret value for '%s' from azure key vault '%s' using object name '%s', error: %+v", key, akvs.Spec.Vault.Name, akvs.Spec.Vault.Object.Name, err) c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg) return fmt.Errorf(msg) } cmHash := getMD5HashOfStringValues(cmValue) - log.Debugf("checking if secret value for %s has changed in azure", key) + klog.V(4).InfoS("checking if secret value has changed in azure key vault", klog.KObj(akvs)) if akvs.Status.ConfigMapHash != cmHash { - log.Debugf("secret value has changed in azure key vault - current hash %s, previous hash %s", akvs.Status.SecretHash, cmHash) - log.Infof("secret has changed in azure key vault for azurekeyvvaultsecret %s - updating secret now", akvs.Name) + klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, klog.KObj(akvs)) + klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating configmap now", klog.KObj(akvs)) existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) @@ -295,16 +274,16 @@ func (c *Controller) syncAzureKeyVault(key string) error { } cmName = cm.Name - log.Warningf("configmap value will now change for configmap '%s' - any resources (like pods) using this configmap must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", cm.Name) + klog.V(2).InfoS("configmap value will now change for configmap - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", klog.KObj(akvs), klog.KObj(cm)) } } - log.Debugf("updating status for azurekeyvaultsecret '%s'", akvs.Name) + klog.V(4).InfoS("updating status for azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatus(akvs, secretName, cmName, secretHash, cmHash); err != nil { return err } - log.Debugf("successfully synced azurekeyvaultsecret %s with azure key vault", key) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with azure key vault", klog.KObj(akvs)) c.recorder.Event(akvs, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) return nil } @@ -413,7 +392,6 @@ func (c *Controller) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecre return nil, fmt.Errorf("invalid resource key: %s", key) } - log.Debugf("getting azurekeyvaultsecret %s from namespace %s", name, namespace) azureKeyVaultSecret, err := c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(namespace).Get(name) if err != nil { @@ -483,7 +461,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKey akvsCopy.Status.SecretHash = secretHash akvsCopy.Status.LastAzureUpdate = now - log.Debugf("updating status of azurekeyvaultsecert %s - secretname: %s, secrethash: %s, lastazureupdate: %s", akvsCopy.Name, secretName, secretHash, now) + klog.V(4).InfoS("updating secret status of azurekeyvaultsecert", klog.KObj(akvs), klog.KRef(akvs.Namespace, secretName), "hash", secretHash) _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } @@ -496,19 +474,17 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.Azure akvsCopy.Status.ConfigMapHash = cmHash akvsCopy.Status.LastAzureUpdate = c.clock.Now() + klog.V(4).InfoS("updating configmap status of azurekeyvaultsecert", klog.KObj(akvs), klog.KRef(akvs.Namespace, cmName), "hash", cmHash) _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } func handleKeyVaultError(err error, key string) bool { - log.Debugf("handling error for '%s' in azurekeyvaultsecret: %s", key, err.Error()) exit := false if err != nil { // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. if errors.IsNotFound(err) { - log.Debugf("error for '%s' was 'not found'", key) - - log.Errorf("azurekeyvaultsecret '%s' in work queue no longer exists", key) + klog.V(2).InfoS("azurekeyvaultsecret in work queue no longer exists", "key", key) exit = true } } diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index d71cb001..07dba2bf 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -27,13 +27,12 @@ import ( "sort" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" - log "github.com/sirupsen/logrus" + "k8s.io/klog/v2" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/tools/cache" ) @@ -61,7 +60,7 @@ func (c *Controller) getConfigMapByKey(key string) (*corev1.ConfigMap, error) { } func (c *Controller) getConfigMap(ns, name string) (*corev1.ConfigMap, error) { - log.Debugf("getting configmap %s from namespace %s", name, ns) + klog.V(4).InfoS("getting configmap", klog.KRef(ns, name)) cm, err := c.configMapsLister.ConfigMaps(ns).Get(name) if err != nil { @@ -109,11 +108,12 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre return nil, fmt.Errorf("output configmap name must be specified using spec.output.configMap.name") } - log.Debugf("get or create configmap %s in namespace %s", cmName, akvs.Namespace) + klog.V(4).InfoS("get or create configmap", klog.KRef(akvs.Namespace, cmName)) if cm, err = c.configMapsLister.ConfigMaps(akvs.Namespace).Get(cmName); err != nil { - log.Debugf("failed to get configmap %s in namespace %s, error: %+v", cmName, akvs.Namespace, err) + klog.V(4).ErrorS(err, "failed to get configmap ", klog.KRef(akvs.Namespace, cmName)) if errors.IsNotFound(err) { - log.Debug("getting secret from azure key vault") + klog.V(4).InfoS("configmap was not found", klog.KRef(akvs.Namespace, cmName)) + klog.V(4).InfoS("getting configmap value from azure key vault", klog.KRef(akvs.Namespace, cmName)) cmValues, err = c.getConfigMapFromKeyVault(akvs) if err != nil { return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) @@ -123,7 +123,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre return nil, fmt.Errorf("failed to create new configmap, err: %+v", err) } - log.Infof("updating status for azurekeyvaultsecret '%s'", akvs.Name) + klog.V(2).InfoS("updating status for azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, getMD5HashOfStringValues(cmValues)); err != nil { return nil, fmt.Errorf("failed to update status for azurekeyvaultsecret %s, error: %+v", akvs.Name, err) } @@ -133,7 +133,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } // get updated secret values from azure key vault - log.Debug("getting secret from azure key vault") + klog.V(4).InfoS("getting secret from azure key vault", akvs) cmValues, err = c.getConfigMapFromKeyVault(akvs) if err != nil { return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) @@ -158,7 +158,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) { - log.Infof("azurekeyvaultsecret %s/%s output.configmap values has changed and requires update to configmap %s", akvs.Namespace, akvs.Name, cmName) + klog.V(2).InfoS("azurekeyvaultsecret has changed and requires update to configmap %s", klog.KObj(akvs), klog.KObj(cm)) updatedCM, err := createNewConfigMapFromExisting(akvs, cmValues, cm) if err != nil { @@ -168,9 +168,6 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(updatedCM) } - if err != nil { - log.Warnf("error still exists while creating/updating configmap %s, error: %+v", cmName, err) - } return cm, err } @@ -328,16 +325,13 @@ func sortStringValueKeys(values map[string]string) []string { return keys } -func handleConfigMapError(err error, key string) bool { - log.Debugf("Handling error for '%s' in ConfigMap: %s", key, err.Error()) - if err != nil { - // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. - if errors.IsNotFound(err) { - log.Debugf("Error for '%s' was 'Not Found'", key) - - utilruntime.HandleError(fmt.Errorf("ConfigMap '%s' in work queue no longer exists", key)) - return true - } - } - return false -} +// func handleConfigMapError(err error, key string) bool { +// if err != nil { +// // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. +// if errors.IsNotFound(err) { +// klog.V(2).InfoS("configmap in work queue no longer exists", "key", key) +// return true +// } +// } +// return false +// } diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index 3a7ac46f..ae02bfb9 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -24,7 +24,7 @@ import ( "github.com/appscode/go/runtime" "github.com/pkg/errors" - log "github.com/sirupsen/logrus" + "k8s.io/klog/v2" corev1 "k8s.io/api/core/v1" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -111,8 +111,6 @@ type Controller struct { options *Options clock Timer - - akvLogger *log.Entry } // Options contains options for the controller @@ -130,8 +128,6 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI // logged for azure-keyvault-controller types. utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme)) - akvLogger := log.WithFields(log.Fields{"component": "akvs"}) - controller := &Controller{ kubeclientset: client, akvsClient: akvsClient, @@ -147,15 +143,13 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI options: options, clock: &Clock{}, - - akvLogger: akvLogger, } controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret) controller.akvsCrdDeletionQueue = queue.New("DeletedAzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncDeletedAzureKeyVaultSecret) controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) - log.Info("Setting up event handlers") + klog.InfoS("Setting up event handlers") controller.initAzureKeyVaultSecret() return controller @@ -166,7 +160,7 @@ func (c *Controller) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() // Start the informer factories to begin populating the informer caches - log.Info("Starting AzureKeyVaultSecret controller") + klog.Info("Starting AzureKeyVaultSecret controller") c.akvsInformerFactory.Start(stopCh) c.kubeInformerFactory.Start(stopCh) @@ -184,16 +178,16 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } } - log.Info("starting azure key vault secret queue") + klog.InfoS("starting azure key vault secret queue") c.akvsCrdQueue.Run(stopCh) - log.Info("starting azure key vault deleted secret queue") + klog.InfoS("starting azure key vault deleted secret queue") c.akvsCrdDeletionQueue.Run(stopCh) - log.Info("starting azure key vault queue") + klog.InfoS("starting azure key vault queue") c.azureKeyVaultQueue.Run(stopCh) - log.Info("started workers") + klog.InfoS("started workers") <-stopCh - log.Info("Shutting down workers") + klog.InfoS("Shutting down workers") } diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 92a410db..e5e9cee8 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -27,13 +27,12 @@ import ( "sort" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" - log "github.com/sirupsen/logrus" + "k8s.io/klog/v2" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/tools/cache" ) @@ -62,7 +61,7 @@ func (c *Controller) getSecretByKey(key string) (*corev1.Secret, error) { } func (c *Controller) getSecret(ns, name string) (*corev1.Secret, error) { - log.Debugf("Getting Secret %s from namespace %s", name, ns) + klog.V(4).InfoS("getting secret", klog.KRef(ns, name)) secret, err := c.secretsLister.Secrets(ns).Get(name) if err != nil { @@ -110,7 +109,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name") } - log.Debugf("Get or create secret %s in namespace %s", secretName, akvs.Namespace) + klog.V(4).InfoS("get or create secret", klog.KRef(akvs.Namespace, secretName)) if secret, err = c.secretsLister.Secrets(akvs.Namespace).Get(secretName); err != nil { if errors.IsNotFound(err) { secretValues, err = c.getSecretFromKeyVault(akvs) @@ -122,7 +121,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) return nil, err } - log.Infof("Updating status for AzureKeyVaultSecret '%s'", akvs.Name) + klog.V(2).InfoS("updating status for azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, getMD5HashOfByteValues(secretValues)); err != nil { return nil, err } @@ -157,7 +156,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) } if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { - log.Infof("azurekeyvaultsecret %s/%s values has changed and requires update to secret %s", akvs.Namespace, akvs.Name, secretName) + klog.Infof("azurekeyvaultsecret values has changed and requires update to secret", klog.KObj(akvs), klog.KObj(secret)) updatedSecret, err := createNewSecretFromExisting(akvs, secretValues, secret) if err != nil { @@ -360,16 +359,15 @@ func sortByteValueKeys(values map[string][]byte) []string { return keys } -func handleSecretError(err error, key string) bool { - log.Debugf("Handling error for '%s' in Secret: %s", key, err.Error()) - if err != nil { - // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. - if errors.IsNotFound(err) { - log.Debugf("Error for '%s' was 'Not Found'", key) - - utilruntime.HandleError(fmt.Errorf("Secret '%s' in work queue no longer exists", key)) - return true - } - } - return false -} +// func handleSecretError(err error, key string) bool { +// if err != nil { +// // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. +// if errors.IsNotFound(err) { +// log.Debugf("Error for '%s' was 'Not Found'", key) + +// utilruntime.HandleError(fmt.Errorf("Secret '%s' in work queue no longer exists", key)) +// return true +// } +// } +// return false +// } diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index dc677882..54d9a419 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -24,9 +24,9 @@ import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" - log "github.com/sirupsen/logrus" yaml "gopkg.in/yaml.v2" corev1 "k8s.io/api/core/v1" + "k8s.io/klog/v2" ) // KubernetesSecretHandler handles getting and formatting secrets from Azure Key Vault to Kubernetes @@ -96,7 +96,7 @@ func NewAzureMultiKeySecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultSer // Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes func (h *azureSecretHandler) HandleSecret() (map[string][]byte, error) { if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.Secret.DataKey != "" { - log.Warnf("output data key for %s/%s ignored, since vault object type is '%s' it will use its own keys", h.secretSpec.Namespace, h.secretSpec.Name, akv.AzureKeyVaultObjectTypeMultiKeyValueSecret) + klog.V(2).InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec)) } values := make(map[string][]byte) @@ -143,7 +143,7 @@ func (h *azureSecretHandler) HandleSecret() (map[string][]byte, error) { // Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes func (h *azureSecretHandler) HandleConfigMap() (map[string]string, error) { if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.ConfigMap.DataKey != "" { - log.Warnf("output data key for %s/%s ignored, since vault object type is '%s' it will use its own keys", h.secretSpec.Namespace, h.secretSpec.Name, akv.AzureKeyVaultObjectTypeMultiKeyValueSecret) + klog.V(2).InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec)) } values := make(map[string]string) @@ -180,8 +180,6 @@ func (h *azureCertificateHandler) HandleSecret() (map[string][]byte, error) { return nil, fmt.Errorf("no datakey specified for output secret") } - log.Infof("Exporting certificate with private key: %t", options.ExportPrivateKey) - cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, &options) if err != nil { return nil, err diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 6ff1abf9..03ce1381 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -21,10 +21,10 @@ package main import ( "flag" + "fmt" "os" "time" - log "github.com/sirupsen/logrus" "github.com/spf13/viper" corev1 "k8s.io/api/core/v1" @@ -34,6 +34,7 @@ import ( typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/record" + "k8s.io/klog/v2" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/cmd/azure-keyvault-controller/controller" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s" @@ -51,17 +52,17 @@ var ( kubeconfig string masterURL string cloudconfig string + logLevel string ) func initConfig() { - viper.SetDefault("log_format", "fmt") - viper.SetDefault("cloudconfig", "/etc/kubernetes/azure.json") viper.SetDefault("auth_type", "azureCloudConfig") viper.AutomaticEnv() } func init() { + flag.StringVar(&logLevel, "v", "2", "klog log level") flag.StringVar(&version, "version", "", "Version of this component.") flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") @@ -69,20 +70,15 @@ func init() { } func main() { + klog.InitFlags(nil) + defer klog.Flush() + flag.Parse() initConfig() akv2k8s.Version = version - - setLogLevel(viper.GetString("log_level")) - setLogFormat(viper.GetString("log_format")) - akv2k8s.LogVersion() - // kubeconfig := viper.GetString("kubeconfig") - // masterURL := viper.GetString("master") - cloudConfig := viper.GetString("cloudconfig") - authType := viper.GetString("auth_type") // set up signals so we handle the first shutdown signal gracefully @@ -90,41 +86,47 @@ func main() { cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig) if err != nil { - log.Fatalf("Error building kubeconfig: %s", err.Error()) + klog.ErrorS(err, "failed to build kube config", "master", masterURL, "kubeconfig", kubeconfig) + os.Exit(1) } kubeClient, err := kubernetes.NewForConfig(cfg) if err != nil { - log.Fatalf("Error building kubernetes clientset: %s", err.Error()) + klog.ErrorS(err, "failed to build kube clientset", "master", masterURL, "kubeconfig", kubeconfig) + os.Exit(1) } azureKeyVaultSecretClient, err := clientset.NewForConfig(cfg) if err != nil { - log.Fatalf("Error building azureKeyVaultSecret clientset: %s", err.Error()) + klog.ErrorS(err, "failed to build clientset for azurekeyvaultsecret", "master", masterURL, "kubeconfig", kubeconfig) + os.Exit(1) } kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30) azureKeyVaultSecretInformerFactory := informers.NewSharedInformerFactory(azureKeyVaultSecretClient, time.Second*30) - log.Info("Creating event broadcaster") + klog.V(2).InfoS("Creating event broadcaster") eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(log.Tracef) + eventBroadcaster.StartLogging(klog.V(4).InfoS) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) var vaultAuth credentialprovider.AzureKeyVaultCredentials switch authType { case "azureCloudConfig": - vaultAuth, err = getCredentialsFromCloudConfig(cloudConfig) + vaultAuth, err = getCredentialsFromCloudConfig(cloudconfig) if err != nil { - log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error()) + klog.ErrorS(err, "failed to create cloud config provider for azure key vault", "file", cloudconfig) + os.Exit(1) } case "environment": vaultAuth, err = getCredentialsFromEnvironment() if err != nil { - log.Fatalf("failed to get azure key vault credentials, error: %+v", err.Error()) + klog.ErrorS(err, "failed to create credentials provider from environment for azure key vault") + os.Exit(1) } default: - log.Fatalf("auth type %s not supported", authType) + klog.ErrorS(nil, "auth type not supported", "type", authType) + os.Exit(1) } vaultService := vault.NewService(vaultAuth) @@ -147,42 +149,16 @@ func main() { controller.Run(stopCh) } -func setLogFormat(logFormat string) { - switch logFormat { - case "fmt": - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) - case "json": - log.SetFormatter(&log.JSONFormatter{}) - default: - log.Warnf("Log format %s not supported - using default fmt", logFormat) - } -} - -func setLogLevel(logLevel string) { - if logLevel == "" { - logLevel = log.InfoLevel.String() - } - - logrusLevel, err := log.ParseLevel(logLevel) - if err != nil { - log.Fatalf("error setting log level: %s", err.Error()) - } - log.SetLevel(logrusLevel) -} - func getCredentialsFromCloudConfig(cloudconfig string) (credentialprovider.AzureKeyVaultCredentials, error) { f, err := os.Open(cloudconfig) if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) + return nil, fmt.Errorf("failed reading azure config from %s, error: %+v", cloudconfig, err) } defer f.Close() cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", cloudconfig, err) + return nil, fmt.Errorf("Failed reading azure config from %s, error: %+v", cloudconfig, err) } return cloudCnfProvider.GetAzureKeyVaultCredentials() @@ -191,7 +167,7 @@ func getCredentialsFromCloudConfig(cloudconfig string) (credentialprovider.Azure func getCredentialsFromEnvironment() (credentialprovider.AzureKeyVaultCredentials, error) { provider, err := credentialprovider.NewFromEnvironment() if err != nil { - log.Fatalf("failed to create azure credentials provider, error: %+v", err.Error()) + return nil, fmt.Errorf("failed to create azure credentials provider, error: %+v", err) } return provider.GetAzureKeyVaultCredentials() diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go index 2bb96323..b3954ba7 100644 --- a/cmd/azure-keyvault-env/authentication.go +++ b/cmd/azure-keyvault-env/authentication.go @@ -29,10 +29,12 @@ import ( "fmt" "io/ioutil" "net/http" + "os" "path" "time" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" + "k8s.io/klog/v2" ) func createHTTPClientWithTrustedCAAndMtls(caCert, clientCert, clientKey []byte) (*http.Client, error) { @@ -79,15 +81,17 @@ func getCredentials(useAuthService bool, authServiceAddress string, clientCertDi client, err := createHTTPClientWithTrustedCAAndMtls(caCert, clientCert, clientKey) if err != nil { - logger.Fatalf("failed to download ca cert, error: %+v", err) + klog.ErrorS(err, "failed to download ca cert") + os.Exit(1) } url := fmt.Sprintf("https://%s/auth/%s/%s", authServiceAddress, config.namespace, config.podName) - logger.Infof("requesting azure key vault oauth token from %s", url) + klog.InfoS("requesting azure key vault oauth token", "url", url) res, err := client.Get(url) if err != nil { - logger.Fatalf("request token failed from %s, error: %+v", url, err) + klog.ErrorS(err, "request token failed", "url", url) + os.Exit(1) } defer res.Body.Close() @@ -102,7 +106,7 @@ func getCredentials(useAuthService bool, authServiceAddress string, clientCertDi return nil, fmt.Errorf("failed to decode body, error %+v", err) } - logger.Info("successfully received oauth token") + klog.InfoS("successfully received oauth token") return creds, nil } @@ -148,24 +152,28 @@ func parseRsaPublicKey(pubPem string) (*rsa.PublicKey, error) { func validateArgsSignature(origArgs, signatureB64, pubKeyBase64 string) { signatureArray, err := base64.StdEncoding.DecodeString(signatureB64) if err != nil { - logger.Fatalf("failed to decode base64 signature string, error: %+v", err) + klog.ErrorS(err, "failed to decode base64 signature string") + os.Exit(1) } signature := string(signatureArray) bPubKey, err := base64.StdEncoding.DecodeString(pubKeyBase64) if err != nil { - logger.Fatalf("failed to decode base64 public key string, error: %+v", err) + klog.ErrorS(err, "failed to decode base64 public key string") + os.Exit(1) } pubKey := string(bPubKey) pubRsaKey, err := parseRsaPublicKey(pubKey) if err != nil { - logger.Fatalf("failed to parse rsa public key to verify args: %+v", err) + klog.ErrorS(err, "failed to parse rsa public key to verify args") + os.Exit(1) } if !verifyPKCS(signature, origArgs, *pubRsaKey) { - logger.Fatal("args does not match original args defined by env-injector") + klog.ErrorS(fmt.Errorf("pkcs signature verification failed"), "args does not match original args defined by env-injector") + os.Exit(1) } } diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 9a1cb4ee..305f050f 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -30,10 +30,10 @@ import ( vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned" - log "github.com/sirupsen/logrus" "github.com/spf13/viper" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" + "k8s.io/klog/v2" ) const ( @@ -54,30 +54,29 @@ type injectorConfig struct { } var config injectorConfig -var logger *log.Entry type stop struct { error } -func formatLogger(logFormat string) { - switch logFormat { - case "fmt": - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) - case "json": - log.SetFormatter(&log.JSONFormatter{}) - default: - log.Warnf("Log format %s not supported - using default fmt", logFormat) - } - - logger = log.WithFields(log.Fields{ - "component": "akv2k8s", - "application": "env-injector", - }) -} +// func formatLogger(logFormat string) { +// switch logFormat { +// case "fmt": +// log.SetFormatter(&log.TextFormatter{ +// DisableColors: true, +// FullTimestamp: true, +// }) +// case "json": +// log.SetFormatter(&log.JSONFormatter{}) +// default: +// log.Warnf("Log format %s not supported - using default fmt", logFormat) +// } + +// logger = log.WithFields(log.Fields{ +// "component": "akv2k8s", +// "application": "env-injector", +// }) +// } // Retry will wait for a duration, retry n times, return if succeed or fails // Thanks to Nick Stogner: https://upgear.io/blog/simple-golang-retry-function/ @@ -130,17 +129,17 @@ func initConfig() { viper.AutomaticEnv() } -func setLogLevel(logLevel string) { - if logLevel == "" { - logLevel = log.InfoLevel.String() - } +// func setLogLevel(logLevel string) { +// if logLevel == "" { +// logLevel = log.InfoLevel.String() +// } - logrusLevel, err := log.ParseLevel(logLevel) - if err != nil { - log.Errorf("error setting log level: %s", err.Error()) - } - log.SetLevel(logrusLevel) -} +// logrusLevel, err := log.ParseLevel(logLevel) +// if err != nil { +// log.Errorf("error setting log level: %s", err.Error()) +// } +// log.SetLevel(logrusLevel) +// } func validateConfig(requiredEnvVars map[string]string) error { for key, value := range requiredEnvVars { @@ -152,6 +151,9 @@ func validateConfig(requiredEnvVars map[string]string) error { } func main() { + klog.InitFlags(nil) + defer klog.Flush() + initConfig() akv2k8s.Version = viper.GetString("version") @@ -160,13 +162,13 @@ func main() { var origArgs []string var err error - logLevel := viper.GetString("env_injector_log_level") - setLogLevel(logLevel) - logFormat := viper.GetString("env_injector_log_format") - formatLogger(logFormat) + // logLevel := viper.GetString("env_injector_log_level") + // setLogLevel(logLevel) + // logFormat := viper.GetString("env_injector_log_format") + // formatLogger(logFormat) akv2k8s.LogVersion() - logger.Debugf("azure key vault env injector initializing") + klog.InfoS("azure key vault env injector initializing") config = injectorConfig{ namespace: viper.GetString("env_injector_pod_namespace"), @@ -189,25 +191,23 @@ func main() { err = validateConfig(requiredEnvVars) if err != nil { - logger.Fatalf("failed validating config, error: %+v", err) + klog.ErrorS(err, "failed validating config") + os.Exit(1) } - logger = logger.WithFields(log.Fields{ - "namespace": config.namespace, - }) - if config.useAuthService { - logger.Info("using centralized akv2k8s auth service for authentication with azure key vault") + klog.V(4).InfoS("using centralized akv2k8s auth service for authentication with azure key vault") } else { - logger.Debug("akv2k8s auth service not enabled - will look for azure key vault credentials locally") + klog.V(2).InfoS("akv2k8s auth service not enabled - will look for azure key vault credentials locally") } if len(os.Args) == 1 { - logger.Fatal("no command is given, currently vault-env can't determine the entrypoint (command), please specify it explicitly") + klog.ErrorS(err, "no command is given") + os.Exit(1) } else { origCommand, err = exec.LookPath(os.Args[1]) if err != nil { - logger.Fatalf("binary not found: %+v", err) + klog.ErrorS(err, "binary not found") } origArgs = os.Args[1:] @@ -216,37 +216,39 @@ func main() { validateArgsSignature(strings.Join(origArgs, " "), config.signatureB64, config.pubKeyBase64) } - logger.Infof("found original container command to be %s %s", origCommand, origArgs) + klog.InfoS("found original container command", "cmd", origCommand, "args", origArgs) } creds, err := getCredentials(config.useAuthService, config.authServiceAddress, config.clientCertDir) if err != nil { - log.Warnf("failed to get credentials, will retry %d times", config.retryTimes) + klog.V(4).InfoS("failed to get credentials, will retry", "retryTimes", config.retryTimes) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { creds, err = getCredentials(config.useAuthService, config.authServiceAddress, config.clientCertDir) if err != nil { - logger.Warnf("failed to get credentials, error: %+v", err) return err } - logger.Info("succeded getting credentials") + klog.Info("succeded getting credentials") return nil }) if err != nil { - logger.Fatalf("failed to get credentials %d times, error: %+v", config.retryTimes, err) + klog.ErrorS(err, "failed to get credentials", "failedTimes", config.retryTimes) + os.Exit(1) } } vaultService := vault.NewService(creds) - logger.Debug("reading azurekeyvaultsecret's referenced in env variables") + klog.V(4).InfoS("reading azurekeyvaultsecret's referenced in env variables") cfg, err := rest.InClusterConfig() if err != nil { - logger.Fatalf("error building kubeconfig: %s", err.Error()) + klog.ErrorS(err, "error building kubeconfig") + os.Exit(1) } azureKeyVaultSecretClient, err := clientset.NewForConfig(cfg) if err != nil { - logger.Fatalf("error building azurekeyvaultsecret clientset: %+v", err) + klog.ErrorS(err, "error building azurekeyvaultsecret clientset") + os.Exit(1) } environ := os.Environ() @@ -259,63 +261,69 @@ func main() { // e.g. my-akv-secret-name@azurekeyvault?some-sub-key if strings.Contains(value, envLookupKey) { // e.g. my-akv-secret-name?some-sub-key - logger.Debugf("found env var '%s' to get azure key vault secret for", name) + klog.V(4).InfoS("found env var to get azure key vault secret for", "env", name) secretName := strings.Join(strings.Split(value, envLookupKey), "") if secretName == "" { - logger.Fatalf("error extracting secret name from env variable '%s' with lookup value '%s' - not properly formatted", name, value) + klog.ErrorS(fmt.Errorf("error extracting secret name"), "env variable not properly formatted", "env", name, "value", value) + os.Exit(1) } var secretQuery string if query := strings.Split(secretName, "?"); len(query) > 1 { if len(query) > 2 { - logger.Fatalf("error extracting secret query from '%s' - has multiple query elements defined with '?' - only one supported", secretName) + klog.ErrorS(fmt.Errorf("error extracting secret query"), "multiple query elements defined with '?' - only one supported", "secret", secretName) + os.Exit(1) } secretName = query[0] secretQuery = query[1] - logger.Debugf("found query in env var '%s', '%s'", value, secretQuery) + klog.V(4).InfoS("found query in env var", "env", name, "value", value, "query", secretQuery) } - logger.Debugf("getting azurekeyvaultsecret resource '%s' from kubernetes", secretName) - keyVaultSecretSpec, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + klog.V(4).InfoS("getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) + akvs, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { - logger.Warnf("failed to get azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error()) - logger.Infof("will retry getting azurekeyvaultsecret resource up to %d times, waiting %d seconds between retries", config.retryTimes, config.waitTimeBetweenRetries) + klog.ErrorS(err, "failed to get azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) + klog.InfoS("will retry getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName), "retryTimes", config.retryTimes, "delay", config.waitTimeBetweenRetries) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { - keyVaultSecretSpec, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + akvs, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) if err != nil { - logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %+v", secretName, err) + klog.V(4).ErrorS(err, "error getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) return err } - logger.Infof("succeded getting azurekeyvaultsecret resource '%s'", secretName) + klog.InfoS("succeded getting azurekeyvaultsecret", klog.KObj(akvs)) return nil }) if err != nil { - logger.Fatalf("error getting azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error()) + klog.ErrorS(err, "error getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) + os.Exit(1) } } - logger.Debugf("getting secret value for '%s' from azure key vault, to inject into env var %s", keyVaultSecretSpec.Spec.Vault.Object.Name, name) - secret, err := getSecretFromKeyVault(keyVaultSecretSpec, secretQuery, vaultService) + klog.V(4).InfoS("getting secret value for from azure key vault, to inject into env var", klog.KObj(akvs), "env", name) + secret, err := getSecretFromKeyVault(akvs, secretQuery, vaultService) if err != nil { - logger.Fatalf("failed to read secret '%s', error %+v", keyVaultSecretSpec.Spec.Vault.Object.Name, err) + klog.ErrorS(err, "failed to read secret from azure key vault", klog.KObj(akvs)) + os.Exit(1) } if secret == "" { - logger.Fatalf("secret not found in azure key vault: %s", keyVaultSecretSpec.Spec.Vault.Object.Name) + klog.ErrorS(fmt.Errorf("secret value empty"), "secret not found in azure key vault", klog.KObj(akvs)) + os.Exit(1) } else { - logger.Infof("secret %s injected into env var %s for executable %s", keyVaultSecretSpec.Spec.Vault.Object.Name, name, origCommand) + klog.InfoS("secret injected into env var", klog.KObj(akvs), "env", name) environ[i] = fmt.Sprintf("%s=%s", name, secret) } } } - logger.Infof("starting process %s %v with secrets in env vars", origCommand, origArgs) + klog.InfoS("starting process with secrets in env vars", "cmd", origCommand, "args", origArgs) err = syscall.Exec(origCommand, origArgs, environ) if err != nil { - logger.Fatalf("failed to exec process '%s': %s", origCommand, err.Error()) + klog.ErrorS(err, "failed to execute process", "process", origCommand) + os.Exit(1) } - logger.Info("azure key vault env injector successfully injected env variables with secrets") + klog.InfoS("azure key vault env injector successfully injected env variables with secrets") } diff --git a/cmd/azure-keyvault-secrets-webhook/authorization.go b/cmd/azure-keyvault-secrets-webhook/authorization.go index 4bc30d4b..c70290ff 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization.go @@ -2,17 +2,15 @@ package main import ( "fmt" - "strings" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) type podData struct { - remoteAddress string - name string - namespace string - token string + name string + namespace string + token string } func authorize(clientset kubernetes.Interface, podData podData) error { @@ -30,11 +28,6 @@ func authorize(clientset kubernetes.Interface, podData podData) error { return fmt.Errorf("failed to get pod '%s' in namespace '%s', error: %+v", podData.name, podData.namespace, err) } - remoteIP := strings.Split(podData.remoteAddress, ":")[0] - if pod.Status.PodIP != remoteIP { - return fmt.Errorf("the provided pod data does not correspond with caller ip") - } - containerHasInjectorCmd := false for _, container := range pod.Spec.Containers { if len(container.Command) > 0 && container.Command[0] == "/azure-keyvault/azure-keyvault-env" { diff --git a/cmd/azure-keyvault-secrets-webhook/authorization_test.go b/cmd/azure-keyvault-secrets-webhook/authorization_test.go index 98f40cc6..d0cbebe5 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization_test.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization_test.go @@ -88,8 +88,6 @@ func createPod(name string, namespace string, multipleContainers bool) *corev1.P }, } - pod.Status.PodIP = "127.0.0.1" - podSpec := corev1.PodSpec{ InitContainers: []corev1.Container{ corev1.Container{ @@ -119,10 +117,9 @@ func TestMultipleContainersInPod(t *testing.T) { f.kubeobjects = append(f.kubeobjects, pod) podData := podData{ - remoteAddress: "127.0.0.1", - name: "test", - namespace: "test", - token: "asfasdasf", + name: "test", + namespace: "test", + token: "asfasdasf", } f.initAuthorization() diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index adcad605..6efb5af2 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -28,6 +28,7 @@ import ( "net/http" "os" "path/filepath" + "strconv" "sync" "time" @@ -37,7 +38,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" - log "github.com/sirupsen/logrus" whhttp "github.com/slok/kubewebhook/pkg/http" internalLog "github.com/slok/kubewebhook/pkg/log" "github.com/slok/kubewebhook/pkg/observability/metrics" @@ -45,6 +45,7 @@ import ( "github.com/slok/kubewebhook/pkg/webhook/mutating" "github.com/spf13/viper" "k8s.io/client-go/tools/clientcmd" + "k8s.io/klog/v2" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -84,6 +85,7 @@ type azureKeyVaultConfig struct { } type cmdParams struct { + logLevel string version string versionEnvImage string kubeconfig string @@ -113,31 +115,19 @@ var ( const envVarReplacementKey = "@azurekeyvault" -func setLogLevel(logLevel string) { - if logLevel == "" { - logLevel = log.InfoLevel.String() - } - - logrusLevel, err := log.ParseLevel(logLevel) - if err != nil { - log.Fatalf("error setting log level: %s", err.Error()) - } - log.SetLevel(logrusLevel) -} - -func setLogFormat(logFormat string) { - switch logFormat { - case "fmt": - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) - case "json": - log.SetFormatter(&log.JSONFormatter{}) - default: - log.Warnf("Log format %s not supported - using default fmt", logFormat) - } -} +// func setLogFormat(logFormat string) { +// switch logFormat { +// case "fmt": +// log.SetFormatter(&log.TextFormatter{ +// DisableColors: true, +// FullTimestamp: true, +// }) +// case "json": +// log.SetFormatter(&log.JSONFormatter{}) +// default: +// log.Warnf("Log format %s not supported - using default fmt", logFormat) +// } +// } func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { req := whcontext.GetAdmissionRequest(ctx) @@ -145,7 +135,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { switch v := obj.(type) { case *corev1.Pod: - log.Infof("found pod to mutate in namespace '%s'", req.Namespace) + klog.V(2).InfoS("found pod to mutate pod", klog.KRef(req.Namespace, req.Name)) pod = v default: return false, nil @@ -155,7 +145,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { err := mutatePodSpec(pod, req.Namespace, req.UID) if err != nil { - log.Errorf("failed to mutate pod, error: %+v", err) + klog.ErrorS(err, "failed to mutate pod", klog.KRef(req.Namespace, req.Name)) podsMutatedFailedCounter.Inc() } @@ -165,13 +155,13 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { func handlerFor(config mutating.WebhookConfig, mutator mutating.MutatorFunc, recorder metrics.Recorder, logger internalLog.Logger) http.Handler { webhook, err := mutating.NewWebhook(config, mutator, nil, nil, logger) if err != nil { - log.Errorf("error creating webhook: %s", err) + klog.ErrorS(err, "error creating webhook") os.Exit(1) } handler, err := whhttp.HandlerFor(webhook) if err != nil { - log.Errorf("error creating webhook: %s", err) + klog.ErrorS(err, "error creating webhook") os.Exit(1) } @@ -182,13 +172,12 @@ func authHandler(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { vars := mux.Vars(r) pod := podData{ - name: vars["pod"], - namespace: vars["namespace"], - remoteAddress: r.RemoteAddr, + name: vars["pod"], + namespace: vars["namespace"], } if pod.name == "" || pod.namespace == "" { - log.Errorf("failed to parse url parameters, pod='%s', namespace='%s'", pod.name, pod.namespace) + klog.V(2).InfoS("failed to parse url parameters", "pod", pod.name, "namespace", pod.namespace) http.Error(w, "", http.StatusBadRequest) return } @@ -196,7 +185,7 @@ func authHandler(w http.ResponseWriter, r *http.Request) { err := authorize(config.kubeClient, pod) if err != nil { - log.Errorf("failed to authorize request: %+v", err) + klog.ErrorS(err, "failed to authorize request", "pod", pod.name, "namespace", pod.namespace) http.Error(w, "", http.StatusForbidden) return } @@ -205,14 +194,14 @@ func authHandler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) if err := json.NewEncoder(w).Encode(config.credentials); err != nil { - log.Errorf("failed to json encode token, error: %+v", err) + klog.ErrorS(err, "failed to json encode token", "pod", pod.name, "namespace", pod.namespace) http.Error(w, err.Error(), http.StatusInternalServerError) } else { - log.Infof("served oauth token to '%s/%s' at address '%s'", pod.namespace, pod.name, r.RemoteAddr) + klog.InfoS("served oauth token", "pod", pod.name, "namespace", pod.namespace) } } else { - log.Error("invalid request method") + klog.V(2).InfoS("invalid request method") http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) } } @@ -243,6 +232,7 @@ func initConfig() { } func init() { + flag.StringVar(¶ms.logLevel, "v", "2", "klog log level") flag.StringVar(¶ms.version, "version", "", "Version of this component.") flag.StringVar(¶ms.versionEnvImage, "versionenvimage", "", "Version of the env image component.") flag.StringVar(¶ms.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") @@ -251,15 +241,16 @@ func init() { } func main() { + klog.InitFlags(nil) + defer klog.Flush() + flag.Parse() + initConfig() akv2k8s.Version = params.version - logLevel := viper.GetString("log_level") - setLogLevel(logLevel) - - logFormat := viper.GetString("log_format") - setLogFormat(logFormat) + // logFormat := viper.GetString("log_format") + // setLogFormat(logFormat) akv2k8s.LogVersion() @@ -281,33 +272,39 @@ func main() { cloudConfig: params.cloudConfig, } - log.Info("Active settings:") - log.Infof(" Webhook port : %s", config.port) - log.Infof(" Serve metrics : %t", config.serveMetrics) - log.Infof(" Auth type : %s", config.authType) - log.Infof(" Use auth service : %t", config.useAuthService) + klog.InfoS("Active settings:") + klog.InfoS(" Webhook port : %s", config.port) + klog.InfoS(" Serve metrics : %t", config.serveMetrics) + klog.InfoS(" Auth type : %s", config.authType) + klog.InfoS(" Use auth service : %t", config.useAuthService) if config.useAuthService { - log.Infof(" Auth service name : %s", config.authServiceName) - log.Infof(" Auth service port : %s", config.authServicePort) - log.Infof(" Auth service internal port: %s", config.authServicePortInternal) + klog.InfoS(" Auth service name : %s", config.authServiceName) + klog.InfoS(" Auth service port : %s", config.authServicePort) + klog.InfoS(" Auth service internal port: %s", config.authServicePortInternal) } - log.Infof(" Use AKS creds with ACS : %t", config.useAksCredentialsWithAcs) - log.Infof(" Docker inspection timeout : %d", config.dockerImageInspectionTimeout) - log.Infof(" Cloud config path : %s", config.cloudConfig) + klog.InfoS(" Use AKS creds with ACS : %t", config.useAksCredentialsWithAcs) + klog.InfoS(" Docker inspection timeout : %d", config.dockerImageInspectionTimeout) + klog.InfoS(" Cloud config path : %s", config.cloudConfig) mutator := mutating.MutatorFunc(vaultSecretsMutator) metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer) - internalLogger := &internalLog.Std{Debug: logLevel == "debug" || logLevel == "trace"} + klogLevel, err := strconv.Atoi(params.logLevel) + if err != nil { + klog.ErrorS(err, "failed to parse log level") + klogLevel = 2 + } + + internalLogger := &internalLog.Std{Debug: klogLevel >= 4} podHandler := handlerFor(mutating.WebhookConfig{Name: "azurekeyvault-secrets-pods", Obj: &corev1.Pod{}}, mutator, metricsRecorder, internalLogger) - var err error if config.useAuthService { - log.Debug("loading ca to use for mtls and auth service") + klog.V(3).InfoS("loading ca to use for mtls and auth service") caCertDir := viper.GetString("ca_cert_dir") if caCertDir == "" { - log.Fatalf("env var CA_CERT_DIR not provided - must exist to use auth service") + klog.InfoS("missing env var - must exist to use auth service", "env", "CA_CERT_DIR") + os.Exit(1) } caCertFile := filepath.Join(caCertDir, "tls.crt") @@ -315,67 +312,70 @@ func main() { config.caCert, err = ioutil.ReadFile(caCertFile) if err != nil { - log.Fatalf("failed to read pem file for ca cert %s, error: %+v", caCertFile, err) + klog.ErrorS(err, "failed to read pem file for ca cert", "file", caCertFile) + os.Exit(1) } config.caKey, err = ioutil.ReadFile(caKeyFile) if err != nil { - log.Fatalf("failed to read pem file for ca key %s, error: %+v", caKeyFile, err) + klog.ErrorS(err, "failed to read pem file for ca key", "file", caKeyFile) + os.Exit(1) } } if config.authType != "cloudConfig" { - log.Debug("not using cloudConfig for auth - looking for azure key vault credentials in envrionment") + klog.V(4).InfoS("not using cloudConfig for auth - looking for azure key vault credentials in envrionment") cProvider, err := credentialprovider.NewFromEnvironment() if err != nil { - log.Fatal(fmt.Errorf("failed to create credentials provider for azure key vault, error %+v", err)) + klog.ErrorS(err, "failed to create credentials provider from environment for azure key vault") + os.Exit(1) } config.credentials, err = cProvider.GetAzureKeyVaultCredentials() if err != nil { - log.Fatal(fmt.Errorf("failed to get credentials for azure key vault, error %+v", err)) + klog.ErrorS(err, "failed to get credentials for azure key vault") + os.Exit(1) } } else { - log.Debugf("using cloudConfig for auth - reading credentials from %s", config.cloudConfig) + klog.V(4).InfoS("using cloudConfig for auth - reading credentials", "file", config.cloudConfig) f, err := os.Open(config.cloudConfig) if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfig, err) + klog.ErrorS(err, "failed to read azure config", "file", config.cloudConfig) + os.Exit(1) } defer f.Close() cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f) if err != nil { - log.Fatalf("Failed reading azure config from %s, error: %+v", config.cloudConfig, err) + klog.ErrorS(err, "failed to create cloud config provider for azure key vault", "file", config.cloudConfig) + os.Exit(1) } config.credentials, err = cloudCnfProvider.GetAzureKeyVaultCredentials() if err != nil { - log.Fatal(err) + klog.ErrorS(err, "failed to get azure key vault credentials", "file", config.cloudConfig) + os.Exit(1) } } - log.Debug("checking credentials by getting authorizer from credentials") + klog.V(4).InfoS("checking credentials by getting authorizer from credentials") _, err = config.credentials.Authorizer() if err != nil { - log.Fatal("failed to get authorizer for azure key vault credentials") + klog.ErrorS(err, "failed to get authorizer from azure key vault credentials") + os.Exit(1) } - log.Debug("getting azure key vault authorizer succeded") - cfg, err := clientcmd.BuildConfigFromFlags(params.masterURL, params.kubeconfig) if err != nil { - log.Fatalf("Error building kubeconfig: %s", err.Error()) + klog.ErrorS(err, "failed to build kube config", "master", params.masterURL, "kubeconfig", params.kubeconfig) + os.Exit(1) } - // cfg, err := rest.InClusterConfig() - // if err != nil { - // log.Fatalf("failed to get kubernetes in cluster config, error: %+v", err) - // } - config.kubeClient, err = kubernetes.NewForConfig(cfg) if err != nil { - log.Fatalf("Error building kubernetes clientset: %s", err.Error()) + klog.ErrorS(err, "failed to build kube clientset", "master", params.masterURL, "kubeconfig", params.kubeconfig) + os.Exit(1) } wg := new(sync.WaitGroup) @@ -386,15 +386,16 @@ func main() { if config.serveMetrics { httpMux.Handle("/metrics", promhttp.Handler()) - log.Infof("Serving metrics at %s/metrics", httpURL) + klog.V(2).InfoS("serving metrics endpoint", "path", fmt.Sprintf("%s/metrics", httpURL)) } httpMux.HandleFunc("/healthz", healthHandler) - log.Infof("Serving healthz at %s/healthz", httpURL) + klog.V(2).InfoS("serving health endpoint", "path", fmt.Sprintf("%s/healthz", httpURL)) go func() { err := http.ListenAndServe(httpURL, httpMux) if err != nil { - log.Fatalf("error serving metrics at %s: %+v", httpURL, err) + klog.ErrorS(err, "error serving metrics", "port", httpURL) + os.Exit(1) } wg.Done() }() @@ -403,10 +404,10 @@ func main() { tlsURL := fmt.Sprintf(":%s", config.port) router.Handle("/pods", podHandler) - log.Infof("Serving encrypted webhook at %s/pods", tlsURL) + klog.InfoS("serving encrypted webhook endpoint", "path", fmt.Sprintf("%s/pods", tlsURL)) router.HandleFunc("/healthz", healthHandler) - log.Infof("Serving encrypted healthz at %s/healthz", tlsURL) + klog.InfoS("serving encrypted healthz endpoint", "path", fmt.Sprintf("%s/healthz", tlsURL)) if config.useAuthService { wg.Add(1) @@ -415,12 +416,13 @@ func main() { authRouter.HandleFunc("/auth/{namespace}/{pod}", authHandler) authServer := createServerWithMTLS(config.caCert, authRouter, authURL) - log.Infof("Serving encrypted auth at %s/auth", authURL) + klog.InfoS("serving encrypted auth endpoint", "path", fmt.Sprintf("%s/auth", authURL)) go func() { err := authServer.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile) if err != nil { - log.Fatalf("error serving auth at %s: %+v", authURL, err) + klog.ErrorS(err, "error serving auth", "port", authURL) + os.Exit(1) } wg.Done() }() @@ -428,7 +430,11 @@ func main() { go func() { server := createServer(router, tlsURL, nil) - log.Fatal(server.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile)) + err := server.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile) + if err != nil { + klog.ErrorS(err, "error serving endpoint", "port", tlsURL) + os.Exit(1) + } wg.Done() }() diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index 3b98631e..aedded47 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -26,7 +26,6 @@ import ( "strconv" "strings" - log "github.com/sirupsen/logrus" "github.com/spf13/viper" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -34,6 +33,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" + "k8s.io/klog/v2" ) const ( @@ -98,13 +98,13 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai for i, container := range containers { useAuthService := config.useAuthService - log.Infof("found container '%s' to mutate", container.Name) + klog.V(2).InfoS("found container to mutate", "container", klog.KRef(namespace, container.Name)) var envVars []corev1.EnvVar - log.Infof("checking for env vars containing '%s' in container %s", envVarReplacementKey, container.Name) + klog.V(2).InfoS("checking for env vars to inject", klog.KRef(namespace, container.Name)) for _, env := range container.Env { if strings.Contains(env.Value, envVarReplacementKey) { - log.Infof("found env var: %s", env.Value) + klog.V(2).InfoS("found env var to inject", "env", env.Value, klog.KRef(namespace, container.Name)) envVars = append(envVars, env) } @@ -114,14 +114,14 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai return false, fmt.Errorf("failed to parse container env var override for auth service, error: %+v", err) } if containerDisabledAuthService { - log.Infof("container %s has disabled auth service", container.Name) + klog.V(2).InfoS("container has disabled auth service", klog.KRef(namespace, container.Name)) useAuthService = false } } } if len(envVars) == 0 { - log.Info("found no env vars in container") + klog.Info("found no env vars to inject", klog.KRef(namespace, container.Name)) continue } @@ -131,7 +131,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai } autoArgsStr := strings.Join(autoArgs, " ") - log.Infof("using '%s' as arguments for env-injector", autoArgsStr) + klog.V(2).InfoS("found container arguments to use for env-injector", "cmd", autoArgsStr, klog.KRef(namespace, container.Name)) privKey, pubKey, err := newKeyPair() if err != nil { @@ -142,22 +142,21 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai if err != nil { return false, fmt.Errorf("failed to sign command args, error: %+v", err) } - log.Debug("signed arguments to prevent override") + klog.V(4).InfoS("signed arguments to prevent override", klog.KRef(namespace, container.Name)) publicSigningKey, err := exportRsaPublicKey(pubKey) if err != nil { return false, fmt.Errorf("failed to export public rsa key to pem, error: %+v", err) } - log.Debugf("public signing key for argument verification: \n%s", publicSigningKey) + klog.V(4).InfoS("public signing key for argument verification", "key", publicSigningKey, klog.KRef(namespace, container.Name)) mutated = true fullExecPath := filepath.Join(config.injectorDir, injectorExecutable) - log.Debugf("full exec path: %s", fullExecPath) + klog.V(4).InfoS("full exec path", "path", fullExecPath, klog.KRef(namespace, container.Name)) container.Command = []string{fullExecPath} container.Args = autoArgs - log.Debugf("container args: %+v", autoArgs) container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{ { @@ -166,7 +165,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai ReadOnly: true, }, }...) - log.Debugf("mounting volume '%s' to '%s'", keyVaultEnvVolumeName, config.injectorDir) + klog.V(4).InfoS("mounting volume", "volume", keyVaultEnvVolumeName, "path", config.injectorDir, klog.KRef(namespace, container.Name)) container.Env = append(container.Env, []corev1.EnvVar{ { @@ -229,17 +228,6 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai Name: "ENV_INJECTOR_AUTH_SERVICE", Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, currentNamespace(), config.authServicePort), }, - // { - // Name: "ENV_INJECTOR_CA_CERT", - // ValueFrom: &corev1.EnvVarSource{ - // ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ - // LocalObjectReference: corev1.LocalObjectReference{ - // Name: config.caBundleConfigMapName, - // }, - // Key: "caCert", - // }, - // }, - // }, }...) } @@ -323,10 +311,10 @@ func mutatePodSpec(pod *corev1.Pod, namespace string, mutationID types.UID) erro if initContainersMutated || containersMutated { podSpec.InitContainers = append(getInitContainers(), podSpec.InitContainers...) podSpec.Volumes = append(podSpec.Volumes, getVolumes(authServiceSecret)...) - log.Info("containers mutated and pod updated with init-container and volumes") + klog.V(2).InfoS("containers mutated and pod updated with init-container and volumes", klog.KRef(namespace, pod.Name)) podsMutatedCounter.Inc() } else { - log.Info("no containers mutated") + klog.V(2).InfoS("no containers mutated", klog.KRef(namespace, pod.Name)) } return nil diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 10007fc8..21eeab38 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -19,19 +19,19 @@ package main import ( "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/docker/registry" - log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes" + "k8s.io/klog/v2" ) func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container, podSpec *corev1.PodSpec, namespace string) ([]string, error) { - log.Debugf("getting container command for container '%s'", container.Name) + klog.V(4).InfoS("getting container command for container", klog.KRef(namespace, container.Name)) cmd := container.Command // If container.Command is set it will override both image.Entrypoint AND image.Cmd // https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes if len(cmd) == 0 { - log.Debugf("no cmd override in kubernetes for container %s, checking docker image configuration for entrypoint and cmd for %s", container.Name, container.Image) + klog.V(4).InfoS("no cmd override in kubernetes for container, checking docker image configuration for entrypoint and cmd", "image", container.Image, klog.KRef(namespace, container.Name)) imgConfig, err := registry.GetImageConfig(clientset, namespace, container, podSpec, config.cloudConfig) if err != nil { @@ -44,7 +44,7 @@ func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container cmd = append(cmd, imgConfig.Cmd...) } } else { - log.Debugf("found cmd override in kubernetes for container %s, no need to inspect docker image configuration for %s", container.Name, container.Image) + klog.V(4).InfoS("found cmd override in kubernetes for container, no need to inspect docker image configuration", "image", container.Image, klog.KRef(namespace, container.Name)) } cmd = append(cmd, container.Args...) diff --git a/go.mod b/go.mod index 23522830..cc1fb4f0 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/docker/go-connections v0.4.0 // indirect github.com/gorilla/mux v1.7.4 github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5 + k8s.io/klog/v2 v2.3.0 github.com/opencontainers/image-spec v1.0.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.1.0 From 20a76c9f9fe675cd2fb2f80d4572f1e1e5d85420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 25 Oct 2020 23:45:43 +0100 Subject: [PATCH 238/251] controller: fix calling directive --- cmd/azure-keyvault-controller/controller/secret.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index e5e9cee8..43eae990 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -156,7 +156,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) } if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { - klog.Infof("azurekeyvaultsecret values has changed and requires update to secret", klog.KObj(akvs), klog.KObj(secret)) + klog.InfoS("azurekeyvaultsecret values has changed and requires update to secret", klog.KObj(akvs), klog.KObj(secret)) updatedSecret, err := createNewSecretFromExisting(akvs, secretValues, secret) if err != nil { From 9a9e32601717d41dc88c378bdd7761a6d409070b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sun, 25 Oct 2020 23:59:11 +0100 Subject: [PATCH 239/251] replace logrus with klog v2 --- pkg/akv2k8s/version.go | 9 ++------- pkg/azure/credentialprovider/acr.go | 14 +++++++------- pkg/azure/credentialprovider/provider.go | 13 +++++++------ pkg/docker/registry/registry.go | 3 --- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/pkg/akv2k8s/version.go b/pkg/akv2k8s/version.go index e4324223..2b93c9ef 100644 --- a/pkg/akv2k8s/version.go +++ b/pkg/akv2k8s/version.go @@ -3,7 +3,7 @@ package akv2k8s import ( "fmt" - log "github.com/sirupsen/logrus" + "k8s.io/klog/v2" ) // Version is the version of the component @@ -28,10 +28,5 @@ func GetUserAgent() string { // LogVersion prints the version and exits // The format is: - commit: - date: func LogVersion() { - contextLogger := log.WithFields(log.Fields{ - "commit": GitCommit, - "buildDate": BuildDate, - "component": Component, - }) - contextLogger.Infof("version %s", Version) + klog.InfoS("version info", "version", Version, "commit", GitCommit, "buildDate", BuildDate, "component", Component) } diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go index b774d106..3ad76670 100644 --- a/pkg/azure/credentialprovider/acr.go +++ b/pkg/azure/credentialprovider/acr.go @@ -23,7 +23,7 @@ import ( "github.com/Azure/go-autorest/autorest/adal" "github.com/Azure/go-autorest/autorest/azure" dockerTypes "github.com/docker/docker/api/types" - log "github.com/sirupsen/logrus" + "k8s.io/klog/v2" ) var ( @@ -41,9 +41,9 @@ func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*dockerT } if c.config.UseManagedIdentityExtension { - log.Debug("using managed identity for acr credentials") + klog.V(4).InfoS("using managed identity for acr credentials") if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" { - log.Debugf("image(%s) is not from ACR, skip MSI authentication", image) + klog.V(4).InfoS("image is not from ACR, skip MSI authentication", "image", image) } else { token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ServiceManagementEndpoint) if err != nil { @@ -51,7 +51,7 @@ func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*dockerT } if managedCred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, token, loginServer); err == nil { - log.Debugf("found acr gredentials for %s", loginServer) + klog.V(4).InfoS("found acr gredentials", "image", image, "url", loginServer) return managedCred, nil } } @@ -85,19 +85,19 @@ func getACRDockerEntryFromARMToken(config *AzureCloudConfig, env azure.Environme armAccessToken := token.OAuthToken() - log.Debugf("discovering auth redirects for: %s", loginServer) + klog.V(4).InfoS("discovering auth redirects", "url", loginServer) directive, err := receiveChallengeFromLoginServer(loginServer) if err != nil { return nil, fmt.Errorf("failed to receive challenge: %s", err) } - log.Debug("exchanging an acr refresh_token") + klog.V(4).InfoS("exchanging acr refresh_token", "url", loginServer) registryRefreshToken, err := performTokenExchange(loginServer, directive, config.TenantID, armAccessToken) if err != nil { return nil, fmt.Errorf("failed to perform token exchange: %s", err) } - log.Debugf("adding ACR docker config entry for: %s", loginServer) + klog.V(4).InfoS("adding ACR docker config entry", "url", loginServer) return &dockerTypes.AuthConfig{ Username: dockerTokenLoginUsernameGUID, Password: registryRefreshToken, diff --git a/pkg/azure/credentialprovider/provider.go b/pkg/azure/credentialprovider/provider.go index d0ee083a..57b518dc 100644 --- a/pkg/azure/credentialprovider/provider.go +++ b/pkg/azure/credentialprovider/provider.go @@ -38,7 +38,7 @@ import ( aadProvider "github.com/Azure/aad-pod-identity/pkg/cloudprovider" azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" - log "github.com/sirupsen/logrus" + "k8s.io/klog/v2" "sigs.k8s.io/yaml" ) @@ -156,21 +156,22 @@ func getServicePrincipalTokenFromMSI(userAssignedIdentityID string, resource str // return fmt.Errorf("failed to add MIC to user agent, error: %+v", err) // } - log.Debug("azure: using managed identity extension to retrieve access token") + klog.V(4).InfoS("azure: using managed identity extension to retrieve access token", "id", userAssignedIdentityID) msiEndpoint, err := adal.GetMSIVMEndpoint() if err != nil { return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err) } if len(userAssignedIdentityID) > 0 { - log.Debug("azure: using User Assigned MSI ID to retrieve access token") + klog.V(4).InfoS("azure: using User Assigned MSI ID to retrieve access token", "id", userAssignedIdentityID, "url", msiEndpoint) token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, resource, userAssignedIdentityID) if err != nil { return nil, fmt.Errorf("failed getting user assigned msi token from endpoint '%s': %+v", msiEndpoint, err) } return token, err } - log.Debug("azure: using System Assigned MSI to retrieve access token") + + klog.V(4).InfoS("azure: using System Assigned MSI to retrieve access token", "url", msiEndpoint) token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, resource) if err != nil { return nil, fmt.Errorf("failed getting system assigned msi token from endpoint '%s': %+v", msiEndpoint, err) @@ -190,7 +191,7 @@ func getServicePrincipalTokenFromCloudConfig(config *AzureCloudConfig, env *azur } if len(config.AADClientSecret) > 0 { - log.Debug("azure: using client_id+client_secret to retrieve access token") + klog.V(4).InfoS("azure: using client_id+client_secret to retrieve access token", "id", config.AADClientID) token, err := adal.NewServicePrincipalToken( *oauthConfig, config.AADClientID, @@ -201,7 +202,7 @@ func getServicePrincipalTokenFromCloudConfig(config *AzureCloudConfig, env *azur } if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 { - log.Debug("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token") + klog.V(4).InfoS("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token", "path", config.AADClientCertPath) certData, err := ioutil.ReadFile(config.AADClientCertPath) if err != nil { return nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err) diff --git a/pkg/docker/registry/registry.go b/pkg/docker/registry/registry.go index 28d6a3bd..8a5149c5 100644 --- a/pkg/docker/registry/registry.go +++ b/pkg/docker/registry/registry.go @@ -26,7 +26,6 @@ import ( dockerTypes "github.com/docker/docker/api/types" "github.com/heroku/docker-registry-client/registry" imagev1 "github.com/opencontainers/image-spec/specs-go/v1" - log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes" ) @@ -44,8 +43,6 @@ func GetImageConfig(clientset kubernetes.Interface, namespace string, container return nil, err } - log.Infoln("using registry", containerInfo.RegistryAddress) - imageConfig, err := getImageBlob(containerInfo) return imageConfig, err } From 4ac8c38fc3743036899585b8bae1158d3331cf53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 00:12:33 +0100 Subject: [PATCH 240/251] do not set v flag for klog --- cmd/azure-keyvault-controller/main.go | 2 -- cmd/azure-keyvault-secrets-webhook/main.go | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 03ce1381..3c8ea9e8 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -52,7 +52,6 @@ var ( kubeconfig string masterURL string cloudconfig string - logLevel string ) func initConfig() { @@ -62,7 +61,6 @@ func initConfig() { } func init() { - flag.StringVar(&logLevel, "v", "2", "klog log level") flag.StringVar(&version, "version", "", "Version of this component.") flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 6efb5af2..349638eb 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -85,7 +85,6 @@ type azureKeyVaultConfig struct { } type cmdParams struct { - logLevel string version string versionEnvImage string kubeconfig string @@ -232,7 +231,6 @@ func initConfig() { } func init() { - flag.StringVar(¶ms.logLevel, "v", "2", "klog log level") flag.StringVar(¶ms.version, "version", "", "Version of this component.") flag.StringVar(¶ms.versionEnvImage, "versionenvimage", "", "Version of the env image component.") flag.StringVar(¶ms.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") @@ -289,7 +287,8 @@ func main() { mutator := mutating.MutatorFunc(vaultSecretsMutator) metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer) - klogLevel, err := strconv.Atoi(params.logLevel) + logLevel := flag.Lookup("v").Value.String() + klogLevel, err := strconv.Atoi(logLevel) if err != nil { klog.ErrorS(err, "failed to parse log level") klogLevel = 2 From f7acab3de51049779e1b7da4d6ac7d312777d05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 00:29:23 +0100 Subject: [PATCH 241/251] controller: move klog init after flag init --- cmd/azure-keyvault-controller/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 3c8ea9e8..068eb780 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -68,12 +68,12 @@ func init() { } func main() { - klog.InitFlags(nil) - defer klog.Flush() - flag.Parse() initConfig() + klog.InitFlags(nil) + defer klog.Flush() + akv2k8s.Version = version akv2k8s.LogVersion() From cabcc93c6d7d6c52873d009a890eed0b2f90c466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 08:51:00 +0100 Subject: [PATCH 242/251] controller: remove init flags for klog - looks like this is being done in one of the downstream dependencies --- cmd/azure-keyvault-controller/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 068eb780..5b036477 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -68,12 +68,12 @@ func init() { } func main() { + // klog.InitFlags(nil) + defer klog.Flush() + flag.Parse() initConfig() - klog.InitFlags(nil) - defer klog.Flush() - akv2k8s.Version = version akv2k8s.LogVersion() From 7b27772b382211b1cfb25bedf633a08c0eed1685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 12:22:03 +0100 Subject: [PATCH 243/251] controller: override any init magic with flags other: remove dependency on logrus and pflag --- cmd/azure-keyvault-controller/controller/controller.go | 4 ++-- cmd/azure-keyvault-controller/main.go | 7 ++++++- cmd/azure-keyvault-secrets-webhook/main.go | 2 +- go.mod | 3 --- pkg/azure/credentialprovider/provider.go | 4 ---- pkg/docker/registry/container.go | 10 +++++----- 6 files changed, 14 insertions(+), 16 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go index ae02bfb9..7f281ee8 100644 --- a/cmd/azure-keyvault-controller/controller/controller.go +++ b/cmd/azure-keyvault-controller/controller/controller.go @@ -149,7 +149,7 @@ func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvI controller.akvsCrdDeletionQueue = queue.New("DeletedAzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncDeletedAzureKeyVaultSecret) controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault) - klog.InfoS("Setting up event handlers") + klog.InfoS("setting up event handlers") controller.initAzureKeyVaultSecret() return controller @@ -160,7 +160,7 @@ func (c *Controller) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() // Start the informer factories to begin populating the informer caches - klog.Info("Starting AzureKeyVaultSecret controller") + klog.InfoS("starting azurekeyvaultsecret controller") c.akvsInformerFactory.Start(stopCh) c.kubeInformerFactory.Start(stopCh) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 5b036477..84136995 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -61,6 +61,8 @@ func initConfig() { } func init() { + flag.CommandLine = flag.NewFlagSet("akv2k8s controller", flag.ExitOnError) + flag.StringVar(&version, "version", "", "Version of this component.") flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") @@ -68,7 +70,7 @@ func init() { } func main() { - // klog.InitFlags(nil) + klog.InitFlags(nil) defer klog.Flush() flag.Parse() @@ -77,6 +79,9 @@ func main() { akv2k8s.Version = version akv2k8s.LogVersion() + klog.InfoS("log level", "level", flag.Lookup("v").Value) + klog.V(4).InfoS("some debug info...") + authType := viper.GetString("auth_type") // set up signals so we handle the first shutdown signal gracefully diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 349638eb..c8d0e1ac 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -270,7 +270,7 @@ func main() { cloudConfig: params.cloudConfig, } - klog.InfoS("Active settings:") + klog.Info("Active settings:") klog.InfoS(" Webhook port : %s", config.port) klog.InfoS(" Serve metrics : %t", config.serveMetrics) klog.InfoS(" Auth type : %s", config.authType) diff --git a/go.mod b/go.mod index cc1fb4f0..cdf95949 100644 --- a/go.mod +++ b/go.mod @@ -18,14 +18,11 @@ require ( github.com/opencontainers/image-spec v1.0.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.1.0 - github.com/sirupsen/logrus v1.6.0 github.com/slok/kubewebhook v0.4.0 - github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.6.1 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 gopkg.in/yaml.v2 v2.3.0 - istio.io/pkg v0.0.0-20201002213810-7a3a61d8b48a k8s.io/api v0.17.2 k8s.io/apimachinery v0.17.2 k8s.io/client-go v0.17.2 diff --git a/pkg/azure/credentialprovider/provider.go b/pkg/azure/credentialprovider/provider.go index 57b518dc..7d26f3d9 100644 --- a/pkg/azure/credentialprovider/provider.go +++ b/pkg/azure/credentialprovider/provider.go @@ -34,7 +34,6 @@ import ( "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/adal" "github.com/Azure/go-autorest/autorest/azure" - "github.com/spf13/pflag" aadProvider "github.com/Azure/aad-pod-identity/pkg/cloudprovider" azureAuth "github.com/Azure/go-autorest/autorest/azure/auth" @@ -42,9 +41,6 @@ import ( "sigs.k8s.io/yaml" ) -var flagConfigFile = pflag.String("azure-container-registry-config", "", - "Path to the file containing Azure container registry configuration information.") - const ( maxReadLength = 10 * 1 << 20 // 10MB ) diff --git a/pkg/docker/registry/container.go b/pkg/docker/registry/container.go index 564f3f0e..277c1635 100644 --- a/pkg/docker/registry/container.go +++ b/pkg/docker/registry/container.go @@ -26,10 +26,10 @@ import ( "emperror.dev/errors" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider" - "istio.io/pkg/log" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + "k8s.io/klog/v2" ) // K8s structure keeps information retrieved from POD definition @@ -61,7 +61,7 @@ func (k *ContainerInfo) Collect(container *corev1.Container, podSpec *corev1.Pod } if found { - log.Infof("found credentials for registry %s in pod imagePullSecret: %s/%s", k.RegistryName, k.Namespace, imagePullSecret.Name) + klog.V(2).InfoS("found credentials for registry in imagePullSecrets", "registry", k.RegistryName, "namespace", k.Namespace, "pullSecret", imagePullSecret.Name) break } } @@ -88,7 +88,7 @@ func (k *ContainerInfo) Collect(container *corev1.Container, podSpec *corev1.Pod } if !found { - log.Infof("found no credentials for registry %s, assuming it is public", k.RegistryAddress) + klog.V(2).InfoS("found no credentials for registry, assuming it is public", "registry", k.RegistryAddress) } } return nil @@ -146,13 +146,13 @@ func getAcrCredentials(k *ContainerInfo, cloudConfigPath string) (bool, error) { return false, fmt.Errorf("failed getting azure acr credentials, error: %w", err) } - log.Debugf("found acr credentials to use in cloud config for '%s'", k.Image) + klog.V(4).InfoS("found acr credentials to use in cloud config for docker image", "image", k.Image) k.RegistryUsername = cred.Username k.RegistryPassword = cred.Password return true, nil } - log.Debugf("no acr credentials found for %s", k.RegistryAddress) + klog.V(4).InfoS("no acr credentials found", "registry", k.RegistryAddress) return false, nil } From 6a0f409de6b65e19204dd9db8238aaee7d9a360a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 12:48:06 +0100 Subject: [PATCH 244/251] add key to all klog kref and kobj --- .../controller/azureKeyVaultSecret.go | 42 +++++++++---------- .../controller/configmap.go | 16 +++---- .../controller/secret.go | 8 ++-- cmd/azure-keyvault-env/main.go | 34 +++++++-------- cmd/azure-keyvault-secrets-webhook/main.go | 4 +- cmd/azure-keyvault-secrets-webhook/pod.go | 22 +++++----- .../registry.go | 6 +-- 7 files changed, 66 insertions(+), 66 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 575c79b3..d5273cf6 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -45,7 +45,7 @@ func (c *Controller) initAzureKeyVaultSecret() { } if c.akvsHasOutputDefined(akvs) { - klog.V(4).InfoS("azurekeyvaultsecret adding to queue.", klog.KObj(akvs)) + klog.V(4).InfoS("adding to queue", "azurekeyvaultsecret", klog.KObj(akvs)) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) } }, @@ -64,13 +64,13 @@ func (c *Controller) initAzureKeyVaultSecret() { // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv if newAkvs.ResourceVersion == oldAkvs.ResourceVersion && c.akvsHasOutputDefined(newAkvs) { - klog.V(4).InfoS("azurekeyvaultsecret not changed - adding to azure key vault queue to check if secret has changed in azure key vault", klog.KObj(newAkvs)) + klog.V(4).InfoS("azurekeyvaultsecret not changed - adding to azure key vault queue to check if secret has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(newAkvs)) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } if c.akvsHasOutputDefined(newAkvs) || c.akvsHasOutputDefined(oldAkvs) { - klog.V(4).InfoS("azurekeyvaultsecret changed - adding to queue", klog.KObj(newAkvs)) + klog.V(4).InfoS("azurekeyvaultsecret changed - adding to queue", "azurekeyvaultsecret", klog.KObj(newAkvs)) queue.Enqueue(c.akvsCrdQueue.GetQueue(), new) } }, @@ -82,12 +82,12 @@ func (c *Controller) initAzureKeyVaultSecret() { } if c.akvsHasOutputDefined(akvs) { - klog.V(4).InfoS("azurekeyvaultsecret deleted - adding to queue", klog.KObj(akvs)) + klog.V(4).InfoS("azurekeyvaultsecret deleted - adding to queue", "azurekeyvaultsecret", klog.KObj(akvs)) queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj) err = c.deleteKubernetesValues(akvs) if err != nil { - klog.ErrorS(err, "failed to delete secret data from azurekeyvaultsecret", klog.KObj(akvs)) + klog.ErrorS(err, "failed to delete secret data from azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) } // Getting default key to remove from Azure work queue @@ -121,7 +121,7 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", klog.KObj(akvs), klog.KObj(secret)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = secret } @@ -132,7 +132,7 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", klog.KObj(akvs), klog.KObj(cm)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = cm } @@ -165,7 +165,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", klog.KObj(akvs), klog.KObj(secret)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = secret } @@ -176,7 +176,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", klog.KObj(akvs), klog.KObj(cm)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = cm } @@ -207,7 +207,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { } if c.akvsHasOutputSecret(akvs) { - klog.V(4).InfoS("getting secret value from azure key vault", klog.KObj(akvs)) + klog.V(4).InfoS("getting secret value from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) secretValue, err := c.getSecretFromKeyVault(akvs) if err != nil { msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) @@ -217,11 +217,11 @@ func (c *Controller) syncAzureKeyVault(key string) error { secretHash = getMD5HashOfByteValues(secretValue) - klog.V(4).InfoS("checking if secret value has changed in azure", klog.KObj(akvs)) + klog.V(4).InfoS("checking if secret value has changed in azure", "azurekeyvaultsecret", klog.KObj(akvs)) if akvs.Status.SecretHash != secretHash { - klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, klog.KObj(akvs)) + klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) - klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating secret now", klog.KObj(akvs)) + klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating secret now", "azurekeyvaultsecret", klog.KObj(akvs)) existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) @@ -243,7 +243,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { } if c.akvsHasOutputConfigMap(akvs) { - klog.V(4).InfoS("getting secret value from azure key vault", klog.KObj(akvs)) + klog.V(4).InfoS("getting secret value from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) cmValue, err := c.getConfigMapFromKeyVault(akvs) if err != nil { msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name) @@ -253,11 +253,11 @@ func (c *Controller) syncAzureKeyVault(key string) error { cmHash := getMD5HashOfStringValues(cmValue) - klog.V(4).InfoS("checking if secret value has changed in azure key vault", klog.KObj(akvs)) + klog.V(4).InfoS("checking if secret value has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) if akvs.Status.ConfigMapHash != cmHash { - klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, klog.KObj(akvs)) + klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) - klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating configmap now", klog.KObj(akvs)) + klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating configmap now", "azurekeyvaultsecret", klog.KObj(akvs)) existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) @@ -278,12 +278,12 @@ func (c *Controller) syncAzureKeyVault(key string) error { } } - klog.V(4).InfoS("updating status for azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(4).InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatus(akvs, secretName, cmName, secretHash, cmHash); err != nil { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with azure key vault", klog.KObj(akvs)) + klog.V(4).InfoS("successfully synced azurekeyvaultsecret with azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) c.recorder.Event(akvs, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) return nil } @@ -461,7 +461,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKey akvsCopy.Status.SecretHash = secretHash akvsCopy.Status.LastAzureUpdate = now - klog.V(4).InfoS("updating secret status of azurekeyvaultsecert", klog.KObj(akvs), klog.KRef(akvs.Namespace, secretName), "hash", secretHash) + klog.V(4).InfoS("updating secret status of azurekeyvaultsecert", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KRef(akvs.Namespace, secretName), "hash", secretHash) _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } @@ -474,7 +474,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.Azure akvsCopy.Status.ConfigMapHash = cmHash akvsCopy.Status.LastAzureUpdate = c.clock.Now() - klog.V(4).InfoS("updating configmap status of azurekeyvaultsecert", klog.KObj(akvs), klog.KRef(akvs.Namespace, cmName), "hash", cmHash) + klog.V(4).InfoS("updating configmap status of azurekeyvaultsecert", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KRef(akvs.Namespace, cmName), "hash", cmHash) _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 07dba2bf..73b2b825 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -60,7 +60,7 @@ func (c *Controller) getConfigMapByKey(key string) (*corev1.ConfigMap, error) { } func (c *Controller) getConfigMap(ns, name string) (*corev1.ConfigMap, error) { - klog.V(4).InfoS("getting configmap", klog.KRef(ns, name)) + klog.V(4).InfoS("getting configmap", "configmap", klog.KRef(ns, name)) cm, err := c.configMapsLister.ConfigMaps(ns).Get(name) if err != nil { @@ -108,12 +108,12 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre return nil, fmt.Errorf("output configmap name must be specified using spec.output.configMap.name") } - klog.V(4).InfoS("get or create configmap", klog.KRef(akvs.Namespace, cmName)) + klog.V(4).InfoS("get or create configmap", "configmap", klog.KRef(akvs.Namespace, cmName)) if cm, err = c.configMapsLister.ConfigMaps(akvs.Namespace).Get(cmName); err != nil { - klog.V(4).ErrorS(err, "failed to get configmap ", klog.KRef(akvs.Namespace, cmName)) + klog.V(4).ErrorS(err, "failed to get configmap ", "configmap", klog.KRef(akvs.Namespace, cmName)) if errors.IsNotFound(err) { - klog.V(4).InfoS("configmap was not found", klog.KRef(akvs.Namespace, cmName)) - klog.V(4).InfoS("getting configmap value from azure key vault", klog.KRef(akvs.Namespace, cmName)) + klog.V(4).InfoS("configmap was not found", "configmap", klog.KRef(akvs.Namespace, cmName)) + klog.V(4).InfoS("getting configmap value from azure key vault", "configmap", klog.KRef(akvs.Namespace, cmName)) cmValues, err = c.getConfigMapFromKeyVault(akvs) if err != nil { return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) @@ -123,7 +123,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre return nil, fmt.Errorf("failed to create new configmap, err: %+v", err) } - klog.V(2).InfoS("updating status for azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(2).InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, getMD5HashOfStringValues(cmValues)); err != nil { return nil, fmt.Errorf("failed to update status for azurekeyvaultsecret %s, error: %+v", akvs.Name, err) } @@ -133,7 +133,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } // get updated secret values from azure key vault - klog.V(4).InfoS("getting secret from azure key vault", akvs) + klog.V(4).InfoS("getting secret from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) cmValues, err = c.getConfigMapFromKeyVault(akvs) if err != nil { return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) @@ -158,7 +158,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) { - klog.V(2).InfoS("azurekeyvaultsecret has changed and requires update to configmap %s", klog.KObj(akvs), klog.KObj(cm)) + klog.V(2).InfoS("azurekeyvaultsecret has changed and requires update to configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) updatedCM, err := createNewConfigMapFromExisting(akvs, cmValues, cm) if err != nil { diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 43eae990..5463282e 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -61,7 +61,7 @@ func (c *Controller) getSecretByKey(key string) (*corev1.Secret, error) { } func (c *Controller) getSecret(ns, name string) (*corev1.Secret, error) { - klog.V(4).InfoS("getting secret", klog.KRef(ns, name)) + klog.V(4).InfoS("getting secret", "secret", klog.KRef(ns, name)) secret, err := c.secretsLister.Secrets(ns).Get(name) if err != nil { @@ -109,7 +109,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name") } - klog.V(4).InfoS("get or create secret", klog.KRef(akvs.Namespace, secretName)) + klog.V(4).InfoS("get or create secret", "secret", klog.KRef(akvs.Namespace, secretName)) if secret, err = c.secretsLister.Secrets(akvs.Namespace).Get(secretName); err != nil { if errors.IsNotFound(err) { secretValues, err = c.getSecretFromKeyVault(akvs) @@ -121,7 +121,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) return nil, err } - klog.V(2).InfoS("updating status for azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(2).InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, getMD5HashOfByteValues(secretValues)); err != nil { return nil, err } @@ -156,7 +156,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) } if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { - klog.InfoS("azurekeyvaultsecret values has changed and requires update to secret", klog.KObj(akvs), klog.KObj(secret)) + klog.InfoS("azurekeyvaultsecret values has changed and requires update to secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) updatedSecret, err := createNewSecretFromExisting(akvs, secretValues, secret) if err != nil { diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 305f050f..9f931cd6 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -262,57 +262,57 @@ func main() { if strings.Contains(value, envLookupKey) { // e.g. my-akv-secret-name?some-sub-key klog.V(4).InfoS("found env var to get azure key vault secret for", "env", name) - secretName := strings.Join(strings.Split(value, envLookupKey), "") + akvsName := strings.Join(strings.Split(value, envLookupKey), "") - if secretName == "" { + if akvsName == "" { klog.ErrorS(fmt.Errorf("error extracting secret name"), "env variable not properly formatted", "env", name, "value", value) os.Exit(1) } var secretQuery string - if query := strings.Split(secretName, "?"); len(query) > 1 { + if query := strings.Split(akvsName, "?"); len(query) > 1 { if len(query) > 2 { - klog.ErrorS(fmt.Errorf("error extracting secret query"), "multiple query elements defined with '?' - only one supported", "secret", secretName) + klog.ErrorS(fmt.Errorf("error extracting secret query"), "multiple query elements defined with '?' - only one supported", "secret", akvsName) os.Exit(1) } - secretName = query[0] + akvsName = query[0] secretQuery = query[1] klog.V(4).InfoS("found query in env var", "env", name, "value", value, "query", secretQuery) } - klog.V(4).InfoS("getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) - akvs, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + klog.V(4).InfoS("getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName)) + akvs, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(akvsName, v1.GetOptions{}) if err != nil { - klog.ErrorS(err, "failed to get azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) - klog.InfoS("will retry getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName), "retryTimes", config.retryTimes, "delay", config.waitTimeBetweenRetries) + klog.ErrorS(err, "failed to get azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName)) + klog.InfoS("will retry getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName), "retryTimes", config.retryTimes, "delay", config.waitTimeBetweenRetries) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { - akvs, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{}) + akvs, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(akvsName, v1.GetOptions{}) if err != nil { - klog.V(4).ErrorS(err, "error getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) + klog.V(4).ErrorS(err, "error getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName)) return err } - klog.InfoS("succeded getting azurekeyvaultsecret", klog.KObj(akvs)) + klog.InfoS("succeded getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) return nil }) if err != nil { - klog.ErrorS(err, "error getting azurekeyvaultsecret", klog.KRef(config.namespace, secretName)) + klog.ErrorS(err, "error getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName)) os.Exit(1) } } - klog.V(4).InfoS("getting secret value for from azure key vault, to inject into env var", klog.KObj(akvs), "env", name) + klog.V(4).InfoS("getting secret value for from azure key vault, to inject into env var", "azurekeyvaultsecret", klog.KObj(akvs), "env", name) secret, err := getSecretFromKeyVault(akvs, secretQuery, vaultService) if err != nil { - klog.ErrorS(err, "failed to read secret from azure key vault", klog.KObj(akvs)) + klog.ErrorS(err, "failed to read secret from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) os.Exit(1) } if secret == "" { - klog.ErrorS(fmt.Errorf("secret value empty"), "secret not found in azure key vault", klog.KObj(akvs)) + klog.ErrorS(fmt.Errorf("secret value empty"), "secret not found in azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) os.Exit(1) } else { - klog.InfoS("secret injected into env var", klog.KObj(akvs), "env", name) + klog.InfoS("secret injected into env var", "azurekeyvaultsecret", klog.KObj(akvs), "env", name) environ[i] = fmt.Sprintf("%s=%s", name, secret) } } diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index c8d0e1ac..3e054dcc 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -134,7 +134,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { switch v := obj.(type) { case *corev1.Pod: - klog.V(2).InfoS("found pod to mutate pod", klog.KRef(req.Namespace, req.Name)) + klog.V(2).InfoS("found pod to mutate", "pod", klog.KRef(req.Namespace, req.Name)) pod = v default: return false, nil @@ -144,7 +144,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { err := mutatePodSpec(pod, req.Namespace, req.UID) if err != nil { - klog.ErrorS(err, "failed to mutate pod", klog.KRef(req.Namespace, req.Name)) + klog.ErrorS(err, "failed to mutate", "pod", klog.KRef(req.Namespace, req.Name)) podsMutatedFailedCounter.Inc() } diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index aedded47..da357765 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -101,10 +101,10 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai klog.V(2).InfoS("found container to mutate", "container", klog.KRef(namespace, container.Name)) var envVars []corev1.EnvVar - klog.V(2).InfoS("checking for env vars to inject", klog.KRef(namespace, container.Name)) + klog.V(2).InfoS("checking for env vars to inject", "container", klog.KRef(namespace, container.Name)) for _, env := range container.Env { if strings.Contains(env.Value, envVarReplacementKey) { - klog.V(2).InfoS("found env var to inject", "env", env.Value, klog.KRef(namespace, container.Name)) + klog.V(2).InfoS("found env var to inject", "env", env.Value, "container", klog.KRef(namespace, container.Name)) envVars = append(envVars, env) } @@ -114,14 +114,14 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai return false, fmt.Errorf("failed to parse container env var override for auth service, error: %+v", err) } if containerDisabledAuthService { - klog.V(2).InfoS("container has disabled auth service", klog.KRef(namespace, container.Name)) + klog.V(2).InfoS("container has disabled auth service", "container", klog.KRef(namespace, container.Name)) useAuthService = false } } } if len(envVars) == 0 { - klog.Info("found no env vars to inject", klog.KRef(namespace, container.Name)) + klog.Info("found no env vars to inject", "container", klog.KRef(namespace, container.Name)) continue } @@ -131,7 +131,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai } autoArgsStr := strings.Join(autoArgs, " ") - klog.V(2).InfoS("found container arguments to use for env-injector", "cmd", autoArgsStr, klog.KRef(namespace, container.Name)) + klog.V(2).InfoS("found container arguments to use for env-injector", "cmd", autoArgsStr, "container", klog.KRef(namespace, container.Name)) privKey, pubKey, err := newKeyPair() if err != nil { @@ -142,19 +142,19 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai if err != nil { return false, fmt.Errorf("failed to sign command args, error: %+v", err) } - klog.V(4).InfoS("signed arguments to prevent override", klog.KRef(namespace, container.Name)) + klog.V(4).InfoS("signed arguments to prevent override", "container", klog.KRef(namespace, container.Name)) publicSigningKey, err := exportRsaPublicKey(pubKey) if err != nil { return false, fmt.Errorf("failed to export public rsa key to pem, error: %+v", err) } - klog.V(4).InfoS("public signing key for argument verification", "key", publicSigningKey, klog.KRef(namespace, container.Name)) + klog.V(4).InfoS("public signing key for argument verification", "key", publicSigningKey, "container", klog.KRef(namespace, container.Name)) mutated = true fullExecPath := filepath.Join(config.injectorDir, injectorExecutable) - klog.V(4).InfoS("full exec path", "path", fullExecPath, klog.KRef(namespace, container.Name)) + klog.V(4).InfoS("full exec path", "path", fullExecPath, "container", klog.KRef(namespace, container.Name)) container.Command = []string{fullExecPath} container.Args = autoArgs @@ -165,7 +165,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai ReadOnly: true, }, }...) - klog.V(4).InfoS("mounting volume", "volume", keyVaultEnvVolumeName, "path", config.injectorDir, klog.KRef(namespace, container.Name)) + klog.V(4).InfoS("mounting volume", "volume", keyVaultEnvVolumeName, "path", config.injectorDir, "container", klog.KRef(namespace, container.Name)) container.Env = append(container.Env, []corev1.EnvVar{ { @@ -311,10 +311,10 @@ func mutatePodSpec(pod *corev1.Pod, namespace string, mutationID types.UID) erro if initContainersMutated || containersMutated { podSpec.InitContainers = append(getInitContainers(), podSpec.InitContainers...) podSpec.Volumes = append(podSpec.Volumes, getVolumes(authServiceSecret)...) - klog.V(2).InfoS("containers mutated and pod updated with init-container and volumes", klog.KRef(namespace, pod.Name)) + klog.V(2).InfoS("containers mutated and pod updated with init-container and volumes", "pod", klog.KRef(namespace, pod.Name)) podsMutatedCounter.Inc() } else { - klog.V(2).InfoS("no containers mutated", klog.KRef(namespace, pod.Name)) + klog.V(2).InfoS("no containers mutated", "pod", klog.KRef(namespace, pod.Name)) } return nil diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go index 21eeab38..55e7610f 100644 --- a/cmd/azure-keyvault-secrets-webhook/registry.go +++ b/cmd/azure-keyvault-secrets-webhook/registry.go @@ -25,13 +25,13 @@ import ( ) func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container, podSpec *corev1.PodSpec, namespace string) ([]string, error) { - klog.V(4).InfoS("getting container command for container", klog.KRef(namespace, container.Name)) + klog.V(4).InfoS("getting container command for container", "container", klog.KRef(namespace, container.Name)) cmd := container.Command // If container.Command is set it will override both image.Entrypoint AND image.Cmd // https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes if len(cmd) == 0 { - klog.V(4).InfoS("no cmd override in kubernetes for container, checking docker image configuration for entrypoint and cmd", "image", container.Image, klog.KRef(namespace, container.Name)) + klog.V(4).InfoS("no cmd override in kubernetes for container, checking docker image configuration for entrypoint and cmd", "image", container.Image, "container", klog.KRef(namespace, container.Name)) imgConfig, err := registry.GetImageConfig(clientset, namespace, container, podSpec, config.cloudConfig) if err != nil { @@ -44,7 +44,7 @@ func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container cmd = append(cmd, imgConfig.Cmd...) } } else { - klog.V(4).InfoS("found cmd override in kubernetes for container, no need to inspect docker image configuration", "image", container.Image, klog.KRef(namespace, container.Name)) + klog.V(4).InfoS("found cmd override in kubernetes for container, no need to inspect docker image configuration", "image", container.Image, "container", klog.KRef(namespace, container.Name)) } cmd = append(cmd, container.Args...) From ac3cf7b5527b316d742b5a4bfb380d67ce81730a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 13:11:37 +0100 Subject: [PATCH 245/251] controller: fix hash value for configmap in azurekeyvaultsecret status --- .../controller/azureKeyVaultSecret.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index d5273cf6..39caa7fc 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -238,7 +238,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { } secretName = secret.Name - klog.V(2).InfoS("secret value will now change for secret - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", klog.KObj(secret), klog.KObj(akvs)) + klog.V(2).InfoS("secret value will now change for secret - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(secret), "secret", klog.KObj(akvs)) } } @@ -251,7 +251,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf(msg) } - cmHash := getMD5HashOfStringValues(cmValue) + cmHash = getMD5HashOfStringValues(cmValue) klog.V(4).InfoS("checking if secret value has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) if akvs.Status.ConfigMapHash != cmHash { @@ -274,7 +274,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { } cmName = cm.Name - klog.V(2).InfoS("configmap value will now change for configmap - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", klog.KObj(akvs), klog.KObj(cm)) + klog.V(2).InfoS("configmap value will now change for configmap - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) } } From 0ad7c1b274345b2f65d7ba06fb1ba548a78f8d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 14:22:41 +0100 Subject: [PATCH 246/251] controller: shortened log messages --- .../controller/azureKeyVaultSecret.go | 28 +++++++++---------- .../controller/configmap.go | 5 +++- .../controller/secret.go | 5 +++- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 39caa7fc..a8a67739 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -64,7 +64,7 @@ func (c *Controller) initAzureKeyVaultSecret() { // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv if newAkvs.ResourceVersion == oldAkvs.ResourceVersion && c.akvsHasOutputDefined(newAkvs) { - klog.V(4).InfoS("azurekeyvaultsecret not changed - adding to azure key vault queue to check if secret has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(newAkvs)) + klog.V(4).InfoS("adding to azure key vault queue to check if secret has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(newAkvs)) queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new) return } @@ -121,7 +121,7 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) + klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = secret } @@ -132,7 +132,7 @@ func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = cm } @@ -165,7 +165,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) + klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = secret } @@ -176,7 +176,7 @@ func (c *Controller) syncAzureKeyVaultSecret(key string) error { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with kubernetes configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced) outputObject = cm } @@ -219,9 +219,9 @@ func (c *Controller) syncAzureKeyVault(key string) error { klog.V(4).InfoS("checking if secret value has changed in azure", "azurekeyvaultsecret", klog.KObj(akvs)) if akvs.Status.SecretHash != secretHash { - klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) - klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating secret now", "azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(2).InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KRef(akvs.Namespace, akvs.Spec.Output.Secret.Name)) existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) @@ -238,7 +238,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { } secretName = secret.Name - klog.V(2).InfoS("secret value will now change for secret - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(secret), "secret", klog.KObj(akvs)) + klog.V(2).InfoS("secret changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(secret), "secret", klog.KObj(akvs)) } } @@ -255,9 +255,9 @@ func (c *Controller) syncAzureKeyVault(key string) error { klog.V(4).InfoS("checking if secret value has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) if akvs.Status.ConfigMapHash != cmHash { - klog.V(4).InfoS("secret value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) - klog.V(2).InfoS("secret has changed in azure key vault for azurekeyvvaultsecret - updating configmap now", "azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(2).InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KRef(akvs.Namespace, akvs.Spec.Output.ConfigMap.Name)) existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) @@ -274,16 +274,16 @@ func (c *Controller) syncAzureKeyVault(key string) error { } cmName = cm.Name - klog.V(2).InfoS("configmap value will now change for configmap - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + klog.V(2).InfoS("configmap changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) } } - klog.V(4).InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(4).InfoS("updating status", "azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatus(akvs, secretName, cmName, secretHash, cmHash); err != nil { return err } - klog.V(4).InfoS("successfully synced azurekeyvaultsecret with azure key vault", "azurekeyvaultsecret", klog.KObj(akvs)) + klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs)) c.recorder.Event(akvs, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault) return nil } @@ -461,7 +461,6 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKey akvsCopy.Status.SecretHash = secretHash akvsCopy.Status.LastAzureUpdate = now - klog.V(4).InfoS("updating secret status of azurekeyvaultsecert", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KRef(akvs.Namespace, secretName), "hash", secretHash) _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } @@ -474,7 +473,6 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.Azure akvsCopy.Status.ConfigMapHash = cmHash akvsCopy.Status.LastAzureUpdate = c.clock.Now() - klog.V(4).InfoS("updating configmap status of azurekeyvaultsecert", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KRef(akvs.Namespace, cmName), "hash", cmHash) _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) return err } diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 73b2b825..b6eda74e 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -158,7 +158,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) { - klog.V(2).InfoS("azurekeyvaultsecret has changed and requires update to configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + klog.V(2).InfoS("values have changed requiring update to configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) updatedCM, err := createNewConfigMapFromExisting(akvs, cmValues, cm) if err != nil { @@ -166,6 +166,9 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(updatedCM) + if err == nil { + klog.V(2).InfoS("configmap updated", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + } } return cm, err diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 5463282e..b06731fd 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -156,13 +156,16 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) } if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { - klog.InfoS("azurekeyvaultsecret values has changed and requires update to secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) + klog.V(2).InfoS("values have changed requiring update to secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) updatedSecret, err := createNewSecretFromExisting(akvs, secretValues, secret) if err != nil { return nil, err } secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(updatedSecret) + if err == nil { + klog.V(2).InfoS("secret updated", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) + } } return secret, err From 6bc5b7650993d18e414ecb595717349697d5eaba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 23:42:46 +0100 Subject: [PATCH 247/251] * support json logging with klog * bumped golang to 1.15.3 * bumped kubernetes to 1.19.3 --- Dockerfile | 2 +- Makefile | 16 +- .../controller/azureKeyVaultSecret.go | 15 +- .../controller/configmap.go | 11 +- .../controller/secret.go | 11 +- cmd/azure-keyvault-controller/main.go | 14 +- cmd/azure-keyvault-env/main.go | 5 +- .../authorization.go | 5 +- .../authorization_test.go | 5 +- cmd/azure-keyvault-secrets-webhook/pod.go | 5 +- go.mod | 15 +- go.sum | 315 +++++++----------- pkg/docker/registry/container.go | 3 +- .../client/clientset/versioned/clientset.go | 2 +- .../clientset/versioned/fake/register.go | 2 +- .../azurekeyvault/v1/azurekeyvaultsecret.go | 72 ++-- .../v1/fake/fake_azurekeyvaultsecret.go | 22 +- .../v1alpha1/azurekeyvaultsecret.go | 72 ++-- .../v1alpha1/fake/fake_azurekeyvaultsecret.go | 22 +- .../v2beta1/azurekeyvaultsecret.go | 72 ++-- .../v2beta1/fake/fake_azurekeyvaultsecret.go | 22 +- .../azurekeyvault/v1/azurekeyvaultsecret.go | 5 +- .../v1alpha1/azurekeyvaultsecret.go | 5 +- .../v2beta1/azurekeyvaultsecret.go | 5 +- .../azurekeyvault/v1/azurekeyvaultsecret.go | 5 + .../v1alpha1/azurekeyvaultsecret.go | 5 + .../v2beta1/azurekeyvaultsecret.go | 5 + 27 files changed, 357 insertions(+), 381 deletions(-) diff --git a/Dockerfile b/Dockerfile index bb56bf70..af833ea2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ ARG BASEIMAGE=gcr.io/distroless/static:nonroot ARG BASE_ALPINE=alpine:3.8 -ARG GO_VERSION=1.13.0 +ARG GO_VERSION=1.15.3 # ------- # Builder diff --git a/Makefile b/Makefile index b18a72b3..502f4999 100644 --- a/Makefile +++ b/Makefile @@ -6,8 +6,8 @@ COMPONENT_VAR=$(PACKAGE)/pkg/akv2k8s.Component GIT_VAR=$(PACKAGE)/pkg/akv2k8s.GitCommit BUILD_DATE_VAR := $(PACKAGE)/pkg/akv2k8s.BuildDate -KUBERNETES_VERSION=v1.17.2 -KUBERNETES_DEP_VERSION=v0.17.2 +KUBERNETES_VERSION=v1.19.0 +KUBERNETES_DEP_VERSION=v0.19.0 WEBHOOK_BINARY_NAME=azure-keyvault-secrets-webhook CONTROLLER_BINARY_NAME=azure-keyvault-controller @@ -193,6 +193,18 @@ build-vaultenv: clean-vaultenv .PHONY: images images: image-webhook image-controller image-ca-bundle-controller image-vaultenv +.PHONY: upload-kind-webhook +upload-kind-webhook: + kind load docker-image $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) + +.PHONY: upload-kind-controller +upload-kind-controller: + kind load docker-image $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) + +.PHONY: upload-kind-vaultenv +upload-kind-vaultenv: + kind load docker-image $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) + .PHONY: image-webhook image-webhook: DOCKER_BUILDKIT=1 docker build \ diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index a8a67739..78a079a8 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -20,6 +20,7 @@ limitations under the License. package controller import ( + "context" "fmt" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers" @@ -222,7 +223,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) klog.V(2).InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KRef(akvs.Namespace, akvs.Spec.Output.Secret.Name)) - existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) + existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(context.TODO(), akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) } @@ -232,7 +233,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf("failed to update existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) } - secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(updatedSecret) + secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(context.TODO(), updatedSecret, metav1.UpdateOptions{}) if err != nil { return fmt.Errorf("failed to update secret, error: %+v", err) } @@ -258,7 +259,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) klog.V(2).InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KRef(akvs.Namespace, akvs.Spec.Output.ConfigMap.Name)) - existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{}) + existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(context.TODO(), akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) } @@ -268,7 +269,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { return fmt.Errorf("failed to update existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) } - cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(updatedCm) + cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(context.TODO(), updatedCm, metav1.UpdateOptions{}) if err != nil { return fmt.Errorf("failed to update configmap, error: %+v", err) } @@ -448,7 +449,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatus(akvs *akv.AzureKeyVaultSecr } akvsCopy.Status.LastAzureUpdate = c.clock.Now() - _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(context.TODO(), akvsCopy, metav1.UpdateOptions{}) return err } @@ -461,7 +462,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKey akvsCopy.Status.SecretHash = secretHash akvsCopy.Status.LastAzureUpdate = now - _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(context.TODO(), akvsCopy, metav1.UpdateOptions{}) return err } @@ -473,7 +474,7 @@ func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.Azure akvsCopy.Status.ConfigMapHash = cmHash akvsCopy.Status.LastAzureUpdate = c.clock.Now() - _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(akvsCopy) + _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(context.TODO(), akvsCopy, metav1.UpdateOptions{}) return err } diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index b6eda74e..746f49a5 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -21,6 +21,7 @@ package controller import ( "bytes" + "context" "crypto/md5" "encoding/hex" "fmt" @@ -91,7 +92,7 @@ func (c *Controller) deleteKubernetesConfigMapValues(akvs *akv.AzureKeyVaultSecr return err } - cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(newCM) + cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(context.TODO(), newCM, metav1.UpdateOptions{}) if err != nil { return err } @@ -119,7 +120,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) } - if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(createNewConfigMap(akvs, cmValues)); err != nil { + if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(context.TODO(), createNewConfigMap(akvs, cmValues), metav1.CreateOptions{}); err != nil { return nil, fmt.Errorf("failed to create new configmap, err: %+v", err) } @@ -146,12 +147,12 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre // Only delete if this akvs is the only owner if !hasMultipleOwners(cm.GetOwnerReferences()) { // Delete configmap - if err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Delete(cm.Name, nil); err != nil { + if err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Delete(context.TODO(), cm.Name, metav1.DeleteOptions{}); err != nil { return nil, err } } // Recreate configmap under new Name - if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(createNewConfigMap(akvs, cmValues)); err != nil { + if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(context.TODO(), createNewConfigMap(akvs, cmValues), metav1.CreateOptions{}); err != nil { return nil, err } return cm, nil @@ -165,7 +166,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre return nil, err } - cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(updatedCM) + cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(context.TODO(), updatedCM, metav1.UpdateOptions{}) if err == nil { klog.V(2).InfoS("configmap updated", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) } diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index b06731fd..9eb5382c 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -21,6 +21,7 @@ package controller import ( "bytes" + "context" "crypto/md5" "encoding/hex" "fmt" @@ -92,7 +93,7 @@ func (c *Controller) deleteKubernetesSecretValues(akvs *akv.AzureKeyVaultSecret) return err } - secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(newSecret) + secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(context.TODO(), newSecret, metav1.UpdateOptions{}) if err != nil { return err } @@ -117,7 +118,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err) } - if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(createNewSecret(akvs, secretValues)); err != nil { + if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(context.TODO(), createNewSecret(akvs, secretValues), metav1.CreateOptions{}); err != nil { return nil, err } @@ -143,13 +144,13 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) // Only delete if this akvs is the only owner if !hasMultipleOwners(secret.GetOwnerReferences()) { // Delete secret - if err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Delete(secret.Name, nil); err != nil { + if err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}); err != nil { return nil, err } } // Recreate secret under new Name - if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(createNewSecret(akvs, secretValues)); err != nil { + if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(context.TODO(), createNewSecret(akvs, secretValues), metav1.CreateOptions{}); err != nil { return nil, err } return secret, nil @@ -162,7 +163,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) if err != nil { return nil, err } - secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(updatedSecret) + secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(context.TODO(), updatedSecret, metav1.UpdateOptions{}) if err == nil { klog.V(2).InfoS("secret updated", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) } diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index 84136995..dc5d6640 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -34,6 +34,8 @@ import ( typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/record" + + json "k8s.io/component-base/logs/json" "k8s.io/klog/v2" "github.com/SparebankenVest/azure-key-vault-to-kubernetes/cmd/azure-keyvault-controller/controller" @@ -52,6 +54,7 @@ var ( kubeconfig string masterURL string cloudconfig string + logFormat string ) func initConfig() { @@ -63,6 +66,7 @@ func initConfig() { func init() { flag.CommandLine = flag.NewFlagSet("akv2k8s controller", flag.ExitOnError) + flag.StringVar(&logFormat, "logging-format", "text", "Log format - text or json.") flag.StringVar(&version, "version", "", "Version of this component.") flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") @@ -76,12 +80,14 @@ func main() { flag.Parse() initConfig() + if logFormat == "json" { + klog.SetLogger(json.JSONLogger) + } + klog.InfoS("log settings", "format", logFormat, "level", flag.Lookup("v").Value) + akv2k8s.Version = version akv2k8s.LogVersion() - klog.InfoS("log level", "level", flag.Lookup("v").Value) - klog.V(4).InfoS("some debug info...") - authType := viper.GetString("auth_type") // set up signals so we handle the first shutdown signal gracefully @@ -110,7 +116,7 @@ func main() { klog.V(2).InfoS("Creating event broadcaster") eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartLogging(klog.V(4).InfoS) + eventBroadcaster.StartLogging(klog.V(6).Infof) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) var vaultAuth credentialprovider.AzureKeyVaultCredentials diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 9f931cd6..7337f8ee 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -18,6 +18,7 @@ package main import ( + "context" "fmt" "os" "os/exec" @@ -281,13 +282,13 @@ func main() { } klog.V(4).InfoS("getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName)) - akvs, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(akvsName, v1.GetOptions{}) + akvs, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(context.TODO(), akvsName, v1.GetOptions{}) if err != nil { klog.ErrorS(err, "failed to get azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName)) klog.InfoS("will retry getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName), "retryTimes", config.retryTimes, "delay", config.waitTimeBetweenRetries) err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error { - akvs, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(akvsName, v1.GetOptions{}) + akvs, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(context.TODO(), akvsName, v1.GetOptions{}) if err != nil { klog.V(4).ErrorS(err, "error getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName)) return err diff --git a/cmd/azure-keyvault-secrets-webhook/authorization.go b/cmd/azure-keyvault-secrets-webhook/authorization.go index c70290ff..5f431f0a 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization.go @@ -1,6 +1,7 @@ package main import ( + "context" "fmt" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -14,7 +15,7 @@ type podData struct { } func authorize(clientset kubernetes.Interface, podData podData) error { - ns, err := clientset.CoreV1().Namespaces().Get(podData.namespace, metav1.GetOptions{}) + ns, err := clientset.CoreV1().Namespaces().Get(context.TODO(), podData.namespace, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get namespace '%s', error: %+v", podData.namespace, err) } @@ -23,7 +24,7 @@ func authorize(clientset kubernetes.Interface, podData podData) error { return fmt.Errorf("env-injection not enabled for namespace,") } - pod, err := clientset.CoreV1().Pods(podData.namespace).Get(podData.name, metav1.GetOptions{}) + pod, err := clientset.CoreV1().Pods(podData.namespace).Get(context.TODO(), podData.name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get pod '%s' in namespace '%s', error: %+v", podData.name, podData.namespace, err) } diff --git a/cmd/azure-keyvault-secrets-webhook/authorization_test.go b/cmd/azure-keyvault-secrets-webhook/authorization_test.go index d0cbebe5..d1eabaa5 100644 --- a/cmd/azure-keyvault-secrets-webhook/authorization_test.go +++ b/cmd/azure-keyvault-secrets-webhook/authorization_test.go @@ -1,6 +1,7 @@ package main import ( + "context" "os" "testing" "time" @@ -153,7 +154,7 @@ func TestTokenReview(t *testing.T) { }, } - trResult, err := clientset.AuthenticationV1().TokenReviews().Create(tr) + trResult, err := clientset.AuthenticationV1().TokenReviews().Create(context.TODO(), tr, metav1.CreateOptions{}) if err != nil { t.Error(err) } @@ -174,7 +175,7 @@ func TestTokenReview(t *testing.T) { }, }, } - sarResult, err := clientset.AuthorizationV1().SubjectAccessReviews().Create(sar) + sarResult, err := clientset.AuthorizationV1().SubjectAccessReviews().Create(context.TODO(), sar, metav1.CreateOptions{}) if err != nil { t.Error(err) } diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index da357765..b744d9f2 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -18,6 +18,7 @@ package main import ( + "context" "encoding/base64" "fmt" "io/ioutil" @@ -183,10 +184,10 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai }...) if useAuthService { - _, err := config.kubeClient.CoreV1().Secrets(namespace).Create(authServiceSecret) + _, err := config.kubeClient.CoreV1().Secrets(namespace).Create(context.TODO(), authServiceSecret, metav1.CreateOptions{}) if err != nil { if errors.IsAlreadyExists(err) { - _, err = config.kubeClient.CoreV1().Secrets(namespace).Update(authServiceSecret) + _, err = config.kubeClient.CoreV1().Secrets(namespace).Update(context.TODO(), authServiceSecret, metav1.UpdateOptions{}) if err != nil { return false, err } diff --git a/go.mod b/go.mod index cdf95949..6897d173 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/SparebankenVest/azure-key-vault-to-kubernetes -go 1.13 +go 1.15 require ( emperror.dev/errors v0.8.0 @@ -14,18 +14,21 @@ require ( github.com/docker/go-connections v0.4.0 // indirect github.com/gorilla/mux v1.7.4 github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5 - k8s.io/klog/v2 v2.3.0 github.com/opencontainers/image-spec v1.0.1 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.1.0 + github.com/prometheus/client_golang v1.7.1 github.com/slok/kubewebhook v0.4.0 github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.6.1 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 gopkg.in/yaml.v2 v2.3.0 - k8s.io/api v0.17.2 - k8s.io/apimachinery v0.17.2 - k8s.io/client-go v0.17.2 + k8s.io/api v0.19.3 + k8s.io/apimachinery v0.19.3 + k8s.io/client-go v0.19.3 + k8s.io/component-base v0.19.3 + k8s.io/klog/v2 v2.3.0 kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053 sigs.k8s.io/yaml v1.2.0 ) + +replace k8s.io/klog/v2 v2.3.0 => github.com/sparebankenvest/klog/v2 v2.3.1 diff --git a/go.sum b/go.sum index 22d23175..59003f8e 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,7 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -17,8 +18,6 @@ contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= emperror.dev/errors v0.8.0 h1:4lycVEx0sdJkwDUfQ9pdu6SR0x7rgympt5f4+ok8jDk= emperror.dev/errors v0.8.0/go.mod h1:YcRvLPh626Ubn2xqtoprejnA5nFha+TJ+2vew48kWuE= -github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg= -github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= github.com/Azure/aad-pod-identity v1.6.3 h1:S9ucEc0Fjlj3nLJhEItjxhHySgYzU5i+mer9fo+Fu4M= github.com/Azure/aad-pod-identity v1.6.3/go.mod h1:wFUg5YGthk9OLfwg0vImAf6i4vsw17xMgQ8j3MbyvrM= github.com/Azure/azure-sdk-for-go v40.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= @@ -31,6 +30,7 @@ github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSW github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY= github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.4 h1:iWJqGEvip7mjibEqC/srXNdo+4wLEPiwlP/7dZLtoPc= @@ -62,12 +62,8 @@ github.com/Azure/go-autorest/autorest/mocks v0.4.0 h1:z20OWOSG5aCye0HEkDp6TPmP17 github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0 h1:nQOZzFCudTh+TvquAtCRjM01VEYx85e9qbwt5ncW4L8= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= -github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= github.com/Azure/go-autorest/autorest/validation v0.1.0 h1:ISSNzGUh+ZSzizJWOWzs8bwpXIePbGLW4z/AmUFGH5A= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= -github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4= -github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= @@ -80,10 +76,6 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard v1.0.0 h1:k9QF73nrHT3nPLz3lu6G5s+3Hi8Je36ODr1F5gjAXXM= @@ -98,10 +90,10 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko 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/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= 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/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc h1:Q5jwbRq/a1Tien+Is8Zn6HMBRgE13+UOQ9mTvrIuvuE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= @@ -113,8 +105,6 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.35.2 h1:qK+noh6b9KW+5CP1NmmWsQCUbnzucSGrjHEs69MEl6A= -github.com/aws/aws-sdk-go v1.35.2/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= 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= @@ -122,36 +112,22 @@ 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/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= 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/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 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/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/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containers/image/v5 v5.3.0 h1:m16khjCxqo5KnjkpWHnQLxi1Iza+U68sfX7mN3c+6bs= -github.com/containers/image/v5 v5.3.0/go.mod h1:AUpxRzTM+7DObq2ja8UE1sxtfmMZ1KlW/qOJS0+sQw0= -github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDplZ7U33NwHZkrVELsZP5fYj9pM5WBZB2GE= -github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= -github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741 h1:8tQkOcednLJtUcZgK7sPglscXtxvMOnFOa6wd09VWLM= -github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/storage v1.16.5 h1:eHeWEhUEWX3VMIG1Vn1rEjfRoLHUQev3cwtA5zd89wk= -github.com/containers/storage v1.16.5/go.mod h1:SdysZeLKJOvfHYysUWg9OZUC3gdZWi5b2b7NC18VpPE= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -167,8 +143,6 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/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/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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -178,43 +152,36 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65 h1:4zlOyrJUbYnrvlzChJ+jP2J3i77Jbhm336NEuCv7kZo= -github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af h1:ujR+JcSHkOZMctuIgvi+a/VHpTn0nSy0W7eV5p34xjg= github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bPlG8QMY64VeXtVfjmjIlzaQok5Q= -github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969 h1:p2WzwcFof6KwsloLgCiAKkU5DJSVgOKGdevswAmskvY= -github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= 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/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -224,9 +191,7 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -235,7 +200,9 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0 github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540 h1:djv/qAomOVj8voCHt0M0OYwR/4vfDq1zNKSPKjJCexs= github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= 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-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-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -282,7 +249,6 @@ github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= @@ -306,21 +272,23 @@ github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2X github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= 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 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34= -github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= 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 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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= @@ -331,11 +299,13 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= 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 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -379,19 +349,19 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= @@ -403,13 +373,13 @@ github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsC github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285 h1:pBGAMRKP7Tpv4mOq+RgzKz+jAj+ylo9O8PiNoMmCuu8= -github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 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.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= @@ -418,8 +388,6 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= @@ -432,12 +400,10 @@ github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 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-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 v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 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= @@ -457,20 +423,15 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5 h1:6ZR6HQ+P9ZUwHlYq+bU7e9wqAImxKUguq8fp2gZSgCo= github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5/go.mod h1:Yho0S7KhsnHQRCC5lDraYF1SsLMeWtf/tKdufKu3TJA= -github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -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/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/go-ogle-analytics v0.0.0-20161213085824-14b04e0594ef/go.mod h1:PlwhC7q1VSK73InDzdDatVetQrTsQHIbOvcJAZzitY0= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -479,7 +440,10 @@ github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62F github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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 h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -492,29 +456,21 @@ github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I= -github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/pgzip v1.2.2 h1:8d4I0LDiieuGngsqlqOih9ker/NS0LX4V0i+EhiFWg0= -github.com/klauspost/pgzip v1.2.2/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 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.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -528,21 +484,15 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= -github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8= -github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -555,6 +505,7 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= 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= @@ -562,23 +513,14 @@ github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lN github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= -github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663 h1:Ri1EhipkbhWsffPJ3IPlrb4SkTOPa2PfRXp3jchBczw= github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7FrlLismspbPc1teNRUVH7wLQ8= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -587,9 +529,8 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -597,31 +538,14 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 h1:yN8BPXVwMBAm3Cuvh1L5XE8XpvYRMdsVLd82ILprhUU= -github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.4.0 h1:cpiX/2wWIju/6My60T6/z9CxNG7c8xTQyEmA9fChpUo= -github.com/opencontainers/selinux v1.4.0/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw= -github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= @@ -640,40 +564,34 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb 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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9 h1:kyf9snWXHvQc+yxE9imhdI8YAm4oKeZISlaAR+x73zs= -github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= 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 v0.9.4/go.mod h1:oCXIBxdI62A4cR6aTRJCgetEjecSIYzOEaeAn4iYEpM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 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 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= 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.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/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.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/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.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/prom2json v1.1.0/go.mod h1:v7OY1795b9fEUZgq4UU2+15YjRv0LfpxKejIQCy3L7o= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -682,10 +600,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -693,10 +609,8 @@ github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= @@ -713,6 +627,8 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/sparebankenvest/klog/v2 v2.3.1 h1:nZ0jM6A11OjmeSkO0DpSXtkbJrDZE4Ud0BHM481d7cI= +github.com/sparebankenvest/klog/v2 v2.3.1/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -736,7 +652,6 @@ 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.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= 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.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -749,17 +664,10 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= -github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec h1:AmoEvWAO3nDx1MEcMzPh+GzOOIA5Znpv6++c7bePPY0= github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -767,26 +675,13 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -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.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ultraware/funlen v0.0.1 h1:UeC9tpM4wNWzUJfan8z9sFE4QCzjjzlCZmuJN+aOkH0= github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= -github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= -github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v0.0.0-20190816131739-be0936907f66/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 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= @@ -803,6 +698,8 @@ 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 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/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.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= @@ -826,12 +723,10 @@ golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8U 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-20190611184440-5c40567a22f8/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg= -golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -841,6 +736,7 @@ golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxT 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-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 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= @@ -850,10 +746,12 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl 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/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/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -873,24 +771,23 @@ golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn 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 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/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 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/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-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/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= @@ -908,7 +805,6 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h 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-20181206074257-70b957f3b65e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -919,37 +815,33 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867 h1:JoRuNIf+rpHl+VhScRQQvzbHed86tKkqwPMV34T8myw= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/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-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-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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= @@ -976,16 +868,19 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/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-20190624222133-a101b041ded4/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-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-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/version v0.1.0/go.mod h1:Y8xuV02mL/45psyPKG3NCVOwvAOy6T5Kx0l3rCjKSjU= @@ -998,6 +893,7 @@ google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E 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.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1005,6 +901,8 @@ google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/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= @@ -1017,23 +915,29 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +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.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.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +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 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= 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= @@ -1041,8 +945,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -1056,7 +958,6 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXL 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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -1064,7 +965,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/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.7/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 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= @@ -1073,56 +974,63 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= 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= -istio.io/api v0.0.0-20190515205759-982e5c3888c6/go.mod h1:hhLFQmpHia8zgaM37vb2ml9iS5NfNfqZGRt1pS9aVEo= -istio.io/pkg v0.0.0-20201002213810-7a3a61d8b48a h1:TGdNrwOIo6HGql49hw8ZiHyxUHK2MuKrtrs/ESGI8lY= -istio.io/pkg v0.0.0-20201002213810-7a3a61d8b48a/go.mod h1:p6wktGBjkjL3spRSsyfOh0XkuKb8IuBX61rERHfmSbU= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b h1:38Nx0U83WjBqn1hUWxlgKc7mvH7WhyHfypxeW3zWwCQ= k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= k8s.io/api v0.0.0-20191114100352-16d7abae0d2a/go.mod h1:qetVJgs5i8jwdFIdoOZ70ks0ecgU+dYwqZ2uD1srwOU= k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= -k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms= +k8s.io/api v0.19.3 h1:GN6ntFnv44Vptj/b+OnMW7FmzkpDoIDLZRvKX3XH9aU= +k8s.io/api v0.19.3/go.mod h1:VF+5FT1B74Pw3KxMdKyinLo+zynBaMBiAfGMuldcNDs= k8s.io/apiextensions-apiserver v0.0.0-20191114105449-027877536833/go.mod h1:Gb1G2W/kXMizbVTnA9oh2ybQ4cM3COr3r5JDj+DzKGw= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a h1:lDydUqHrbL/1l5ZQrqD1RIlabhmX8aiZEtxVUb+30iU= k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= k8s.io/apimachinery v0.0.0-20191028221656-72ed19daf4bb/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4= k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.19.3 h1:bpIQXlKjB4cB/oNpnNnV+BybGPR7iP5oYpsOTEJ4hgc= +k8s.io/apimachinery v0.19.3/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apiserver v0.0.0-20191114103151-9ca1dc586682/go.mod h1:Idob8Va6/sMX5SmwPLsU0pdvFlkwxuJ5x+fXMG8NbKE= k8s.io/cli-runtime v0.0.0-20191114110141-0a35778df828/go.mod h1:r9ARs2FUnSgInbeN4+mo9nFzf7oqUtRZ3tcuEcoelR4= -k8s.io/client-go v0.0.0-20170217214107-bcde30fb7eae/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7 h1:WyPHgjjXvF4zVVwKGZKKiJGBUW45AuN44uSOuH8euuE= k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= k8s.io/client-go v0.0.0-20191114101535-6c5935290e33/go.mod h1:4L/zQOBkEf4pArQJ+CMk1/5xjA30B5oyWv+Bzb44DOw= k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc= k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= +k8s.io/client-go v0.19.3 h1:ctqR1nQ52NUs6LpI0w+a5U+xjYwflFwA13OJKcicMxg= +k8s.io/client-go v0.19.3/go.mod h1:+eEMktZM+MG0KO+PTkci8xnbCZHvj9TqR6Q1XDUIJOM= k8s.io/code-generator v0.0.0-20191004115455-8e001e5d1894/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY= k8s.io/component-base v0.0.0-20191114102325-35a9586014f7/go.mod h1:9rNMvrwbqPF4MxI+VQYETrWqMKxi8yAd8YZLdSJ9EDw= +k8s.io/component-base v0.19.3 h1:c+DzDNAQFlaoyX+yv8YuWi8xmlQvvY5DnJGbaz5U74o= +k8s.io/component-base v0.19.3/go.mod h1:WhLWSIefQn8W8jxSLl5WNiR6z8oyMe/8Zywg7alOkRc= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.3.0 h1:WmkrnW7fdrm0/DMClc+HIxtftvxVIPAhlVwMQo5yLco= -k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-aggregator v0.0.0-20191114103820-f023614fb9ea/go.mod h1:LlqyQuTxPHvUzmEgT71Cl/BB86o5+UcbN1LiGgSz94U= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053 h1:Zx4CChonrlcoH6cq3m+pA9OW6j7jyciqLp9dHZnMcXM= kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053/go.mod h1:z/AkrES60XR+jeKGg5zJyPd13NdG/Di0BptbG1gnS60= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= @@ -1140,7 +1048,10 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca h1:6dsH6AYQWbyZmtttJNe8Gq1cXOeS1BdV3eW37zHilAQ= sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= diff --git a/pkg/docker/registry/container.go b/pkg/docker/registry/container.go index 277c1635..d1be9fa2 100644 --- a/pkg/docker/registry/container.go +++ b/pkg/docker/registry/container.go @@ -18,6 +18,7 @@ package registry import ( + "context" "encoding/base64" "encoding/json" "fmt" @@ -157,7 +158,7 @@ func getAcrCredentials(k *ContainerInfo, cloudConfigPath string) (bool, error) { } func (k *ContainerInfo) readDockerSecret(namespace, secretName string) (map[string][]byte, error) { - secret, err := k.clientset.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{}) + secret, err := k.clientset.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, metav1.GetOptions{}) if err != nil { return nil, err } diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go index 5408964b..f4940067 100644 --- a/pkg/k8s/client/clientset/versioned/clientset.go +++ b/pkg/k8s/client/clientset/versioned/clientset.go @@ -78,7 +78,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { if configShallowCopy.Burst <= 0 { - return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") + return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") } configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) } diff --git a/pkg/k8s/client/clientset/versioned/fake/register.go b/pkg/k8s/client/clientset/versioned/fake/register.go index 0c4d891e..d5882b66 100644 --- a/pkg/k8s/client/clientset/versioned/fake/register.go +++ b/pkg/k8s/client/clientset/versioned/fake/register.go @@ -34,7 +34,7 @@ import ( var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) -var parameterCodec = runtime.NewParameterCodec(scheme) + var localSchemeBuilder = runtime.SchemeBuilder{ keyvaultv1alpha1.AddToScheme, keyvaultv1.AddToScheme, diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go index afe38283..f80483a9 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go @@ -22,6 +22,7 @@ limitations under the License. package v1 import ( + "context" "time" v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" @@ -40,15 +41,15 @@ type AzureKeyVaultSecretsGetter interface { // AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources. type AzureKeyVaultSecretInterface interface { - Create(*v1.AzureKeyVaultSecret) (*v1.AzureKeyVaultSecret, error) - Update(*v1.AzureKeyVaultSecret) (*v1.AzureKeyVaultSecret, error) - UpdateStatus(*v1.AzureKeyVaultSecret) (*v1.AzureKeyVaultSecret, error) - Delete(name string, options *metav1.DeleteOptions) error - DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error - Get(name string, options metav1.GetOptions) (*v1.AzureKeyVaultSecret, error) - List(opts metav1.ListOptions) (*v1.AzureKeyVaultSecretList, error) - Watch(opts metav1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.AzureKeyVaultSecret, err error) + Create(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.CreateOptions) (*v1.AzureKeyVaultSecret, error) + Update(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (*v1.AzureKeyVaultSecret, error) + UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (*v1.AzureKeyVaultSecret, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.AzureKeyVaultSecret, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.AzureKeyVaultSecretList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.AzureKeyVaultSecret, err error) AzureKeyVaultSecretExpansion } @@ -67,20 +68,20 @@ func newAzureKeyVaultSecrets(c *KeyvaultV1Client, namespace string) *azureKeyVau } // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *azureKeyVaultSecrets) Get(name string, options metav1.GetOptions) (result *v1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.AzureKeyVaultSecret, err error) { result = &v1.AzureKeyVaultSecret{} err = c.client.Get(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(name). VersionedParams(&options, scheme.ParameterCodec). - Do(). + Do(ctx). Into(result) return } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *azureKeyVaultSecrets) List(opts metav1.ListOptions) (result *v1.AzureKeyVaultSecretList, err error) { +func (c *azureKeyVaultSecrets) List(ctx context.Context, opts metav1.ListOptions) (result *v1.AzureKeyVaultSecretList, err error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -91,13 +92,13 @@ func (c *azureKeyVaultSecrets) List(opts metav1.ListOptions) (result *v1.AzureKe Resource("azurekeyvaultsecrets"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Do(). + Do(ctx). Into(result) return } // Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. -func (c *azureKeyVaultSecrets) Watch(opts metav1.ListOptions) (watch.Interface, error) { +func (c *azureKeyVaultSecrets) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -108,87 +109,90 @@ func (c *azureKeyVaultSecrets) Watch(opts metav1.ListOptions) (watch.Interface, Resource("azurekeyvaultsecrets"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Watch() + Watch(ctx) } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v1.AzureKeyVaultSecret) (result *v1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.CreateOptions) (result *v1.AzureKeyVaultSecret, err error) { result = &v1.AzureKeyVaultSecret{} err = c.client.Post(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v1.AzureKeyVaultSecret) (result *v1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (result *v1.AzureKeyVaultSecret, err error) { result = &v1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(azureKeyVaultSecret.Name). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). - -func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1.AzureKeyVaultSecret) (result *v1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (result *v1.AzureKeyVaultSecret, err error) { result = &v1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(azureKeyVaultSecret.Name). SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. -func (c *azureKeyVaultSecrets) Delete(name string, options *metav1.DeleteOptions) error { +func (c *azureKeyVaultSecrets) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(name). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // DeleteCollection deletes a collection of objects. -func (c *azureKeyVaultSecrets) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { +func (c *azureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second } return c.client.Delete(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). - VersionedParams(&listOptions, scheme.ParameterCodec). + VersionedParams(&listOpts, scheme.ParameterCodec). Timeout(timeout). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.AzureKeyVaultSecret, err error) { result = &v1.AzureKeyVaultSecret{} err = c.client.Patch(pt). Namespace(c.ns). Resource("azurekeyvaultsecrets"). - SubResource(subresources...). Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). Body(data). - Do(). + Do(ctx). Into(result) return } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go index 211c3d19..e4123f98 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go @@ -22,6 +22,8 @@ limitations under the License. package fake import ( + "context" + azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" @@ -42,7 +44,7 @@ var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault. var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{}) @@ -53,7 +55,7 @@ func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (resu } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *azurekeyvaultv1.AzureKeyVaultSecretList, err error) { +func (c *FakeAzureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *azurekeyvaultv1.AzureKeyVaultSecretList, err error) { obj, err := c.Fake. Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &azurekeyvaultv1.AzureKeyVaultSecretList{}) @@ -75,14 +77,14 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *azurekeyva } // Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. -func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *FakeAzureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { return c.Fake. InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretsResource, c.ns, opts)) } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) @@ -93,7 +95,7 @@ func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *azurekeyvaultv1.A } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) @@ -105,7 +107,7 @@ func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *azurekeyvaultv1.A // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (*azurekeyvaultv1.AzureKeyVaultSecret, error) { +func (c *FakeAzureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*azurekeyvaultv1.AzureKeyVaultSecret, error) { obj, err := c.Fake. Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{}) @@ -116,7 +118,7 @@ func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *azurekeyvau } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. -func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { +func (c *FakeAzureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{}) @@ -124,15 +126,15 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions } // DeleteCollection deletes a collection of objects. -func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions) +func (c *FakeAzureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOpts) _, err := c.Fake.Invokes(action, &azurekeyvaultv1.AzureKeyVaultSecretList{}) return err } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &azurekeyvaultv1.AzureKeyVaultSecret{}) diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go index aee669ed..3477b59c 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go @@ -22,6 +22,7 @@ limitations under the License. package v1alpha1 import ( + "context" "time" v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" @@ -40,15 +41,15 @@ type AzureKeyVaultSecretsGetter interface { // AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources. type AzureKeyVaultSecretInterface interface { - Create(*v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error) - Update(*v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error) - UpdateStatus(*v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v1alpha1.AzureKeyVaultSecret, error) - List(opts v1.ListOptions) (*v1alpha1.AzureKeyVaultSecretList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) + Create(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.CreateOptions) (*v1alpha1.AzureKeyVaultSecret, error) + Update(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v1alpha1.AzureKeyVaultSecret, error) + UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v1alpha1.AzureKeyVaultSecret, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.AzureKeyVaultSecret, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.AzureKeyVaultSecretList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) AzureKeyVaultSecretExpansion } @@ -67,20 +68,20 @@ func newAzureKeyVaultSecrets(c *KeyvaultV1alpha1Client, namespace string) *azure } // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *azureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { result = &v1alpha1.AzureKeyVaultSecret{} err = c.client.Get(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(name). VersionedParams(&options, scheme.ParameterCodec). - Do(). + Do(ctx). Into(result) return } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) { +func (c *azureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -91,13 +92,13 @@ func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.Azure Resource("azurekeyvaultsecrets"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Do(). + Do(ctx). Into(result) return } // Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. -func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *azureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -108,87 +109,90 @@ func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, erro Resource("azurekeyvaultsecrets"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Watch() + Watch(ctx) } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { result = &v1alpha1.AzureKeyVaultSecret{} err = c.client.Post(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { result = &v1alpha1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(azureKeyVaultSecret.Name). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). - -func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { result = &v1alpha1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(azureKeyVaultSecret.Name). SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. -func (c *azureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { +func (c *azureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(name). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // DeleteCollection deletes a collection of objects. -func (c *azureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { +func (c *azureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second } return c.client.Delete(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). - VersionedParams(&listOptions, scheme.ParameterCodec). + VersionedParams(&listOpts, scheme.ParameterCodec). Timeout(timeout). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) { result = &v1alpha1.AzureKeyVaultSecret{} err = c.client.Patch(pt). Namespace(c.ns). Resource("azurekeyvaultsecrets"). - SubResource(subresources...). Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). Body(data). - Do(). + Do(ctx). Into(result) return } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go index 43eaea37..5f25d068 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go @@ -22,6 +22,8 @@ limitations under the License. package fake import ( + "context" + v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" @@ -42,7 +44,7 @@ var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault. var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v1alpha1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &v1alpha1.AzureKeyVaultSecret{}) @@ -53,7 +55,7 @@ func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (resu } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) { +func (c *FakeAzureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) { obj, err := c.Fake. Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &v1alpha1.AzureKeyVaultSecretList{}) @@ -75,14 +77,14 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.A } // Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. -func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *FakeAzureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { return c.Fake. InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretsResource, c.ns, opts)) } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v1alpha1.AzureKeyVaultSecret{}) @@ -93,7 +95,7 @@ func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v1alpha1.AzureKey } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v1alpha1.AzureKeyVaultSecret{}) @@ -105,7 +107,7 @@ func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v1alpha1.AzureKey // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error) { +func (c *FakeAzureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v1alpha1.AzureKeyVaultSecret, error) { obj, err := c.Fake. Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &v1alpha1.AzureKeyVaultSecret{}) @@ -116,7 +118,7 @@ func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1alpha1.Az } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. -func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { +func (c *FakeAzureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &v1alpha1.AzureKeyVaultSecret{}) @@ -124,15 +126,15 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions } // DeleteCollection deletes a collection of objects. -func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions) +func (c *FakeAzureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOpts) _, err := c.Fake.Invokes(action, &v1alpha1.AzureKeyVaultSecretList{}) return err } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &v1alpha1.AzureKeyVaultSecret{}) diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go index aefc97f0..1cbb95e8 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go @@ -22,6 +22,7 @@ limitations under the License. package v2beta1 import ( + "context" "time" v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" @@ -40,15 +41,15 @@ type AzureKeyVaultSecretsGetter interface { // AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources. type AzureKeyVaultSecretInterface interface { - Create(*v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) - Update(*v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) - UpdateStatus(*v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) - Delete(name string, options *v1.DeleteOptions) error - DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*v2beta1.AzureKeyVaultSecret, error) - List(opts v1.ListOptions) (*v2beta1.AzureKeyVaultSecretList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) + Create(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.CreateOptions) (*v2beta1.AzureKeyVaultSecret, error) + Update(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v2beta1.AzureKeyVaultSecret, error) + UpdateStatus(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v2beta1.AzureKeyVaultSecret, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v2beta1.AzureKeyVaultSecret, error) + List(ctx context.Context, opts v1.ListOptions) (*v2beta1.AzureKeyVaultSecretList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) AzureKeyVaultSecretExpansion } @@ -67,20 +68,20 @@ func newAzureKeyVaultSecrets(c *KeyvaultV2beta1Client, namespace string) *azureK } // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *azureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Get(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(name). VersionedParams(&options, scheme.ParameterCodec). - Do(). + Do(ctx). Into(result) return } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) { +func (c *azureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -91,13 +92,13 @@ func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2beta1.AzureK Resource("azurekeyvaultsecrets"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Do(). + Do(ctx). Into(result) return } // Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. -func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *azureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -108,87 +109,90 @@ func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, erro Resource("azurekeyvaultsecrets"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Watch() + Watch(ctx) } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Post(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(azureKeyVaultSecret.Name). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). - -func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Put(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(azureKeyVaultSecret.Name). SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). Body(azureKeyVaultSecret). - Do(). + Do(ctx). Into(result) return } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. -func (c *azureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { +func (c *azureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). Name(name). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // DeleteCollection deletes a collection of objects. -func (c *azureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { +func (c *azureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second } return c.client.Delete(). Namespace(c.ns). Resource("azurekeyvaultsecrets"). - VersionedParams(&listOptions, scheme.ParameterCodec). + VersionedParams(&listOpts, scheme.ParameterCodec). Timeout(timeout). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *azureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) { result = &v2beta1.AzureKeyVaultSecret{} err = c.client.Patch(pt). Namespace(c.ns). Resource("azurekeyvaultsecrets"). - SubResource(subresources...). Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). Body(data). - Do(). + Do(ctx). Into(result) return } diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go index 4a60ac09..b0c0025f 100644 --- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go +++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go @@ -22,6 +22,8 @@ limitations under the License. package fake import ( + "context" + v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" @@ -42,7 +44,7 @@ var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault. var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v2beta1", Kind: "AzureKeyVaultSecret"} // Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any. -func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &v2beta1.AzureKeyVaultSecret{}) @@ -53,7 +55,7 @@ func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (resu } // List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors. -func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) { +func (c *FakeAzureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) { obj, err := c.Fake. Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &v2beta1.AzureKeyVaultSecretList{}) @@ -75,14 +77,14 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v2beta1.Az } // Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets. -func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *FakeAzureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { return c.Fake. InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretsResource, c.ns, opts)) } // Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{}) @@ -93,7 +95,7 @@ func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v2beta1.AzureKeyV } // Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any. -func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{}) @@ -105,7 +107,7 @@ func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v2beta1.AzureKeyV // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret) (*v2beta1.AzureKeyVaultSecret, error) { +func (c *FakeAzureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v2beta1.AzureKeyVaultSecret, error) { obj, err := c.Fake. Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{}) @@ -116,7 +118,7 @@ func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v2beta1.Azu } // Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs. -func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error { +func (c *FakeAzureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &v2beta1.AzureKeyVaultSecret{}) @@ -124,15 +126,15 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions } // DeleteCollection deletes a collection of objects. -func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions) +func (c *FakeAzureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOpts) _, err := c.Fake.Invokes(action, &v2beta1.AzureKeyVaultSecretList{}) return err } // Patch applies the patch and returns the patched azureKeyVaultSecret. -func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) { +func (c *FakeAzureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) { obj, err := c.Fake. Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &v2beta1.AzureKeyVaultSecret{}) diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go index fb20bd13..6088b352 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go @@ -22,6 +22,7 @@ limitations under the License. package v1 import ( + "context" time "time" azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1" @@ -64,13 +65,13 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).List(options) + return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).Watch(options) + return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).Watch(context.TODO(), options) }, }, &azurekeyvaultv1.AzureKeyVaultSecret{}, diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go index 630ff027..b0353c58 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go @@ -22,6 +22,7 @@ limitations under the License. package v1alpha1 import ( + "context" time "time" azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1" @@ -64,13 +65,13 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).List(options) + return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).List(context.TODO(), options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).Watch(options) + return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).Watch(context.TODO(), options) }, }, &azurekeyvaultv1alpha1.AzureKeyVaultSecret{}, diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go index 15467f5a..e4a7eafc 100644 --- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go @@ -22,6 +22,7 @@ limitations under the License. package v2beta1 import ( + "context" time "time" azurekeyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" @@ -64,13 +65,13 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).List(options) + return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).List(context.TODO(), options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).Watch(options) + return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).Watch(context.TODO(), options) }, }, &azurekeyvaultv2beta1.AzureKeyVaultSecret{}, diff --git a/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go index 848565f8..5decd711 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go @@ -29,8 +29,10 @@ import ( ) // AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets. +// All objects returned here must be treated as read-only. type AzureKeyVaultSecretLister interface { // List lists all AzureKeyVaultSecrets in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.AzureKeyVaultSecret, err error) // AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets. AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister @@ -61,10 +63,13 @@ func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) Azure } // AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets. +// All objects returned here must be treated as read-only. type AzureKeyVaultSecretNamespaceLister interface { // List lists all AzureKeyVaultSecrets in the indexer for a given namespace. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.AzureKeyVaultSecret, err error) // Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.AzureKeyVaultSecret, error) AzureKeyVaultSecretNamespaceListerExpansion } diff --git a/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go index 7a96f389..07c46eb1 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go @@ -29,8 +29,10 @@ import ( ) // AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets. +// All objects returned here must be treated as read-only. type AzureKeyVaultSecretLister interface { // List lists all AzureKeyVaultSecrets in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1alpha1.AzureKeyVaultSecret, err error) // AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets. AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister @@ -61,10 +63,13 @@ func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) Azure } // AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets. +// All objects returned here must be treated as read-only. type AzureKeyVaultSecretNamespaceLister interface { // List lists all AzureKeyVaultSecrets in the indexer for a given namespace. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1alpha1.AzureKeyVaultSecret, err error) // Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. Get(name string) (*v1alpha1.AzureKeyVaultSecret, error) AzureKeyVaultSecretNamespaceListerExpansion } diff --git a/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go index ee9384df..5ec6294b 100644 --- a/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go +++ b/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go @@ -29,8 +29,10 @@ import ( ) // AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets. +// All objects returned here must be treated as read-only. type AzureKeyVaultSecretLister interface { // List lists all AzureKeyVaultSecrets in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) // AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets. AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister @@ -61,10 +63,13 @@ func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) Azure } // AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets. +// All objects returned here must be treated as read-only. type AzureKeyVaultSecretNamespaceLister interface { // List lists all AzureKeyVaultSecrets in the indexer for a given namespace. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) // Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. Get(name string) (*v2beta1.AzureKeyVaultSecret, error) AzureKeyVaultSecretNamespaceListerExpansion } From 71fae71bd6c60ab6c38a9f174ccf1cbebc66f96e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Mon, 26 Oct 2020 23:45:14 +0100 Subject: [PATCH 248/251] crds: updated akvs --- crds/AzureKeyVaultSecret.yaml | 334 +++++++++++++++++++------ crds/AzureKeyVaultSecret_v2alpha1.yaml | 108 -------- 2 files changed, 264 insertions(+), 178 deletions(-) delete mode 100644 crds/AzureKeyVaultSecret_v2alpha1.yaml diff --git a/crds/AzureKeyVaultSecret.yaml b/crds/AzureKeyVaultSecret.yaml index 3b66f262..a7b9cc0b 100644 --- a/crds/AzureKeyVaultSecret.yaml +++ b/crds/AzureKeyVaultSecret.yaml @@ -1,11 +1,7 @@ -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: azurekeyvaultsecrets.spv.no - labels: - app.kubernetes.io/name: akv2k8s - annotations: - "helm.sh/resource-policy": keep spec: group: spv.no names: @@ -17,84 +13,282 @@ spec: - akvs categories: - all - additionalPrinterColumns: - - name: Vault - type: string - description: Which Azure Key Vault this resource is asosiated with - JSONPath: .spec.vault.name - - name: Vault Object - type: string - description: Which Azure Key Vault object this resource is asosiated with - JSONPath: .spec.vault.object.name - - name: Secret Name - type: string - description: Which Kubernetes Secret this resource is synched with, if any - JSONPath: .status.secretName - - name: Synched - type: string - description: When this resource was last synched with Azure Key Vault - JSONPath: .status.lastAzureUpdate scope: Namespaced versions: - name: v1alpha1 served: true storage: false + subresources: + status: {} + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: object + required: ['vault'] + properties: + vault: + type: object + required: ['name', 'object'] + properties: + name: + type: string + description: Name of the Azure Key Vault + object: + type: object + required: ['name', 'type'] + properties: + name: + type: string + description: The object name in Azure Key Vault + type: + type: string + description: The type of object in Azure Key Vault + enum: + - secret + - certificate + - key + - multi-key-value-secret + version: + type: string + description: The object version in Azure Key Vault + contentType: + type: string + description: Only used when type is multi-key-value-secret. + enum: + - application/x-json + - application/x-yaml + output: + type: object + properties: + transform: + type: array + items: + type: string + secret: + type: object + required: ['name'] + properties: + name: + type: string + description: Name for Kubernetes secret + type: + type: string + description: Type of Secret in Kubernetes + dataKey: + type: string + description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data + status: + type: object + x-kubernetes-preserve-unknown-fields: true + + additionalPrinterColumns: + - name: Vault + type: string + description: Which Azure Key Vault this resource is asosiated with + jsonPath: .spec.vault.name + - name: Vault Object + type: string + description: Which Azure Key Vault object this resource is asosiated with + jsonPath: .spec.vault.object.name + - name: Output Object + type: string + description: Which Kubernetes Secret or ConfigMap this resource is synched with, if any + jsonPath: .status.secretName + - name: Synched + type: string + description: When this resource was last synched with Azure Key Vault + jsonPath: .status.lastAzureUpdate + - name: v1 served: true - storage: true - - subresources: - status: {} - validation: - openAPIV3Schema: - properties: - spec: - required: ['vault'] + storage: false + subresources: + status: {} + schema: + openAPIV3Schema: + type: object properties: - vault: - required: ['name', 'object'] + spec: + type: object + required: ['vault'] properties: - name: - type: string - description: Name of the Azure Key Vault - object: - required: ['name', 'type'] + vault: + type: object + required: ['name', 'object'] properties: name: type: string - description: The object name in Azure Key Vault - type: - type: string - description: The type of object in Azure Key Vault - enum: - - secret - - certificate - - key - - multi-key-value-secret - version: - type: string - description: The object version in Azure Key Vault - contentType: - type: string - description: Only used when type is multi-key-value-secret. - enum: - - application/x-json - - application/x-yaml - output: + description: Name of the Azure Key Vault + object: + type: object + required: ['name', 'type'] + properties: + name: + type: string + description: The object name in Azure Key Vault + type: + type: string + description: The type of object in Azure Key Vault + enum: + - secret + - certificate + - key + - multi-key-value-secret + version: + type: string + description: The object version in Azure Key Vault + contentType: + type: string + description: Only used when type is multi-key-value-secret. + enum: + - application/x-json + - application/x-yaml + output: + type: object + properties: + transform: + type: array + items: + type: string + secret: + type: object + required: ['name'] + properties: + name: + type: string + description: Name for Kubernetes secret + type: + type: string + description: Type of Secret in Kubernetes + dataKey: + type: string + description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data + status: + type: object + x-kubernetes-preserve-unknown-fields: true + + additionalPrinterColumns: + - name: Vault + type: string + description: Which Azure Key Vault this resource is asosiated with + jsonPath: .spec.vault.name + - name: Vault Object + type: string + description: Which Azure Key Vault object this resource is asosiated with + jsonPath: .spec.vault.object.name + - name: Secret Name + type: string + description: Which Kubernetes Secret this resource is synched with, if any + jsonPath: .status.secretName + - name: Synched + type: string + description: When this resource was last synched with Azure Key Vault + jsonPath: .status.lastAzureUpdate + + - name: v2beta1 + served: true + storage: true + subresources: + status: {} + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: object + required: ['vault'] properties: - transform: - type: array - items: - type: string - secret: - required: ['name'] + vault: + type: object + required: ['name', 'object'] properties: name: type: string - description: Name for Kubernetes secret - type: - type: string - description: Type of Secret in Kubernetes - dataKey: - type: string - description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data + description: Name of the Azure Key Vault + object: + type: object + required: ['name', 'type'] + properties: + name: + type: string + description: The object name in Azure Key Vault + type: + type: string + description: The type of object in Azure Key Vault + enum: + - secret + - certificate + - key + - multi-key-value-secret + version: + type: string + description: The object version in Azure Key Vault + contentType: + type: string + description: Only used when type is multi-key-value-secret. + enum: + - application/x-json + - application/x-yaml + azureIdentity: + type: object + properties: + name: + type: string + description: Name of the azureIdentity to use for Azure Key Vault authentication + output: + type: object + properties: + transform: + type: array + items: + type: string + secret: + type: object + required: ['name'] + properties: + name: + type: string + description: Name for Kubernetes secret + type: + type: string + description: Type of Secret in Kubernetes + dataKey: + type: string + description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data + configMap: + type: object + required: ['name', 'dataKey'] + properties: + name: + type: string + description: Name for Kubernetes ConfigMap + dataKey: + type: string + description: The key to use in Kubernetes ConfigMap when setting the value from Azure Keyv Vault object data + status: + type: object + x-kubernetes-preserve-unknown-fields: true + + additionalPrinterColumns: + - name: Vault + type: string + description: Which Azure Key Vault this resource is asosiated with + jsonPath: .spec.vault.name + - name: Vault Object + type: string + description: Which Azure Key Vault object this resource is asosiated with + jsonPath: .spec.vault.object.name + - name: Secret Name + type: string + description: Which Kubernetes Secret this resource is synched with, if any + jsonPath: .status.secretName + - name: ConfigMap Name + type: string + description: Which Kubernetes ConfigMap this resource is synched with, if any + jsonPath: .status.configMapName + - name: Last Synched + type: date + description: When this resource was last synched with Azure Key Vault + jsonPath: .status.lastAzureUpdate diff --git a/crds/AzureKeyVaultSecret_v2alpha1.yaml b/crds/AzureKeyVaultSecret_v2alpha1.yaml deleted file mode 100644 index 5c56e38c..00000000 --- a/crds/AzureKeyVaultSecret_v2alpha1.yaml +++ /dev/null @@ -1,108 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: azurekeyvaultsecrets.spv.no - labels: - app.kubernetes.io/name: akv2k8s - annotations: - "helm.sh/resource-policy": keep -spec: - group: spv.no - names: - kind: AzureKeyVaultSecret - listKind: AzureKeyVaultSecretList - plural: azurekeyvaultsecrets - singular: azurekeyvaultsecret - shortNames: - - akvs - categories: - - all - additionalPrinterColumns: - - name: Vault - type: string - description: Which Azure Key Vault this resource is asosiated with - JSONPath: .spec.vault.name - - name: Vault Object - type: string - description: Which Azure Key Vault object this resource is asosiated with - JSONPath: .spec.vault.object.name - - name: Secret Name - type: string - description: Which Kubernetes Secret this resource is synched with, if any - JSONPath: .status.secretName - - name: Synched - type: string - description: When this resource was last synched with Azure Key Vault - JSONPath: .status.lastAzureUpdate - scope: Namespaced - versions: - - name: v1alpha1 - served: true - storage: false - - name: v1 - served: true - storage: false - - name: v2alpha1 - served: true - storage: true - - subresources: - status: {} - validation: - openAPIV3Schema: - properties: - spec: - required: ['vault'] - properties: - vault: - required: ['name', 'object'] - properties: - name: - type: string - description: Name of the Azure Key Vault - object: - required: ['name', 'type'] - properties: - name: - type: string - description: The object name in Azure Key Vault - type: - type: string - description: The type of object in Azure Key Vault - enum: - - secret - - certificate - - key - - multi-key-value-secret - version: - type: string - description: The object version in Azure Key Vault - contentType: - type: string - description: Only used when type is multi-key-value-secret. - enum: - - application/x-json - - application/x-yaml - identity: - properties: - name: - type: string - description: Name of the AzureKeyVaultSecretIdentity to use for Azure Key Vault authentication - output: - properties: - transform: - type: array - items: - type: string - secret: - required: ['name'] - properties: - name: - type: string - description: Name for Kubernetes secret - type: - type: string - description: Type of Secret in Kubernetes - dataKey: - type: string - description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data From 2e99ee0fdb2348230f3735126c146affbd295e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Wed, 28 Oct 2020 12:54:00 +0100 Subject: [PATCH 249/251] upated version of klog, with fix for issue with logr and multiple keys and values --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 6897d173..352b5874 100644 --- a/go.mod +++ b/go.mod @@ -26,9 +26,7 @@ require ( k8s.io/apimachinery v0.19.3 k8s.io/client-go v0.19.3 k8s.io/component-base v0.19.3 - k8s.io/klog/v2 v2.3.0 + k8s.io/klog/v2 v2.3.1-0.20201028104956-52c62e3b70a9 kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053 sigs.k8s.io/yaml v1.2.0 ) - -replace k8s.io/klog/v2 v2.3.0 => github.com/sparebankenvest/klog/v2 v2.3.1 diff --git a/go.sum b/go.sum index 59003f8e..c211574f 100644 --- a/go.sum +++ b/go.sum @@ -627,8 +627,6 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/sparebankenvest/klog/v2 v2.3.1 h1:nZ0jM6A11OjmeSkO0DpSXtkbJrDZE4Ud0BHM481d7cI= -github.com/sparebankenvest/klog/v2 v2.3.1/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -1020,6 +1018,8 @@ k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.3.1-0.20201028104956-52c62e3b70a9 h1:fpr8Tm3rXj1Lz4V27et4ziNtFQJ5qs25+UbRQdHI9Rk= +k8s.io/klog/v2 v2.3.1-0.20201028104956-52c62e3b70a9/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-aggregator v0.0.0-20191114103820-f023614fb9ea/go.mod h1:LlqyQuTxPHvUzmEgT71Cl/BB86o5+UcbN1LiGgSz94U= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= From 7767f08d12a7b66b438e553be9f4f2e03ee98ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 31 Oct 2020 14:53:06 +0100 Subject: [PATCH 250/251] Updated Readme with survey and minor simplification of how we describe akv2k8s --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b6338515..21b54157 100644 --- a/README.md +++ b/README.md @@ -30,18 +30,20 @@

Azure Key Vault to Kubernetes (akv2k8s) makes Azure Key Vault secrets, certificates and keys available to your applications in Kubernetes, in a simple and secure way.

-

Documentation available at https://akv2k8s.io and join our Slack Workspace to ask questions to the akv2k8s community.

+

Documentation available at https://akv2k8s.io. Join our Slack Workspace to ask questions to the akv2k8s community.

+ +

Please spare one minute to take our survey: https://www.surveymonkey.com/r/HMFZVYR. Why? We have no ide how many are using Akv2k8s, except through user interaction here on GitHub. More importantly - what can we do to make Akv2k8s even better?

## Overview -Azure Key Vault to Kubernetes (akv2k8s) has two components for handling Azure Key Vault Secrets in Kubernetes: +Azure Key Vault to Kubernetes (akv2k8s) will make Azure Key Vault objects available to Kubernetes in two ways: -* Azure Key Vault Controller -* Azure Key Vault Env Injector +* As native Kubernetes `Secret`s +* As environment variables directly injected into your Container application -The **Azure Key Vault Controller** (Controller for short) is for synchronizing Secrets, Certificates and Keys from Azure Key Vault to native `Secret`'s in Kubernetes. +The **Azure Key Vault Controller** (Controller for short) is responsible for synchronizing Secrets, Certificates and Keys from Azure Key Vault to native `Secret`'s in Kubernetes. -The **Azure Key Vault Env Injector** (Env Injector for short) is a Kubernetes Mutating Webhook transparently injecting Azure Key Vault secrets as environment variables into programs running in containers, without touching disk or in any other way expose the actual secret content outside the program. +The **Azure Key Vault Env Injector** (Env Injector for short) is responsible for transparently injecting Azure Key Vault secrets as environment variables into Container applications, without touching disk or expose the actual secret to Kubernetes. ## Goals From 26913994b5b8449bafbba312c76c2e5aa2dcbb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20Arild=20T=C3=B8rresdal?= Date: Sat, 31 Oct 2020 14:57:09 +0100 Subject: [PATCH 251/251] replace klog.V(2).InfoS with plain klog.InfoS --- .../controller/azureKeyVaultSecret.go | 10 ++-- .../controller/azureeKeyVaultSecret_test.go | 60 +++++++++++++++++++ .../controller/configmap.go | 8 +-- .../controller/secret.go | 6 +- .../controller/secret_handler.go | 4 +- cmd/azure-keyvault-controller/main.go | 2 +- cmd/azure-keyvault-env/main.go | 2 +- cmd/azure-keyvault-secrets-webhook/main.go | 53 +++++++++------- cmd/azure-keyvault-secrets-webhook/pod.go | 14 ++--- pkg/docker/registry/container.go | 4 +- 10 files changed, 116 insertions(+), 47 deletions(-) diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go index 78a079a8..a30691f3 100644 --- a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go +++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go @@ -222,7 +222,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { if akvs.Status.SecretHash != secretHash { klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) - klog.V(2).InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KRef(akvs.Namespace, akvs.Spec.Output.Secret.Name)) + klog.InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KRef(akvs.Namespace, akvs.Spec.Output.Secret.Name)) existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(context.TODO(), akvs.Spec.Output.Secret.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err) @@ -239,7 +239,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { } secretName = secret.Name - klog.V(2).InfoS("secret changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(secret), "secret", klog.KObj(akvs)) + klog.InfoS("secret changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(secret), "secret", klog.KObj(akvs)) } } @@ -258,7 +258,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { if akvs.Status.ConfigMapHash != cmHash { klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs)) - klog.V(2).InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KRef(akvs.Namespace, akvs.Spec.Output.ConfigMap.Name)) + klog.InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KRef(akvs.Namespace, akvs.Spec.Output.ConfigMap.Name)) existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(context.TODO(), akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err) @@ -275,7 +275,7 @@ func (c *Controller) syncAzureKeyVault(key string) error { } cmName = cm.Name - klog.V(2).InfoS("configmap changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + klog.InfoS("configmap changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) } } @@ -483,7 +483,7 @@ func handleKeyVaultError(err error, key string) bool { if err != nil { // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. if errors.IsNotFound(err) { - klog.V(2).InfoS("azurekeyvaultsecret in work queue no longer exists", "key", key) + klog.InfoS("azurekeyvaultsecret in work queue no longer exists", "key", key) exit = true } } diff --git a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go index 6d15449c..b83ea5a9 100644 --- a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go +++ b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go @@ -17,8 +17,10 @@ limitations under the License. package controller import ( + "fmt" "testing" + "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client" akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1" ) @@ -36,3 +38,61 @@ func TestNullLookup(t *testing.T) { t.Fail() } } + +const ( + fakeSecret = "some secret" + fakeJsonSecret = `{ + "someKey": "someValue", + "someOtherKey": "someOtherValue" + }` + fakeYamlSecret = ` +someKey: someValue +someOtherKey: someOtherValue` +) + +type fakeAkvsService struct { +} + +func (s *fakeAkvsService) GetSecret(secret *akv.AzureKeyVault) (string, error) { + switch secret.Object.Type { + case akv.AzureKeyVaultObjectTypeSecret: + return fakeSecret, nil + case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret: + return fakeJsonSecret, nil + default: + return nil, fmt.Errorf("secret type not supported") + } +} + +func (s *fakeAkvsService) GetKey(secret *akv.AzureKeyVault) (string, error) { + return "some key", nil +} + +func (s *fakeAkvsService) GetCertificate(secret *akv.AzureKeyVault, options *client.CertificateOptions) (*client.Certificate, error) { + return nil, nil +} + +func TestGetAkvs(t *testing.T) { + c := &Controller{ + vaultService: &fakeAkvsService{}, + } + + akvs := &akv.AzureKeyVaultSecret{ + Spec: akv.AzureKeyVaultSecretSpec{ + Vault: akv.AzureKeyVault{ + Object: akv.AzureKeyVaultObject{ + Type: akv.AzureKeyVaultObjectTypeMultiKeyValueSecret, + ContentType: akv.AzureKeyVaultObjectContentTypeJSON, + }, + }, + }, + } + + res, err := c.getSecretFromKeyVault(akvs) + if err != nil { + t.Error(err) + } + if len(res) > 0 { + + } +} diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go index 746f49a5..a4461491 100644 --- a/cmd/azure-keyvault-controller/controller/configmap.go +++ b/cmd/azure-keyvault-controller/controller/configmap.go @@ -124,7 +124,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre return nil, fmt.Errorf("failed to create new configmap, err: %+v", err) } - klog.V(2).InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) + klog.InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, getMD5HashOfStringValues(cmValues)); err != nil { return nil, fmt.Errorf("failed to update status for azurekeyvaultsecret %s, error: %+v", akvs.Name, err) } @@ -159,7 +159,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre } if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) { - klog.V(2).InfoS("values have changed requiring update to configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + klog.InfoS("values have changed requiring update to configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) updatedCM, err := createNewConfigMapFromExisting(akvs, cmValues, cm) if err != nil { @@ -168,7 +168,7 @@ func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecre cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(context.TODO(), updatedCM, metav1.UpdateOptions{}) if err == nil { - klog.V(2).InfoS("configmap updated", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) + klog.InfoS("configmap updated", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm)) } } @@ -333,7 +333,7 @@ func sortStringValueKeys(values map[string]string) []string { // if err != nil { // // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing. // if errors.IsNotFound(err) { -// klog.V(2).InfoS("configmap in work queue no longer exists", "key", key) +// klog.InfoS("configmap in work queue no longer exists", "key", key) // return true // } // } diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go index 9eb5382c..27bdeac8 100644 --- a/cmd/azure-keyvault-controller/controller/secret.go +++ b/cmd/azure-keyvault-controller/controller/secret.go @@ -122,7 +122,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) return nil, err } - klog.V(2).InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) + klog.InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs)) if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, getMD5HashOfByteValues(secretValues)); err != nil { return nil, err } @@ -157,7 +157,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) } if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) { - klog.V(2).InfoS("values have changed requiring update to secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) + klog.InfoS("values have changed requiring update to secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) updatedSecret, err := createNewSecretFromExisting(akvs, secretValues, secret) if err != nil { @@ -165,7 +165,7 @@ func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) } secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(context.TODO(), updatedSecret, metav1.UpdateOptions{}) if err == nil { - klog.V(2).InfoS("secret updated", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) + klog.InfoS("secret updated", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret)) } } diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go index 54d9a419..f2aca5fd 100644 --- a/cmd/azure-keyvault-controller/controller/secret_handler.go +++ b/cmd/azure-keyvault-controller/controller/secret_handler.go @@ -96,7 +96,7 @@ func NewAzureMultiKeySecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultSer // Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes func (h *azureSecretHandler) HandleSecret() (map[string][]byte, error) { if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.Secret.DataKey != "" { - klog.V(2).InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec)) + klog.InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec)) } values := make(map[string][]byte) @@ -143,7 +143,7 @@ func (h *azureSecretHandler) HandleSecret() (map[string][]byte, error) { // Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes func (h *azureSecretHandler) HandleConfigMap() (map[string]string, error) { if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.ConfigMap.DataKey != "" { - klog.V(2).InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec)) + klog.InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec)) } values := make(map[string]string) diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go index dc5d6640..ac17105a 100644 --- a/cmd/azure-keyvault-controller/main.go +++ b/cmd/azure-keyvault-controller/main.go @@ -114,7 +114,7 @@ func main() { kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30) azureKeyVaultSecretInformerFactory := informers.NewSharedInformerFactory(azureKeyVaultSecretClient, time.Second*30) - klog.V(2).InfoS("Creating event broadcaster") + klog.InfoS("Creating event broadcaster") eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartLogging(klog.V(6).Infof) eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go index 7337f8ee..06ea0d3c 100644 --- a/cmd/azure-keyvault-env/main.go +++ b/cmd/azure-keyvault-env/main.go @@ -199,7 +199,7 @@ func main() { if config.useAuthService { klog.V(4).InfoS("using centralized akv2k8s auth service for authentication with azure key vault") } else { - klog.V(2).InfoS("akv2k8s auth service not enabled - will look for azure key vault credentials locally") + klog.InfoS("akv2k8s auth service not enabled - will look for azure key vault credentials locally") } if len(os.Args) == 1 { diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go index 3e054dcc..66e561e0 100644 --- a/cmd/azure-keyvault-secrets-webhook/main.go +++ b/cmd/azure-keyvault-secrets-webhook/main.go @@ -45,6 +45,7 @@ import ( "github.com/slok/kubewebhook/pkg/webhook/mutating" "github.com/spf13/viper" "k8s.io/client-go/tools/clientcmd" + jsonlogs "k8s.io/component-base/logs/json" "k8s.io/klog/v2" corev1 "k8s.io/api/core/v1" @@ -72,7 +73,7 @@ type azureKeyVaultConfig struct { authType string useAuthService bool dockerImageInspectionTimeout int - useAksCredentialsWithAcs bool + useAksCredentialsWithAcr bool authServiceName string authServicePort string authServicePortInternal string @@ -90,6 +91,7 @@ type cmdParams struct { kubeconfig string masterURL string cloudConfig string + logFormat string } var config azureKeyVaultConfig @@ -134,7 +136,7 @@ func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) { switch v := obj.(type) { case *corev1.Pod: - klog.V(2).InfoS("found pod to mutate", "pod", klog.KRef(req.Namespace, req.Name)) + klog.InfoS("found pod to mutate", "pod", klog.KRef(req.Namespace, req.Name)) pod = v default: return false, nil @@ -176,7 +178,7 @@ func authHandler(w http.ResponseWriter, r *http.Request) { } if pod.name == "" || pod.namespace == "" { - klog.V(2).InfoS("failed to parse url parameters", "pod", pod.name, "namespace", pod.namespace) + klog.InfoS("failed to parse url parameters", "pod", pod.name, "namespace", pod.namespace) http.Error(w, "", http.StatusBadRequest) return } @@ -200,7 +202,7 @@ func authHandler(w http.ResponseWriter, r *http.Request) { } } else { - klog.V(2).InfoS("invalid request method") + klog.InfoS("invalid request method") http.Error(w, "Invalid request method", http.StatusMethodNotAllowed) } } @@ -224,8 +226,6 @@ func initConfig() { viper.SetDefault("port", "443") viper.SetDefault("webhook_auth_service_port", "8443") viper.SetDefault("webhook_auth_service_port_internal", "8443") - viper.SetDefault("log_level", "Info") - viper.SetDefault("log_format", "fmt") viper.SetDefault("env_injector_exec_dir", "/azure-keyvault/") viper.AutomaticEnv() } @@ -236,6 +236,7 @@ func init() { flag.StringVar(¶ms.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") flag.StringVar(¶ms.masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.") flag.StringVar(¶ms.cloudConfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json") + flag.StringVar(¶ms.logFormat, "logging-format", "text", "Log format - text or json.") } func main() { @@ -245,6 +246,11 @@ func main() { flag.Parse() initConfig() + + if params.logFormat == "json" { + klog.SetLogger(jsonlogs.JSONLogger) + } + akv2k8s.Version = params.version // logFormat := viper.GetString("log_format") @@ -264,25 +270,30 @@ func main() { authServicePort: viper.GetString("webhook_auth_service_port"), authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"), dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"), - useAksCredentialsWithAcs: viper.GetBool("docker_image_inspection_use_acs_credentials"), + useAksCredentialsWithAcr: viper.GetBool("docker_image_inspection_use_acs_credentials"), injectorDir: viper.GetString("env_injector_exec_dir"), versionEnvImage: params.versionEnvImage, cloudConfig: params.cloudConfig, } - klog.Info("Active settings:") - klog.InfoS(" Webhook port : %s", config.port) - klog.InfoS(" Serve metrics : %t", config.serveMetrics) - klog.InfoS(" Auth type : %s", config.authType) - klog.InfoS(" Use auth service : %t", config.useAuthService) + activeSettings := []interface{}{ + "webhookPort", config.port, + "serveMetrics", config.serveMetrics, + "authType", config.authType, + "useAuthService", config.useAuthService, + "useAksCredsWithAcr", config.useAksCredentialsWithAcr, + "dockerInspectionTimeout", config.dockerImageInspectionTimeout, + "cloudConfigPath", config.cloudConfig, + } + if config.useAuthService { - klog.InfoS(" Auth service name : %s", config.authServiceName) - klog.InfoS(" Auth service port : %s", config.authServicePort) - klog.InfoS(" Auth service internal port: %s", config.authServicePortInternal) + activeSettings = append(activeSettings, + "authServiceName", config.authServiceName, + "authServicePort", config.authServicePort, + "authServiceInternalPort", config.authServicePortInternal) } - klog.InfoS(" Use AKS creds with ACS : %t", config.useAksCredentialsWithAcs) - klog.InfoS(" Docker inspection timeout : %d", config.dockerImageInspectionTimeout) - klog.InfoS(" Cloud config path : %s", config.cloudConfig) + + klog.InfoS("active settings", activeSettings...) mutator := mutating.MutatorFunc(vaultSecretsMutator) metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer) @@ -298,8 +309,6 @@ func main() { podHandler := handlerFor(mutating.WebhookConfig{Name: "azurekeyvault-secrets-pods", Obj: &corev1.Pod{}}, mutator, metricsRecorder, internalLogger) if config.useAuthService { - klog.V(3).InfoS("loading ca to use for mtls and auth service") - caCertDir := viper.GetString("ca_cert_dir") if caCertDir == "" { klog.InfoS("missing env var - must exist to use auth service", "env", "CA_CERT_DIR") @@ -385,10 +394,10 @@ func main() { if config.serveMetrics { httpMux.Handle("/metrics", promhttp.Handler()) - klog.V(2).InfoS("serving metrics endpoint", "path", fmt.Sprintf("%s/metrics", httpURL)) + klog.InfoS("serving metrics endpoint", "path", fmt.Sprintf("%s/metrics", httpURL)) } httpMux.HandleFunc("/healthz", healthHandler) - klog.V(2).InfoS("serving health endpoint", "path", fmt.Sprintf("%s/healthz", httpURL)) + klog.InfoS("serving health endpoint", "path", fmt.Sprintf("%s/healthz", httpURL)) go func() { err := http.ListenAndServe(httpURL, httpMux) diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go index b744d9f2..ae44000d 100644 --- a/cmd/azure-keyvault-secrets-webhook/pod.go +++ b/cmd/azure-keyvault-secrets-webhook/pod.go @@ -99,13 +99,13 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai for i, container := range containers { useAuthService := config.useAuthService - klog.V(2).InfoS("found container to mutate", "container", klog.KRef(namespace, container.Name)) + klog.InfoS("found container to mutate", "container", klog.KRef(namespace, container.Name)) var envVars []corev1.EnvVar - klog.V(2).InfoS("checking for env vars to inject", "container", klog.KRef(namespace, container.Name)) + klog.InfoS("checking for env vars to inject", "container", klog.KRef(namespace, container.Name)) for _, env := range container.Env { if strings.Contains(env.Value, envVarReplacementKey) { - klog.V(2).InfoS("found env var to inject", "env", env.Value, "container", klog.KRef(namespace, container.Name)) + klog.InfoS("found env var to inject", "env", env.Value, "container", klog.KRef(namespace, container.Name)) envVars = append(envVars, env) } @@ -115,7 +115,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai return false, fmt.Errorf("failed to parse container env var override for auth service, error: %+v", err) } if containerDisabledAuthService { - klog.V(2).InfoS("container has disabled auth service", "container", klog.KRef(namespace, container.Name)) + klog.InfoS("container has disabled auth service", "container", klog.KRef(namespace, container.Name)) useAuthService = false } } @@ -132,7 +132,7 @@ func mutateContainers(clientset kubernetes.Interface, containers []corev1.Contai } autoArgsStr := strings.Join(autoArgs, " ") - klog.V(2).InfoS("found container arguments to use for env-injector", "cmd", autoArgsStr, "container", klog.KRef(namespace, container.Name)) + klog.InfoS("found container arguments to use for env-injector", "cmd", autoArgsStr, "container", klog.KRef(namespace, container.Name)) privKey, pubKey, err := newKeyPair() if err != nil { @@ -312,10 +312,10 @@ func mutatePodSpec(pod *corev1.Pod, namespace string, mutationID types.UID) erro if initContainersMutated || containersMutated { podSpec.InitContainers = append(getInitContainers(), podSpec.InitContainers...) podSpec.Volumes = append(podSpec.Volumes, getVolumes(authServiceSecret)...) - klog.V(2).InfoS("containers mutated and pod updated with init-container and volumes", "pod", klog.KRef(namespace, pod.Name)) + klog.InfoS("containers mutated and pod updated with init-container and volumes", "pod", klog.KRef(namespace, pod.Name)) podsMutatedCounter.Inc() } else { - klog.V(2).InfoS("no containers mutated", "pod", klog.KRef(namespace, pod.Name)) + klog.InfoS("no containers mutated", "pod", klog.KRef(namespace, pod.Name)) } return nil diff --git a/pkg/docker/registry/container.go b/pkg/docker/registry/container.go index d1be9fa2..971e65b2 100644 --- a/pkg/docker/registry/container.go +++ b/pkg/docker/registry/container.go @@ -62,7 +62,7 @@ func (k *ContainerInfo) Collect(container *corev1.Container, podSpec *corev1.Pod } if found { - klog.V(2).InfoS("found credentials for registry in imagePullSecrets", "registry", k.RegistryName, "namespace", k.Namespace, "pullSecret", imagePullSecret.Name) + klog.InfoS("found credentials for registry in imagePullSecrets", "registry", k.RegistryName, "namespace", k.Namespace, "pullSecret", imagePullSecret.Name) break } } @@ -89,7 +89,7 @@ func (k *ContainerInfo) Collect(container *corev1.Container, podSpec *corev1.Pod } if !found { - klog.V(2).InfoS("found no credentials for registry, assuming it is public", "registry", k.RegistryAddress) + klog.InfoS("found no credentials for registry, assuming it is public", "registry", k.RegistryAddress) } } return nil