diff --git a/.env.example b/.env.example index 890f7fa..6564202 100644 --- a/.env.example +++ b/.env.example @@ -2,3 +2,7 @@ DATABASE_URL=postgresql://fondberg:@docker.for.mac.localhost/photowall COGNITO_POOL_ID=eu-west-1_3O4VfvPn7 INTERIORS_TOKEN= INTERIORS_URL=https://0hrq0zel2h.execute-api.eu-west-1.amazonaws.com/Prod +AWS_SECRET_ACCESS_KEY= +AWS_ACCESS_KEY_ID= +AWS_DEFAULT_REGION=eu-west-1 + diff --git a/cloudformation/Makefile b/cloudformation/Makefile index 4f957e5..556326c 100644 --- a/cloudformation/Makefile +++ b/cloudformation/Makefile @@ -31,12 +31,16 @@ ifeq ($(STACK_ENVIRONMENT_NAME),production) DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_PRODUCTION) CPU_SIZE=1024 MEMORY_SIZE=2GB + IMAGES_BUCKET=photowall-images + UPLOAD_BUCKET=photowall-inquiries else SUBDOMAIN=$(STACK_NAME)-$(STACK_ENVIRONMENT_NAME) GITHUB_BRANCH=$(STACK_ENVIRONMENT_NAME) DB_SECURITY_GROUP_ID=$(DB_SECURITY_GROUP_ID_STAGING) CPU_SIZE=512 MEMORY_SIZE=1GB + IMAGES_BUCKET=photowall-images-dev + UPLOAD_BUCKET=photowall-inquiries-dev endif check-create-initial-ecr-image: @@ -99,7 +103,9 @@ create-stack: check-create-variables-set check-create-initial-ecr-image ParameterKey="GitHubBranch",ParameterValue="$(GITHUB_BRANCH)" \ ParameterKey="GitHubToken",ParameterValue="$(GITHUB_TOKEN)" \ ParameterKey="CpuSize",ParameterValue="$(CPU_SIZE)" \ - ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" + ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" \ + ParameterKey="ImagesBucket",ParameterValue="$(IMAGES_BUCKET)" \ + ParameterKey="UploadBucket",ParameterValue="$(UPLOAD_BUCKET)" update-stack: set-repository-lifecycle-policy $(call checkdef,STACK_NAME) @@ -117,4 +123,6 @@ update-stack: set-repository-lifecycle-policy ParameterKey="GitHubBranch",UsePreviousValue=true \ ParameterKey="GitHubToken",UsePreviousValue=true \ ParameterKey="CpuSize",ParameterValue="$(CPU_SIZE)" \ - ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" + ParameterKey="MemorySize",ParameterValue="$(MEMORY_SIZE)" \ + ParameterKey="ImagesBucket",ParameterValue="$(IMAGES_BUCKET)" \ + ParameterKey="UploadBucket",ParameterValue="$(UPLOAD_BUCKET)" diff --git a/cloudformation/ecs-service.yaml b/cloudformation/ecs-service.yaml index 47536fb..b880762 100644 --- a/cloudformation/ecs-service.yaml +++ b/cloudformation/ecs-service.yaml @@ -87,6 +87,12 @@ Parameters: GitHubUser: Type: String + # Buckets + ImagesBucket: + Type: String + UploadBucket: + Type: String + Resources: Cluster: Type: AWS::ECS::Cluster @@ -149,6 +155,32 @@ Resources: ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy' - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess + + TaskRoleAccessPolicy: + Type: 'AWS::IAM::ManagedPolicy' + Properties: + Description: Create access policies for the container task + Path: / + PolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Action: + - s3:* + Resource: !Sub arn:aws:s3:::${ImagesBucket}/* + - Effect: Allow + Action: + - s3:* + Resource: !Sub arn:aws:s3:::${ImagesBucket} + - Effect: Allow + Action: + - s3:* + Resource: !Sub arn:aws:s3:::${UploadBucket}/* + - Effect: Allow + Action: + - s3:* + Resource: !Sub arn:aws:s3:::${UploadBucket} + # A role for the containers TaskRole: Type: AWS::IAM::Role @@ -160,6 +192,8 @@ Resources: Principal: Service: ecs-tasks.amazonaws.com Action: 'sts:AssumeRole' + ManagedPolicyArns: + - !Ref TaskRoleAccessPolicy # A role needed for auto scaling AutoScalingRole: diff --git a/docker-compose.yml b/docker-compose.yml index 8691bb6..834a651 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,9 @@ services: - DATABASE_URL=${DATABASE_URL} - INTERIORS_TOKEN=${INTERIORS_TOKEN} - INTERIORS_URL=${INTERIORS_URL} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} + - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} networks: default: diff --git a/package-lock.json b/package-lock.json index b032e1b..7905672 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@aws-sdk/client-s3": "^3.31.0", + "@aws-sdk/s3-request-presigner": "^3.31.0", "apollo-datasource": "^3.1.0", "apollo-datasource-rest": "^3.2.0", "apollo-server": "^3.3.0", @@ -91,6 +93,1088 @@ "xss": "^1.0.8" } }, + "node_modules/@aws-crypto/crc32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-1.1.0.tgz", + "integrity": "sha512-ifvfaaJVvT+JUTi3zSkX4wtuGGVJrAcjN7ftg+JiE/frNBP3zNwo4xipzWBsMLZfNuzMZuaesEYyqkZcs5tzCQ==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", + "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.1.tgz", + "integrity": "sha512-nS4vdan97It6HcweV58WXtjPbPSc0JXd3sAwlw3Ou5Mc3WllSycAS32Tv2LRn8butNQoU9AE3jEQAOgiMdNC1Q==", + "dependencies": { + "@aws-crypto/ie11-detection": "^1.0.0", + "@aws-crypto/sha256-js": "^1.1.0", + "@aws-crypto/supports-web-crypto": "^1.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "dependencies": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", + "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.29.0.tgz", + "integrity": "sha512-MLeexxMs06WkPKuA/ltOCA3TV+vN1WQjEhojNtylQzz/AJDDq4z/7nmIf4lJKM7h1PDuD4XHLPfbxNuv75mu6A==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/chunked-blob-reader": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.29.0.tgz", + "integrity": "sha512-s24ycAMo8rY60gGw9aH29QhpPJKD9M/0oCZ1cf9IZj1u2e896Q4Q/wknwfanaWS7thF5AcTdjNMfvny9QVJJBA==", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/chunked-blob-reader-native": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.29.0.tgz", + "integrity": "sha512-m/zLdRz5AR5y8NblhYEXmoAAIQkad73D7tIkT1PvgPoC0wmSurBsbDCx2NYNi8CF5nRJjofq0MNduU0al/o8yg==", + "dependencies": { + "@aws-sdk/util-base64-browser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.31.0.tgz", + "integrity": "sha512-1r0GT55Hg6j5HwIsSZRQD/UyixaqGxeslMKyriYW6EGY3hc+1DP6vV4MUSiPxmMjLsCRPpeKhxdGzAryTiWFQQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/client-sts": "3.31.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/eventstream-serde-browser": "3.29.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.29.0", + "@aws-sdk/eventstream-serde-node": "3.29.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-blob-browser": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/hash-stream-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/md5-js": "3.29.0", + "@aws-sdk/middleware-apply-body-checksum": "3.29.0", + "@aws-sdk/middleware-bucket-endpoint": "3.30.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-expect-continue": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-location-constraint": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-sdk-s3": "3.30.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-ssec": "3.29.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "@aws-sdk/util-waiter": "3.29.0", + "@aws-sdk/xml-builder": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.31.0.tgz", + "integrity": "sha512-fbquWlOS8+uotT2aZexK/3g85NYt2T5LpfWnk9mPV5HWfoevqTz9kwsZEW4DTnW9zibRl89vwXKolNpyszuZnw==", + "dependencies": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.31.0.tgz", + "integrity": "sha512-XL8l88iUHPxfByFPp9a9eZV6Shb9QijHM+aGJPFU5zYvX3ruclfuBIs/3gLgqeX8rsmjt8AfeICxaP4BwJcaZA==", + "dependencies": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-sdk-sts": "3.30.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.30.0.tgz", + "integrity": "sha512-1qb8WB2uiH2O1UYc98adfmQX3/Rxh1bwU1VW2FxEfCGBTT6wi+Ic1nVTdVy+2gd3usCeIim5mEs8REXgvjLENQ==", + "dependencies": { + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.29.0.tgz", + "integrity": "sha512-FUhdZODjkUeTFNfH7EnqN9piQwBR1gg+8NUJt6Rn7G4rj5lN2n2ryAatowIlzIB+/oWDvpPj+yMIE+XGjQrMhg==", + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.29.0.tgz", + "integrity": "sha512-sjyJrJoLhP2ekx+Z3m5g+/YIWYtuKII9eXuTTwRhzBKTpqv0WQm1ilISdNcz691JueF5jHQs4bP6FWk55RUWEg==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.31.0.tgz", + "integrity": "sha512-t95Gix2fWLIxrM2c2QZfRgJ1aCY1zGSlhb1JBlzPwxVRay7iUKa9U2dPoPhbOTsD1abQMjE4AnpDt9Bj+AXgyA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.31.0.tgz", + "integrity": "sha512-T5309Q/MPHmaKYX0gSo6dv8w1ll4wsXvAUDXFC3MMdL/WYBfYvJa9H5nB9D9bL0xmtsm9e3WtfAcvEkN8Qz1xg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-ini": "3.31.0", + "@aws-sdk/credential-provider-process": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.29.0.tgz", + "integrity": "sha512-1dMq84uGh3zcu+/bGohibWYMSxcrjwaIAc4dBU/3+rkNzPPdRA83hzYS34EizQ61JQHnM3z/xX9SLMeaNRKaSA==", + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.31.0.tgz", + "integrity": "sha512-x+xQvq8AFt+V1EpwRWa3Obsd1w2L7pQyP/P6O9Q5Enq6OwmdrM+i51jMD58QMRz4h+Ys5eaLLfi0wE0AjrUbng==", + "dependencies": { + "@aws-sdk/client-sso": "3.31.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.29.0.tgz", + "integrity": "sha512-TwICG9y/iw08urlCymroQfRRJY++4JZwdhR0/2ycU+/Cgac6u4MfZsB1qD+u9+Q39/TqSz6QwtNhKLNdf0N23A==", + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-marshaller": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.29.0.tgz", + "integrity": "sha512-yRcWAVSPEcZ8l/iYTJHdo3/aAEsrbY1X3M7N0eQbF/awAXTtrbZ0Fg213xWWgdydP1+TdFv13GeluqhKq/oBBg==", + "dependencies": { + "@aws-crypto/crc32": "^1.0.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-hex-encoding": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.29.0.tgz", + "integrity": "sha512-rzy5caqRjuRXpcbWRC6fGNm4/wt53noYz2Y5Adko+x4X9fSmOBkS+6BCo2I1wQ/RlLyhh+9jrC/ySnD/6Gsd7g==", + "dependencies": { + "@aws-sdk/eventstream-marshaller": "3.29.0", + "@aws-sdk/eventstream-serde-universal": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.29.0.tgz", + "integrity": "sha512-q286hf5EJXcJy6NKeAvPReajGsqELRlV48Wz2Q6hG3n2FTRYO6JQC4pi/YrabnK+oeLZ3UZFye4Ph8BTL5/xnw==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.29.0.tgz", + "integrity": "sha512-859ZHD2FyBSEV4RpYl562i/ddcxNAHcrEsKJE430MNiNuiG324/RE/vIIOb5rleHZI+a62yfU1b/BjUrgVc6IQ==", + "dependencies": { + "@aws-sdk/eventstream-marshaller": "3.29.0", + "@aws-sdk/eventstream-serde-universal": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-universal": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.29.0.tgz", + "integrity": "sha512-GOXf5s1mKf0aCtl+Um4kDDPrwZa1A9jx7vZ/cHSCc3mb/W/Nqn/CP0mMw4r3YCOkHLdil4TqoQ70/1/kHsq9YQ==", + "dependencies": { + "@aws-sdk/eventstream-marshaller": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.29.0.tgz", + "integrity": "sha512-rx+YlHFYzgGsCZMEvJBUdRsqfMGW4RY6J3USQvz63a32jVlMC3Kw9xINaXGhCEmOlUlzdeeIMQOZW5VxavLnjQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/hash-blob-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.29.0.tgz", + "integrity": "sha512-8nD1A0w7aPQ0Mzij7+X95GwapMm2MfrN6bLa1iCn5PNdQ5Zn+tK70NUL/s9X6KaEQi3Lh7S0xGN9paEZ5o4+sg==", + "dependencies": { + "@aws-sdk/chunked-blob-reader": "3.29.0", + "@aws-sdk/chunked-blob-reader-native": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.29.0.tgz", + "integrity": "sha512-iANkXAGNgUSX17GjyTdrFRE357AmAgnIsuyKhuaK8vi4SPPxHYCyXOdxtUx5TjkzW4bUym3cRJS8zeirayTEHA==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/hash-stream-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.29.0.tgz", + "integrity": "sha512-2ha+yzpJCoR23NoCfP/9OMBF5jgg76xAQo14/ItRWLnn0np7eRTGM+OFnNuAfvDRbzM4UcJoGDbUreAhaoSOBQ==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.29.0.tgz", + "integrity": "sha512-0TyZZbPs5SWCF2tT1DXccK5SUx7/bDJCVojgBuW3QRJn9ta3US/u5l7w8k6jwWFU3CQhLAWuG0TD7FhATiM2HQ==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.29.0.tgz", + "integrity": "sha512-QqIhHGp2qTfDlW7uNh/T4kcyAU2TfxHA29cppQusuTJjploAXXMzvBdmxjFH1ZvPbKs0Rd7owQ0YnC9Lnq+Nzg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/md5-js": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.29.0.tgz", + "integrity": "sha512-6wsT7zM9qEIbf+FI1QzKXG1o1z91u3zF6tPiXtdopVOs2m2I0emG2c1cEzqFwqB4HhiaR6PejBhn/tDxfc7oNw==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/middleware-apply-body-checksum": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-apply-body-checksum/-/middleware-apply-body-checksum-3.29.0.tgz", + "integrity": "sha512-csHiQKvxSJWxQx7lbla3Wgs+lWuNQ/DEFid5SxBZBhsqKz5FPBJr6kMPWIopmIL/vCxrYhMaS4ARloQBUkLoyQ==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.30.0.tgz", + "integrity": "sha512-WlPeUGEhuuTKtpRH6pDgBjX7uoAXaCv4FatK06R6tRBp7oSFiq3az0AUrNE5u45BOT6sj7Yl7C96WLcvHfG4gA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-arn-parser": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.29.0.tgz", + "integrity": "sha512-g+tOOXQXqKG84XwFrJexZa2iTuYJce9jnjHV4vyfXwVuKrwuf+ZFguPZ4hzEd40vDo5aLM49JtF/OcO4plCneg==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.29.0.tgz", + "integrity": "sha512-5SzOhxF1rO2ajlMkLYklTD9XnAcsDxKfAyRZeHCH5pYVdskjWphpJ61IS+/rWv+1L0qDsxYum7Ig50R853c4Cw==", + "dependencies": { + "@aws-sdk/middleware-header-default": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-header-default": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.29.0.tgz", + "integrity": "sha512-DoTQvcmqhgTcPdkJi1+To/esmURd0HGaP3oUoIYxnoWK+hC1zJmq9hb+0oi1wdXX79l5iz2DkjH3sm547rJIuQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.29.0.tgz", + "integrity": "sha512-aBifr86Owrhvy29cvZD17JzdoTtKMxzdjCkMA7ckNP+9Lg7kLI/6ws1yZ6BJlmcOnKxtNSnkvunGmJy8BU8EWQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.29.0.tgz", + "integrity": "sha512-c7aOFU7AEzLXTIen5VIBm45KrRHLVuHewIpotwApFFSpLjxroPogsT0MSFyGDR9cHLl5QCiJ777Zu6L2x6819A==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.29.0.tgz", + "integrity": "sha512-0rLvuTvfaMWNb7+FApXAH0111FEp/AfG3fO7QkyVrXmHlTrNIJozilhkd0FwEMcQqqM9UK5lPLXwloH9Rkp9vw==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.29.0.tgz", + "integrity": "sha512-yRQ48UIGPmK3/jWMJ2LC4trltFevMDEXyvtT6knwDnwXxmuwv7K6udk6TnGaUU5TlLVI1XdRQHaZY7xZH1KbGw==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/service-error-classification": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.30.0.tgz", + "integrity": "sha512-ZyDz7reDqHYbYCftpsjmn7HpwQDSBSEb5PcXawF1/SnK2X4toTsWx0jZHmlYo7Xti/rE4Gfgx69dt/ACDO33BA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-arn-parser": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.30.0.tgz", + "integrity": "sha512-TZQQ0LA/rjYNgV+DbU0KvyHZaNhihrWf4IeJeKoez1vpvQmU58G5zAm0+rVHbzazJaOQuHYKKdPttOPxl/JAAg==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.29.0.tgz", + "integrity": "sha512-jN6zuaXg3k9HiWJZjBROiVJEdFaZrMikhyVdqYTT3hR+i08M/9UgVuX84HP/dALChZazOn9MPhvPWGvxrMOr9A==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.30.0.tgz", + "integrity": "sha512-T/zGCijEGODmpbS/HlwnxT0Bn69FhZpBrVAjfofLUFzHteJ5Ab2q7AEt1dOdi3GrtTGStdwbfiZVeTxMKIjaTw==", + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.29.0.tgz", + "integrity": "sha512-XJC00iN3sqJ5ZH05VpP/bimRHfS1aWGs5/Vuz4swdyKGwez725ZBfof0lg6LSnP4G+me6ZqwsbUxHkdrupcWAA==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.29.0.tgz", + "integrity": "sha512-S6Jt108uxs/PEoLAgGow9SdMKWXhlg0EGgY77Z4pNPQDrBYoca2kwWeTsyTpgBXSsyV0z0WZB4TJK5/doGv6CA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.29.0.tgz", + "integrity": "sha512-AVbn9QEbqBgScaD3cxLv7/yi9Up10vYKy/AWIwgTrW0LxOuy9+Za2hdk5eZRP/QpqS/Ibz2/CqcmK1GQ/03kmg==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.29.0.tgz", + "integrity": "sha512-ANRnPz4IT4FiSAc+9p0HqGSjL+cdzB2E68BFmbbGin0fZwhflX1BksjuUEibw8Emf8jvhvbUxdtAIUWctTYxOA==", + "dependencies": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.29.0.tgz", + "integrity": "sha512-FnPdoK0hmEr2JO/g7MVE3oeC2TvMpoRDQqUnDrn9C1bzRzgzhHqGVyaiRmc1HECMKjPFYVn02NCzY4qx56K0Ag==", + "dependencies": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.29.0.tgz", + "integrity": "sha512-N2fd3H4mGGE51PgmMbEzBGSNwcyPkEgMxgfZsrQUaFh+CE5uuelOAL70Yzr4IZ4yZJvf1F9e8drtCuUcHnSUEw==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.29.0.tgz", + "integrity": "sha512-OIeJ7ukfgGkaIL0/NNM5sxIlfxtOqQN+KoaQ89YeLBlJPVoKnptAw+eWjjLwxLs+r/SbyZHXbBawP+sbzq0mSQ==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.29.0.tgz", + "integrity": "sha512-htrHPmwGfWxl/Mt0JpR63NmlDtmwMJTjvLVrdbxBBXfjiyB8023lEFfyMSDHzD6fegQcw/rOwaliQNAuaVNnXQ==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.29.0.tgz", + "integrity": "sha512-v22PBXafAHw+wMaSGbq4B9wEsSYV2e0nZgGHZBNML3HPDiAYJqsQHiYEbiz8nzkmoayU0wrVFZ/XfKNXXcXGbw==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.31.0.tgz", + "integrity": "sha512-z1/agTLOxEDtSX53UVXaj2Nvji/Mv3LBWrfLax2NGcpRAoPNqwxkKhkRsD0tuFVFwWRsJmcWdN5TkffZNqFAfg==", + "dependencies": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-create-request": "3.31.0", + "@aws-sdk/util-format-url": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.29.0.tgz", + "integrity": "sha512-VqOjXXTLTGbifzg3Fg2g/Ac6W3uzC3llPZjm/b0goM17KLWMGU7JKiem2l+CFyN4sxkver7InNlIUJCJAPB6+Q==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.29.0.tgz", + "integrity": "sha512-x4Chk4+iMiYaxcomZjdg7IwU1mQhJ7iPl/3RrIqCShPIOZDwwH4vLl6Fw0bniOZiHK30JQ1wlAgLxzVP0JMHTw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.30.0.tgz", + "integrity": "sha512-uBvut8RrhXGunTDYuJMALlV8IaFHyZHPzadhrqx12QJT+LQevSB4CR2WXZknz0JZ4HcFvpaJqbiionLobwVEuQ==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-hex-encoding": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.31.0.tgz", + "integrity": "sha512-QZHOMM6npFyDEW8wrp8rLs+YGZIPRfuItlWHm6Upejp6a7s1ksb/1c44vNeqwnAeUJrdXfOX9QFkbh1+gZF21A==", + "dependencies": { + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.29.0.tgz", + "integrity": "sha512-8ilWQU5ZTdiRfblmmjl38+6JZKKM8EqA5Sbn8djgDLShCLeVJ2TsL2guzNi+WHcL7BHdv1pI/NNmTcgRUo6yOw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.29.0.tgz", + "integrity": "sha512-385f+g4xeRym2S4bzF+Nc0MB8addAlCSb5hIUJu1JKH6FwFLrNRuixeaelGLyWr77xv25P0ruyXQAFf2ISxzKw==", + "dependencies": { + "@aws-sdk/querystring-parser": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.29.0.tgz", + "integrity": "sha512-NK4xAU7EGp0H4oYIICAJL49BzGvezkWD6rQdfJpXrPoqXviXXDq0nmFEoP9k4PsT+mDBEFiuvXhQlrHhBPVx5g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-base64-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.29.0.tgz", + "integrity": "sha512-yMgn5vZ7laVO/497iPDjTdmia3sDdFBDq6k42EZxVTpkUcd8JS2nWJ+9ePuIMwqOgPjhhkOOXiidrbZaUQ+L6Q==", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-base64-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.29.0.tgz", + "integrity": "sha512-4pRwjQ6+yS7SQm+yK3pchrsmGPEuoR2YiNsBG0LVNecQmnxWUbOhaEWIxXKTnAzs9bAt7AWEbLzsW8/cN/yTNw==", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.29.0.tgz", + "integrity": "sha512-cKSwlDlZkcxuhSdoiq1TxleaBvveEgKA2Yo4TYP4DKVPHZuYZtbFv8r1driml1SaIKXg4GQpe+pJit3mxDRxAg==", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.29.0.tgz", + "integrity": "sha512-8rG65GMpsjVFd9jhx5y/dhwbJVIKq0OqwNRK+GoIVDo0KKaGtjNbCVHYYDjpwIuksZumiqvlC0E3AUcXn7p1rQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.29.0.tgz", + "integrity": "sha512-4ODxK5y/yONgsuc9SAzZ0j/v0IQkJVCRApziF4Q8NiZ1z9050nZ08rgTEhrTbWgLmDju4SDvJhn/nUNTrsLhug==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-create-request": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.31.0.tgz", + "integrity": "sha512-AioF03qE5dKC/yCrCPhlUgG5WyyF76AavVI3knCJRTiDI/u7tJWZ7zrA2wl4me4Ylq7Z0cuZc7crdPJHNFlyVg==", + "dependencies": { + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-credentials": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.29.0.tgz", + "integrity": "sha512-xCWQizP5d6SwbwB2HmxpDqu0WYY7/E7pNrZ+7tSMrJxZlT8Zsd+lFaO23JVFMEBqjjBnpLBr+XkNZgOpD1BYwA==", + "dependencies": { + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-format-url": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.29.0.tgz", + "integrity": "sha512-RrCSVlfWRuDB7oVtECqSgwrMK69z75Ettq9niaCz2CAVnJlvWTnknybX+M/l1TDBKeLKM3C7k6jFv+J+twByFg==", + "dependencies": { + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.29.0.tgz", + "integrity": "sha512-YZ9fhJ2HKnnPL+8M9/YMFo4906Cvh1NaVOZT61joPM5Vv1rSYXdD1/tvn2qNjVhAJAGFWdBsIqZWw43km5DNpw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.29.0.tgz", + "integrity": "sha512-gvcbl9UdTOvuCCzgbtTTsKnL1l/cnT/CFl0f6ZCQ6qubUTRCuL/aK8DvgWa1n9p/ddCiVKPLmHu/L1xtX4gc0A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.29.0.tgz", + "integrity": "sha512-js834TiNTdwIZOxmGSCPiLETUoc2JslY07D6A+yLNI/kZmmTHa0tKCyPxMqo7LBb+iU9ymky2LLJuDGp6aZNHw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.29.0.tgz", + "integrity": "sha512-se9WLQS3H36u8FUA3/DfnzH3LU77QBRpJN4FmQtcQHR3A5mR2tRty+eOrvIf2R4QtveMWXrQbvScTrca7ZFZug==", + "dependencies": { + "@aws-sdk/types": "3.29.0", + "bowser": "^2.11.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.29.0.tgz", + "integrity": "sha512-atyjuDnD1WtIR1sZzcCJcD0JyYKGZ6bYqAhh/apaiPs0LoTyaFGYN8K7wSr3gL8PqD9YYNKfiNiPU3AbY6pW5A==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.29.0.tgz", + "integrity": "sha512-ZIHbBYByMq5vadQ1SZOQTHVtrkGAFiuypATYF5ST8YB3j7XKvflv+fiBX2xQ8xpqb28noEg6dNPnvqkQQ1n/aw==", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/util-utf8-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.29.0.tgz", + "integrity": "sha512-CIZPDnSvtfv7MeHM/hA1fHXcXJR2f7ULjw4nXsX/BLaKGKf/O6IhOXPt1ecUIpGeUrCgPCqxkDjmThUCa87Bcg==", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-waiter": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.29.0.tgz", + "integrity": "sha512-9qNsX+yRpX8xE0eW9qHZCy7W6+MFkYFR10umSPVl9gc5p+RViQwS0D2wVYmQblrqGK6VpK+wAb3faFf6KaDesg==", + "dependencies": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.29.0.tgz", + "integrity": "sha512-lixmZNupjRsfAxCZh3CshqWSxKJEAPcuPiKhUlW9DhfoIc+YTD9U5G2fzY9LBd7ugDo4N7H5sU3Oa1iYLp2ZDg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -3013,6 +4097,11 @@ "node": ">= 0.8" } }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "node_modules/boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -4175,6 +5264,14 @@ "node": ">=8.6" } }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-abstract": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", @@ -4987,6 +6084,18 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", + "bin": { + "xml2js": "cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, "node_modules/fastq": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", @@ -12089,6 +13198,915 @@ "xss": "^1.0.8" } }, + "@aws-crypto/crc32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-1.1.0.tgz", + "integrity": "sha512-ifvfaaJVvT+JUTi3zSkX4wtuGGVJrAcjN7ftg+JiE/frNBP3zNwo4xipzWBsMLZfNuzMZuaesEYyqkZcs5tzCQ==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/ie11-detection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", + "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.1.1.tgz", + "integrity": "sha512-nS4vdan97It6HcweV58WXtjPbPSc0JXd3sAwlw3Ou5Mc3WllSycAS32Tv2LRn8butNQoU9AE3jEQAOgiMdNC1Q==", + "requires": { + "@aws-crypto/ie11-detection": "^1.0.0", + "@aws-crypto/sha256-js": "^1.1.0", + "@aws-crypto/supports-web-crypto": "^1.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz", + "integrity": "sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA==", + "requires": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", + "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.29.0.tgz", + "integrity": "sha512-MLeexxMs06WkPKuA/ltOCA3TV+vN1WQjEhojNtylQzz/AJDDq4z/7nmIf4lJKM7h1PDuD4XHLPfbxNuv75mu6A==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/chunked-blob-reader": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.29.0.tgz", + "integrity": "sha512-s24ycAMo8rY60gGw9aH29QhpPJKD9M/0oCZ1cf9IZj1u2e896Q4Q/wknwfanaWS7thF5AcTdjNMfvny9QVJJBA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/chunked-blob-reader-native": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.29.0.tgz", + "integrity": "sha512-m/zLdRz5AR5y8NblhYEXmoAAIQkad73D7tIkT1PvgPoC0wmSurBsbDCx2NYNi8CF5nRJjofq0MNduU0al/o8yg==", + "requires": { + "@aws-sdk/util-base64-browser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/client-s3": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.31.0.tgz", + "integrity": "sha512-1r0GT55Hg6j5HwIsSZRQD/UyixaqGxeslMKyriYW6EGY3hc+1DP6vV4MUSiPxmMjLsCRPpeKhxdGzAryTiWFQQ==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/client-sts": "3.31.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/eventstream-serde-browser": "3.29.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.29.0", + "@aws-sdk/eventstream-serde-node": "3.29.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-blob-browser": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/hash-stream-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/md5-js": "3.29.0", + "@aws-sdk/middleware-apply-body-checksum": "3.29.0", + "@aws-sdk/middleware-bucket-endpoint": "3.30.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-expect-continue": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-location-constraint": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-sdk-s3": "3.30.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-ssec": "3.29.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "@aws-sdk/util-waiter": "3.29.0", + "@aws-sdk/xml-builder": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/client-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.31.0.tgz", + "integrity": "sha512-fbquWlOS8+uotT2aZexK/3g85NYt2T5LpfWnk9mPV5HWfoevqTz9kwsZEW4DTnW9zibRl89vwXKolNpyszuZnw==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.31.0.tgz", + "integrity": "sha512-XL8l88iUHPxfByFPp9a9eZV6Shb9QijHM+aGJPFU5zYvX3ruclfuBIs/3gLgqeX8rsmjt8AfeICxaP4BwJcaZA==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-sdk/config-resolver": "3.30.0", + "@aws-sdk/credential-provider-node": "3.31.0", + "@aws-sdk/fetch-http-handler": "3.29.0", + "@aws-sdk/hash-node": "3.29.0", + "@aws-sdk/invalid-dependency": "3.29.0", + "@aws-sdk/middleware-content-length": "3.29.0", + "@aws-sdk/middleware-host-header": "3.29.0", + "@aws-sdk/middleware-logger": "3.29.0", + "@aws-sdk/middleware-retry": "3.29.0", + "@aws-sdk/middleware-sdk-sts": "3.30.0", + "@aws-sdk/middleware-serde": "3.29.0", + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/middleware-user-agent": "3.29.0", + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/node-http-handler": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "@aws-sdk/util-base64-node": "3.29.0", + "@aws-sdk/util-body-length-browser": "3.29.0", + "@aws-sdk/util-body-length-node": "3.29.0", + "@aws-sdk/util-user-agent-browser": "3.29.0", + "@aws-sdk/util-user-agent-node": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "entities": "2.2.0", + "fast-xml-parser": "3.19.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.30.0.tgz", + "integrity": "sha512-1qb8WB2uiH2O1UYc98adfmQX3/Rxh1bwU1VW2FxEfCGBTT6wi+Ic1nVTdVy+2gd3usCeIim5mEs8REXgvjLENQ==", + "requires": { + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.29.0.tgz", + "integrity": "sha512-FUhdZODjkUeTFNfH7EnqN9piQwBR1gg+8NUJt6Rn7G4rj5lN2n2ryAatowIlzIB+/oWDvpPj+yMIE+XGjQrMhg==", + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.29.0.tgz", + "integrity": "sha512-sjyJrJoLhP2ekx+Z3m5g+/YIWYtuKII9eXuTTwRhzBKTpqv0WQm1ilISdNcz691JueF5jHQs4bP6FWk55RUWEg==", + "requires": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/url-parser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.31.0.tgz", + "integrity": "sha512-t95Gix2fWLIxrM2c2QZfRgJ1aCY1zGSlhb1JBlzPwxVRay7iUKa9U2dPoPhbOTsD1abQMjE4AnpDt9Bj+AXgyA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.31.0.tgz", + "integrity": "sha512-T5309Q/MPHmaKYX0gSo6dv8w1ll4wsXvAUDXFC3MMdL/WYBfYvJa9H5nB9D9bL0xmtsm9e3WtfAcvEkN8Qz1xg==", + "requires": { + "@aws-sdk/credential-provider-env": "3.29.0", + "@aws-sdk/credential-provider-imds": "3.29.0", + "@aws-sdk/credential-provider-ini": "3.31.0", + "@aws-sdk/credential-provider-process": "3.29.0", + "@aws-sdk/credential-provider-sso": "3.31.0", + "@aws-sdk/credential-provider-web-identity": "3.29.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.29.0.tgz", + "integrity": "sha512-1dMq84uGh3zcu+/bGohibWYMSxcrjwaIAc4dBU/3+rkNzPPdRA83hzYS34EizQ61JQHnM3z/xX9SLMeaNRKaSA==", + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.31.0.tgz", + "integrity": "sha512-x+xQvq8AFt+V1EpwRWa3Obsd1w2L7pQyP/P6O9Q5Enq6OwmdrM+i51jMD58QMRz4h+Ys5eaLLfi0wE0AjrUbng==", + "requires": { + "@aws-sdk/client-sso": "3.31.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-credentials": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.29.0.tgz", + "integrity": "sha512-TwICG9y/iw08urlCymroQfRRJY++4JZwdhR0/2ycU+/Cgac6u4MfZsB1qD+u9+Q39/TqSz6QwtNhKLNdf0N23A==", + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/eventstream-marshaller": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.29.0.tgz", + "integrity": "sha512-yRcWAVSPEcZ8l/iYTJHdo3/aAEsrbY1X3M7N0eQbF/awAXTtrbZ0Fg213xWWgdydP1+TdFv13GeluqhKq/oBBg==", + "requires": { + "@aws-crypto/crc32": "^1.0.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-hex-encoding": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/eventstream-serde-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.29.0.tgz", + "integrity": "sha512-rzy5caqRjuRXpcbWRC6fGNm4/wt53noYz2Y5Adko+x4X9fSmOBkS+6BCo2I1wQ/RlLyhh+9jrC/ySnD/6Gsd7g==", + "requires": { + "@aws-sdk/eventstream-marshaller": "3.29.0", + "@aws-sdk/eventstream-serde-universal": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.29.0.tgz", + "integrity": "sha512-q286hf5EJXcJy6NKeAvPReajGsqELRlV48Wz2Q6hG3n2FTRYO6JQC4pi/YrabnK+oeLZ3UZFye4Ph8BTL5/xnw==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/eventstream-serde-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.29.0.tgz", + "integrity": "sha512-859ZHD2FyBSEV4RpYl562i/ddcxNAHcrEsKJE430MNiNuiG324/RE/vIIOb5rleHZI+a62yfU1b/BjUrgVc6IQ==", + "requires": { + "@aws-sdk/eventstream-marshaller": "3.29.0", + "@aws-sdk/eventstream-serde-universal": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/eventstream-serde-universal": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.29.0.tgz", + "integrity": "sha512-GOXf5s1mKf0aCtl+Um4kDDPrwZa1A9jx7vZ/cHSCc3mb/W/Nqn/CP0mMw4r3YCOkHLdil4TqoQ70/1/kHsq9YQ==", + "requires": { + "@aws-sdk/eventstream-marshaller": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.29.0.tgz", + "integrity": "sha512-rx+YlHFYzgGsCZMEvJBUdRsqfMGW4RY6J3USQvz63a32jVlMC3Kw9xINaXGhCEmOlUlzdeeIMQOZW5VxavLnjQ==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-base64-browser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/hash-blob-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.29.0.tgz", + "integrity": "sha512-8nD1A0w7aPQ0Mzij7+X95GwapMm2MfrN6bLa1iCn5PNdQ5Zn+tK70NUL/s9X6KaEQi3Lh7S0xGN9paEZ5o4+sg==", + "requires": { + "@aws-sdk/chunked-blob-reader": "3.29.0", + "@aws-sdk/chunked-blob-reader-native": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/hash-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.29.0.tgz", + "integrity": "sha512-iANkXAGNgUSX17GjyTdrFRE357AmAgnIsuyKhuaK8vi4SPPxHYCyXOdxtUx5TjkzW4bUym3cRJS8zeirayTEHA==", + "requires": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/hash-stream-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.29.0.tgz", + "integrity": "sha512-2ha+yzpJCoR23NoCfP/9OMBF5jgg76xAQo14/ItRWLnn0np7eRTGM+OFnNuAfvDRbzM4UcJoGDbUreAhaoSOBQ==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.29.0.tgz", + "integrity": "sha512-0TyZZbPs5SWCF2tT1DXccK5SUx7/bDJCVojgBuW3QRJn9ta3US/u5l7w8k6jwWFU3CQhLAWuG0TD7FhATiM2HQ==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.29.0.tgz", + "integrity": "sha512-QqIhHGp2qTfDlW7uNh/T4kcyAU2TfxHA29cppQusuTJjploAXXMzvBdmxjFH1ZvPbKs0Rd7owQ0YnC9Lnq+Nzg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/md5-js": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.29.0.tgz", + "integrity": "sha512-6wsT7zM9qEIbf+FI1QzKXG1o1z91u3zF6tPiXtdopVOs2m2I0emG2c1cEzqFwqB4HhiaR6PejBhn/tDxfc7oNw==", + "requires": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-utf8-browser": "3.29.0", + "@aws-sdk/util-utf8-node": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-apply-body-checksum": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-apply-body-checksum/-/middleware-apply-body-checksum-3.29.0.tgz", + "integrity": "sha512-csHiQKvxSJWxQx7lbla3Wgs+lWuNQ/DEFid5SxBZBhsqKz5FPBJr6kMPWIopmIL/vCxrYhMaS4ARloQBUkLoyQ==", + "requires": { + "@aws-sdk/is-array-buffer": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-bucket-endpoint": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.30.0.tgz", + "integrity": "sha512-WlPeUGEhuuTKtpRH6pDgBjX7uoAXaCv4FatK06R6tRBp7oSFiq3az0AUrNE5u45BOT6sj7Yl7C96WLcvHfG4gA==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-arn-parser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.29.0.tgz", + "integrity": "sha512-g+tOOXQXqKG84XwFrJexZa2iTuYJce9jnjHV4vyfXwVuKrwuf+ZFguPZ4hzEd40vDo5aLM49JtF/OcO4plCneg==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-expect-continue": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.29.0.tgz", + "integrity": "sha512-5SzOhxF1rO2ajlMkLYklTD9XnAcsDxKfAyRZeHCH5pYVdskjWphpJ61IS+/rWv+1L0qDsxYum7Ig50R853c4Cw==", + "requires": { + "@aws-sdk/middleware-header-default": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-header-default": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.29.0.tgz", + "integrity": "sha512-DoTQvcmqhgTcPdkJi1+To/esmURd0HGaP3oUoIYxnoWK+hC1zJmq9hb+0oi1wdXX79l5iz2DkjH3sm547rJIuQ==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.29.0.tgz", + "integrity": "sha512-aBifr86Owrhvy29cvZD17JzdoTtKMxzdjCkMA7ckNP+9Lg7kLI/6ws1yZ6BJlmcOnKxtNSnkvunGmJy8BU8EWQ==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-location-constraint": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.29.0.tgz", + "integrity": "sha512-c7aOFU7AEzLXTIen5VIBm45KrRHLVuHewIpotwApFFSpLjxroPogsT0MSFyGDR9cHLl5QCiJ777Zu6L2x6819A==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.29.0.tgz", + "integrity": "sha512-0rLvuTvfaMWNb7+FApXAH0111FEp/AfG3fO7QkyVrXmHlTrNIJozilhkd0FwEMcQqqM9UK5lPLXwloH9Rkp9vw==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.29.0.tgz", + "integrity": "sha512-yRQ48UIGPmK3/jWMJ2LC4trltFevMDEXyvtT6knwDnwXxmuwv7K6udk6TnGaUU5TlLVI1XdRQHaZY7xZH1KbGw==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/service-error-classification": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-s3": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.30.0.tgz", + "integrity": "sha512-ZyDz7reDqHYbYCftpsjmn7HpwQDSBSEb5PcXawF1/SnK2X4toTsWx0jZHmlYo7Xti/rE4Gfgx69dt/ACDO33BA==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-arn-parser": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.30.0.tgz", + "integrity": "sha512-TZQQ0LA/rjYNgV+DbU0KvyHZaNhihrWf4IeJeKoez1vpvQmU58G5zAm0+rVHbzazJaOQuHYKKdPttOPxl/JAAg==", + "requires": { + "@aws-sdk/middleware-signing": "3.30.0", + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.29.0.tgz", + "integrity": "sha512-jN6zuaXg3k9HiWJZjBROiVJEdFaZrMikhyVdqYTT3hR+i08M/9UgVuX84HP/dALChZazOn9MPhvPWGvxrMOr9A==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.30.0.tgz", + "integrity": "sha512-T/zGCijEGODmpbS/HlwnxT0Bn69FhZpBrVAjfofLUFzHteJ5Ab2q7AEt1dOdi3GrtTGStdwbfiZVeTxMKIjaTw==", + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-ssec": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.29.0.tgz", + "integrity": "sha512-XJC00iN3sqJ5ZH05VpP/bimRHfS1aWGs5/Vuz4swdyKGwez725ZBfof0lg6LSnP4G+me6ZqwsbUxHkdrupcWAA==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.29.0.tgz", + "integrity": "sha512-S6Jt108uxs/PEoLAgGow9SdMKWXhlg0EGgY77Z4pNPQDrBYoca2kwWeTsyTpgBXSsyV0z0WZB4TJK5/doGv6CA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.29.0.tgz", + "integrity": "sha512-AVbn9QEbqBgScaD3cxLv7/yi9Up10vYKy/AWIwgTrW0LxOuy9+Za2hdk5eZRP/QpqS/Ibz2/CqcmK1GQ/03kmg==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.29.0.tgz", + "integrity": "sha512-ANRnPz4IT4FiSAc+9p0HqGSjL+cdzB2E68BFmbbGin0fZwhflX1BksjuUEibw8Emf8jvhvbUxdtAIUWctTYxOA==", + "requires": { + "@aws-sdk/property-provider": "3.29.0", + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.29.0.tgz", + "integrity": "sha512-FnPdoK0hmEr2JO/g7MVE3oeC2TvMpoRDQqUnDrn9C1bzRzgzhHqGVyaiRmc1HECMKjPFYVn02NCzY4qx56K0Ag==", + "requires": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/property-provider": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.29.0.tgz", + "integrity": "sha512-N2fd3H4mGGE51PgmMbEzBGSNwcyPkEgMxgfZsrQUaFh+CE5uuelOAL70Yzr4IZ4yZJvf1F9e8drtCuUcHnSUEw==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.29.0.tgz", + "integrity": "sha512-OIeJ7ukfgGkaIL0/NNM5sxIlfxtOqQN+KoaQ89YeLBlJPVoKnptAw+eWjjLwxLs+r/SbyZHXbBawP+sbzq0mSQ==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.29.0.tgz", + "integrity": "sha512-htrHPmwGfWxl/Mt0JpR63NmlDtmwMJTjvLVrdbxBBXfjiyB8023lEFfyMSDHzD6fegQcw/rOwaliQNAuaVNnXQ==", + "requires": { + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.29.0.tgz", + "integrity": "sha512-v22PBXafAHw+wMaSGbq4B9wEsSYV2e0nZgGHZBNML3HPDiAYJqsQHiYEbiz8nzkmoayU0wrVFZ/XfKNXXcXGbw==", + "requires": { + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/s3-request-presigner": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.31.0.tgz", + "integrity": "sha512-z1/agTLOxEDtSX53UVXaj2Nvji/Mv3LBWrfLax2NGcpRAoPNqwxkKhkRsD0tuFVFwWRsJmcWdN5TkffZNqFAfg==", + "requires": { + "@aws-sdk/protocol-http": "3.29.0", + "@aws-sdk/signature-v4": "3.30.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-create-request": "3.31.0", + "@aws-sdk/util-format-url": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.29.0.tgz", + "integrity": "sha512-VqOjXXTLTGbifzg3Fg2g/Ac6W3uzC3llPZjm/b0goM17KLWMGU7JKiem2l+CFyN4sxkver7InNlIUJCJAPB6+Q==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.29.0.tgz", + "integrity": "sha512-x4Chk4+iMiYaxcomZjdg7IwU1mQhJ7iPl/3RrIqCShPIOZDwwH4vLl6Fw0bniOZiHK30JQ1wlAgLxzVP0JMHTw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.30.0.tgz", + "integrity": "sha512-uBvut8RrhXGunTDYuJMALlV8IaFHyZHPzadhrqx12QJT+LQevSB4CR2WXZknz0JZ4HcFvpaJqbiionLobwVEuQ==", + "requires": { + "@aws-sdk/is-array-buffer": "3.29.0", + "@aws-sdk/types": "3.29.0", + "@aws-sdk/util-hex-encoding": "3.29.0", + "@aws-sdk/util-uri-escape": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.31.0.tgz", + "integrity": "sha512-QZHOMM6npFyDEW8wrp8rLs+YGZIPRfuItlWHm6Upejp6a7s1ksb/1c44vNeqwnAeUJrdXfOX9QFkbh1+gZF21A==", + "requires": { + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/types": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.29.0.tgz", + "integrity": "sha512-8ilWQU5ZTdiRfblmmjl38+6JZKKM8EqA5Sbn8djgDLShCLeVJ2TsL2guzNi+WHcL7BHdv1pI/NNmTcgRUo6yOw==" + }, + "@aws-sdk/url-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.29.0.tgz", + "integrity": "sha512-385f+g4xeRym2S4bzF+Nc0MB8addAlCSb5hIUJu1JKH6FwFLrNRuixeaelGLyWr77xv25P0ruyXQAFf2ISxzKw==", + "requires": { + "@aws-sdk/querystring-parser": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-arn-parser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.29.0.tgz", + "integrity": "sha512-NK4xAU7EGp0H4oYIICAJL49BzGvezkWD6rQdfJpXrPoqXviXXDq0nmFEoP9k4PsT+mDBEFiuvXhQlrHhBPVx5g==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-base64-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.29.0.tgz", + "integrity": "sha512-yMgn5vZ7laVO/497iPDjTdmia3sDdFBDq6k42EZxVTpkUcd8JS2nWJ+9ePuIMwqOgPjhhkOOXiidrbZaUQ+L6Q==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-base64-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.29.0.tgz", + "integrity": "sha512-4pRwjQ6+yS7SQm+yK3pchrsmGPEuoR2YiNsBG0LVNecQmnxWUbOhaEWIxXKTnAzs9bAt7AWEbLzsW8/cN/yTNw==", + "requires": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.29.0.tgz", + "integrity": "sha512-cKSwlDlZkcxuhSdoiq1TxleaBvveEgKA2Yo4TYP4DKVPHZuYZtbFv8r1driml1SaIKXg4GQpe+pJit3mxDRxAg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.29.0.tgz", + "integrity": "sha512-8rG65GMpsjVFd9jhx5y/dhwbJVIKq0OqwNRK+GoIVDo0KKaGtjNbCVHYYDjpwIuksZumiqvlC0E3AUcXn7p1rQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.29.0.tgz", + "integrity": "sha512-4ODxK5y/yONgsuc9SAzZ0j/v0IQkJVCRApziF4Q8NiZ1z9050nZ08rgTEhrTbWgLmDju4SDvJhn/nUNTrsLhug==", + "requires": { + "@aws-sdk/is-array-buffer": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-create-request": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.31.0.tgz", + "integrity": "sha512-AioF03qE5dKC/yCrCPhlUgG5WyyF76AavVI3knCJRTiDI/u7tJWZ7zrA2wl4me4Ylq7Z0cuZc7crdPJHNFlyVg==", + "requires": { + "@aws-sdk/middleware-stack": "3.29.0", + "@aws-sdk/smithy-client": "3.31.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-credentials": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.29.0.tgz", + "integrity": "sha512-xCWQizP5d6SwbwB2HmxpDqu0WYY7/E7pNrZ+7tSMrJxZlT8Zsd+lFaO23JVFMEBqjjBnpLBr+XkNZgOpD1BYwA==", + "requires": { + "@aws-sdk/shared-ini-file-loader": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-format-url": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.29.0.tgz", + "integrity": "sha512-RrCSVlfWRuDB7oVtECqSgwrMK69z75Ettq9niaCz2CAVnJlvWTnknybX+M/l1TDBKeLKM3C7k6jFv+J+twByFg==", + "requires": { + "@aws-sdk/querystring-builder": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.29.0.tgz", + "integrity": "sha512-YZ9fhJ2HKnnPL+8M9/YMFo4906Cvh1NaVOZT61joPM5Vv1rSYXdD1/tvn2qNjVhAJAGFWdBsIqZWw43km5DNpw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.29.0.tgz", + "integrity": "sha512-gvcbl9UdTOvuCCzgbtTTsKnL1l/cnT/CFl0f6ZCQ6qubUTRCuL/aK8DvgWa1n9p/ddCiVKPLmHu/L1xtX4gc0A==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.29.0.tgz", + "integrity": "sha512-js834TiNTdwIZOxmGSCPiLETUoc2JslY07D6A+yLNI/kZmmTHa0tKCyPxMqo7LBb+iU9ymky2LLJuDGp6aZNHw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.29.0.tgz", + "integrity": "sha512-se9WLQS3H36u8FUA3/DfnzH3LU77QBRpJN4FmQtcQHR3A5mR2tRty+eOrvIf2R4QtveMWXrQbvScTrca7ZFZug==", + "requires": { + "@aws-sdk/types": "3.29.0", + "bowser": "^2.11.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.29.0.tgz", + "integrity": "sha512-atyjuDnD1WtIR1sZzcCJcD0JyYKGZ6bYqAhh/apaiPs0LoTyaFGYN8K7wSr3gL8PqD9YYNKfiNiPU3AbY6pW5A==", + "requires": { + "@aws-sdk/node-config-provider": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.29.0.tgz", + "integrity": "sha512-ZIHbBYByMq5vadQ1SZOQTHVtrkGAFiuypATYF5ST8YB3j7XKvflv+fiBX2xQ8xpqb28noEg6dNPnvqkQQ1n/aw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.29.0.tgz", + "integrity": "sha512-CIZPDnSvtfv7MeHM/hA1fHXcXJR2f7ULjw4nXsX/BLaKGKf/O6IhOXPt1ecUIpGeUrCgPCqxkDjmThUCa87Bcg==", + "requires": { + "@aws-sdk/util-buffer-from": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-waiter": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.29.0.tgz", + "integrity": "sha512-9qNsX+yRpX8xE0eW9qHZCy7W6+MFkYFR10umSPVl9gc5p+RViQwS0D2wVYmQblrqGK6VpK+wAb3faFf6KaDesg==", + "requires": { + "@aws-sdk/abort-controller": "3.29.0", + "@aws-sdk/types": "3.29.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/xml-builder": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.29.0.tgz", + "integrity": "sha512-lixmZNupjRsfAxCZh3CshqWSxKJEAPcuPiKhUlW9DhfoIc+YTD9U5G2fzY9LBd7ugDo4N7H5sU3Oa1iYLp2ZDg==", + "requires": { + "tslib": "^2.3.0" + } + }, "@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -14565,6 +16583,11 @@ "type-is": "~1.6.17" } }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -15506,6 +17529,11 @@ "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, "es-abstract": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", @@ -16154,6 +18182,11 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-xml-parser": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", + "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" + }, "fastq": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", diff --git a/package.json b/package.json index dbec35c..1cb1c29 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "author": "", "license": "ISC", "dependencies": { + "@aws-sdk/client-s3": "^3.31.0", + "@aws-sdk/s3-request-presigner": "^3.31.0", "apollo-datasource": "^3.1.0", "apollo-datasource-rest": "^3.2.0", "apollo-server": "^3.3.0", diff --git a/src/config.ts b/src/config.ts index 5a2d562..ea07084 100644 --- a/src/config.ts +++ b/src/config.ts @@ -17,3 +17,13 @@ export const dbConfig = { }, ], }; + +export const uploadBucket = + process.env.ENVIRONMENT_NAME === 'production' + ? 'photowall-inquiries-dev' + : 'photowall-inquiries-dev'; + +export const imageBucket = + process.env.ENVIRONMENT_NAME === 'production' + ? 'photowall-images' + : 'photowall-images-dev'; diff --git a/src/datasources/interior-api.ts b/src/datasources/interior-api.ts index b6b313d..d5c0f6a 100644 --- a/src/datasources/interior-api.ts +++ b/src/datasources/interior-api.ts @@ -4,10 +4,11 @@ import { InteriorType, } from '../types/interior-types'; import { Orientation } from '../types/product-types'; -import { Maybe } from '../types/types'; +import { IdNumberResult, Maybe } from '../types/types'; import { BaseSQLDataSource } from './BaseSQLDataSource'; import { ImageServerApi } from './imageserver-api'; -import { convertToPossibleType } from './utils'; +import * as CONFIG from '../config'; +import { moveS3File } from '../s3'; const MINUTE = 60; @@ -120,4 +121,35 @@ export class InteriorAPI extends BaseSQLDataSource { }); }); } + + // Mutations + async addOwnUploadToPrintId( + printId: number, + uploadedS3Key: string, + ): Promise { + // Get the last position entered in interiors for this printId + const positionRes: any = await this.knex + .queryBuilder() + .from('interiors') + .where({ print_id: printId }) + .max('position') + .first(); + const position = positionRes.max === null ? 0 : positionRes.max + 1; + + // Insert the printId in interiors returning the id (important as it is used as image key name) + const res = await this.knex('interiors') + .insert({ print_id: printId, position: position }) + .returning('id'); + const interiorId = res[0]; + // Move file + moveS3File( + CONFIG.uploadBucket, + uploadedS3Key, + CONFIG.imageBucket, + `interior-images/${interiorId}.jpg`, + ); + return { + id: interiorId, + }; + } } diff --git a/src/resolvers/file-upload-resolvers.ts b/src/resolvers/file-upload-resolvers.ts new file mode 100644 index 0000000..fc05081 --- /dev/null +++ b/src/resolvers/file-upload-resolvers.ts @@ -0,0 +1,31 @@ +import { EXPIRES_DEFAULT_SECS, getSignedPutObjectUrl } from '../s3'; +import { + SignedUploadURL, + SignedUploadURLInput, +} from '../types/file-upload-types'; +import * as CONFIG from '../config'; + +async function getSignedFileUploadURL( + _, + args: SignedUploadURLInput, + __, +): Promise { + const config = args.config; + const bucket = CONFIG.uploadBucket; + + const url = await getSignedPutObjectUrl( + bucket, + config.key, + config.contentType, + ); + return { + url: url, + key: config.key, + bucket: bucket, + expires: EXPIRES_DEFAULT_SECS, + }; +} + +export const imagesQueryTypeDefs = { + signedFileUploadURL: getSignedFileUploadURL, +}; diff --git a/src/resolvers/index.ts b/src/resolvers/index.ts index 11a96e5..d719420 100644 --- a/src/resolvers/index.ts +++ b/src/resolvers/index.ts @@ -18,6 +18,7 @@ import { import { DateTimeResolver, DateResolver, JSONResolver } from 'graphql-scalars'; import { interiorsQueryTypeDefs, interiorTypeDefs } from './interiors-resolver'; +import { imagesQueryTypeDefs } from './file-upload-resolvers'; const resolvers = { Query: { ...orderQueryTypeDefs, @@ -27,6 +28,7 @@ const resolvers = { ...keywordsQueryTypeDefs, ...marketsQueryTypeDefs, ...interiorsQueryTypeDefs, + ...imagesQueryTypeDefs, }, Mutation: { ...productMutationTypeDefs, diff --git a/src/resolvers/products-resolver.ts b/src/resolvers/products-resolver.ts index 781db77..cea9831 100644 --- a/src/resolvers/products-resolver.ts +++ b/src/resolvers/products-resolver.ts @@ -4,6 +4,7 @@ import { ProductListResult, ProductsFilterInput, } from '../types/product-types'; +import * as CONFIG from '../config'; import { CategoryAPI } from '../datasources/category-api'; import { Category } from '../types/category-types'; import { KeywordAPI } from '../datasources/keyword-api'; @@ -11,6 +12,7 @@ import { Keyword } from '../types/keyword-types'; import { MarketLocaleAPI } from '../datasources/market-locale-api'; import { InteriorAPI } from '../datasources/interior-api'; import { InteriorsLambdaAPI } from '../datasources/interiors-lambda-api'; +import { IdNumberResult } from '../types/types'; const ProductBlacklist = { async market(parent, _args, { dataSources }) { @@ -127,6 +129,16 @@ export const productMutationTypeDefs = { ); return (dataSources.productApi).getProduct(productId); }, + async addOwnInteriorToPrintProduct( + _, + { printId, uploadedS3Key }, + { dataSources }, + ): Promise { + return (dataSources.interiorApi).addOwnUploadToPrintId( + printId, + uploadedS3Key, + ); + }, async productWallpaperType( _, { productId, wallpaperTypes }, diff --git a/src/s3.ts b/src/s3.ts new file mode 100644 index 0000000..f7438af --- /dev/null +++ b/src/s3.ts @@ -0,0 +1,48 @@ +import { + S3Client, + CopyObjectCommand, + DeleteObjectCommand, + PutObjectCommand, +} from '@aws-sdk/client-s3'; +import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +export const EXPIRES_DEFAULT_SECS = 300; + +export const getSignedPutObjectUrl = ( + bucket: string, + key: string, + contentType: string, +): Promise => { + const s3 = new S3Client({ region: 'eu-west-1' }); + + return getSignedUrl( + s3, + new PutObjectCommand({ + Bucket: bucket, + Key: key, + ContentType: contentType, + }), + { expiresIn: EXPIRES_DEFAULT_SECS }, + ); +}; + +export const moveS3File = async ( + fromBucket: string, + fromKey: string, + toBucket: string, + toKey: string, +): Promise => { + const s3 = new S3Client({ region: 'eu-west-1' }); + + const copyCmd = new CopyObjectCommand({ + Bucket: toBucket, + CopySource: `${fromBucket}/${fromKey}`, + Key: toKey, + }); + await s3.send(copyCmd); + + const deleteCmd = new DeleteObjectCommand({ + Bucket: fromBucket, + Key: fromKey, + }); + return s3.send(deleteCmd); +}; diff --git a/src/schema.graphql b/src/schema.graphql index 5f36b2e..c69f9eb 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -5,6 +5,17 @@ scalar DateTime scalar Date scalar JSON +enum CacheControlScope { + PUBLIC + PRIVATE +} + +directive @cacheControl( + maxAge: Int + scope: CacheControlScope + inheritMaxAge: Boolean +) on FIELD_DEFINITION | OBJECT | INTERFACE | UNION + type Query { orders(pagination: PaginationInput!, filter: DateFilterInput!): OrdersResult order(id: ID!): Order @@ -24,6 +35,13 @@ type Query { locales: [Locale] locale(value: String!): Locale interiors(filter: InteriorsFilterInput): [Interior] + signedFileUploadURL(config: SignedUploadURLInput): SignedUploadURL + @cacheControl(maxAge: 0) +} + +input SignedUploadURLInput { + contentType: String! + key: String! } input PaginationInput { @@ -68,6 +86,13 @@ input InteriorsFilterInput { productId: Int! } +type SignedUploadURL { + url: String! + key: String! + bucket: String! + expires: Int! +} + type Market { id: ID! name: String! @@ -394,6 +419,10 @@ input ProductBlacklistingInput { groupIds: [Int] } +type IdNumberResult { + id: Int! +} + type Mutation { productInfo(productId: Int!, info: ProductInfoInput!): Product productFocusPoint( @@ -407,6 +436,10 @@ type Mutation { ): Product productGroup(productId: Int!, groupIds: [Int]): Product productKeywords(productId: Int!, keywordIds: [Int]): Product + addOwnInteriorToPrintProduct( + printId: Int! + uploadedS3Key: String! + ): IdNumberResult productWallpaperType( productId: Int! wallpaperTypes: [ProductWallpaperType]! diff --git a/src/types/file-upload-types.ts b/src/types/file-upload-types.ts new file mode 100644 index 0000000..1d12f12 --- /dev/null +++ b/src/types/file-upload-types.ts @@ -0,0 +1,15 @@ +export interface SignedUploadURLInput { + config: SignedUploadURLInputConfig; +} + +export interface SignedUploadURLInputConfig { + contentType: string; + key: string; +} + +export interface SignedUploadURL { + url: string; + key: string; + bucket: string; + expires: number; +} diff --git a/src/types/types.ts b/src/types/types.ts index c662426..9089adc 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -24,3 +24,7 @@ export interface PaginationResult { offset: number; limit: number; } + +export interface IdNumberResult { + id: number; +}